Использование макросов
Ячейка типа макрос содержит в себе автоматически вычисляемое значение. В платформе существуют встроенные макросы, которые реализуют самые необходимые функции и не требуют программирования. Для более сложных пользовательских подстановок используется обработчик макрос.
Для задания макроса нужной ячейке необходимо выделить эту ячейку и в инспекторе объектов на закладке Данные, либо в диалоге редактирования параметров ячейки на закладке Данные установите ячейке тип макрос в поле Тип.
В поле Макрос устанавливается тип самого макроса. Все типы в выпадающем списке поля Макрос кроме типа Специальный являются встроенными макросами. Макрос типа Специальный используется для создания сложных пользовательских макросов с программированием на внутреннем языке, остальные типы макросов можно настроить через Редактор форм, не прибегая к программированию.
Поле Только для страниц отвечает за вычисление макроса лишь в том случае, когда информация о страницах доступна. Как правило, значение этому полю задается, когда используют макрос типа Специальный.
Поле Маска вывода задает текстовую строку, которая будет отображаться в комбинации с вычисленным значением подстановки. Место подстановки вычисленного значения в маску определяется символом #. При необходимости преобразования вычисленного значения подстановки в маске после символа # указывается в фигурных скобках строка представления формата, в котором требуется выводить значение макроса. К примеру, при подстановке значения даты в маску вида "ДАТА: #{D(dd.mm.yy;/)}" будет сформирована строка "ДАТА: 30/05/17". Также возможно указание имени настраиваемого формата, например, "#{@Цена}".
В поле Параметры указываются аргументы для макросов суммы, произведения, частного и разности. В общем случае аргументы операций, производимых макросами, указываются в виде списка адресов, по которому можно получить одно или множество значений.
При арифметических вычислениях учитываются только ячейки типа "вещественное число", "целое число" и "макрос". При вычислении макроса по диапазону ячеек (например, по текущему столбцу или строке) значение данной ячейки типа "макрос" игнорируется, но другие макросы вычисляются. Если диапазоны нескольких ячеек типа "макрос" перекрываются, то возникает ошибка "бесконечная рекурсия".
Общий вид списка
(адрес1; адрес2; … ; адресN)
В качестве адреса обычно используются идентификаторы ячеек, столбцов или строк.
Для макросов «разность» и «частное» список должен включать строго 2 адреса, а каждый адрес соответствовать единственному значению.
Для макросов «сумма» и «произведение» список может содержать произвольное количество адресов, а каждый адрес соответствовать одному или нескольким значениям. Если одна и та же ячейка указана несколько раз (например, диапазоном по строке и диапазоном по столбцу), то ее значение учитывается лишь единожды. Также для таких макросов может указываться одиночный адрес без круглых скобок. Причем одиночный идентификатор по умолчанию полагается идентификатором столбца, а не ячейки.
Синтаксис адреса
Адрес может определять ячейку, столбец, строку или раздел, а также множество ячеек, столбцов или строк. Есть два способа задания адреса: по строковому идентификатору и по позициям. Для раздела в качестве строкового идентификатора выступает имя.
Позиции могут задаваться в виде координат в пределах раздела, относительных координат от ячейки макроса (только для ее раздела), а также диапазонов координат. При задании диапазонов координат могут использоваться как абсолютные, так и относительные координаты для каждого конца диапазона.
Синтаксис с использованием идентификатора:
[<символ-маркер>][<название раздела>:] <идентификатор>[ [<индекс1> [, <индекс2> ]] ] [@<имя доп. значения>]
Синтаксис с использованием координат:
[<символ-маркер>][<название раздела>:] [ <координаты1> [, <координаты2> ] ] [@<имя доп. значения>]
Символ-маркер обозначает к какой сущности относится идентификатор:
- $ - к разделу (т. е. имя раздела)
- ! - к столбцу (может не указываться в одиночном адресе, столбец по умолчанию)
- % - к строке
- # - к ячейке (может не указываться в списке, ячейки по умолчанию)
Перед идентификатором опционально может указываться имя раздела и двоеточие. Если имя раздела не указано, то подразумевается тот раздел, где находится ячейка-макрос.
Для одно- и двумерных идентификаторов указываются значения индексов в квадратных скобках. Вместо значения индекса может указываться *, тогда участвуют все значения, для которых заданы какие-то индексы.
При указании координат столбцов и строк используется только элемент <координаты1>, который соответствует X- или Y-координате соответственно. Для ячеек используются обязательно оба элемента <координаты1> для X-координат и <координаты2> для Y-координат.
Варианты синтаксиса элемента координатыN:
*
<значение>
<начало диапазона>:<конец диапазона>
Первый вариант определяет все существующие значения координаты. Например, для Y-координаты: от 1 до количества строк в разделе.
Второй вариант задает одиночную абсолютную или относительную координату. Признаком относительной координаты является указание знака + или - перед числом, например +2 или -1. 0, +0 или -0 всегда является относительной координатой, соответствующей ячейке макроса. Абсолютные координаты задаются положительным числом от 1.
Третий вариант определяет диапазон координат, значения начала и конца которого задаются аналогично, второму варианту. Начальное и конечное значения входят в диапазон включительно. Также в качестве начала или конца диапазона может указываться *. При указании * в начале диапазона, это аналогично указанию значения 1 – минимальной границы диапазона. При указании * в конце диапазона, это соответствует количеству столбцов или строк. Абсолютные, относительные координаты и * могут произвольно смешиваться при задании диапазона.
Поддерживается специальный синтаксис для задания координаты относительно верхней границы диапазона (количества столбцов или строк): "*-<значение>". Здесь может использоваться только знак минус. Например, "#[1, 3:*-2]" – ячейки в столбце 1 от 3-ей строки до <количество строк>-2. Данный способ задания координаты не зависит от расположения текущей ячейки-макроса, т.е. может рассматриваться как абсолютная координата и применяться для задания конца диапазона в другом разделе.
Относительные координаты могут использоваться только для раздела, содержащего текущую ячейку типа "макрос". Вычисление координат происходит добавлением указанной величины относительной координаты к соответствующей координате текущей ячейки-макроса. Например, для ячейки-макроса с координатами X = 5 и Y = 7 адрес "#[0, *:-1]" даст ячейки столбца X = 5 и Y от 1 до 6. Для задания ячейки, располагающейся по диагонали правее и ниже ячейки макроса, можно задать следующий адрес: "#[+1,+1]". Плюс здесь обязателен и является маркером относительной координаты. Адрес "#[1,1]" имеет другой смысл – абсолютные координаты самой левой верхней ячейки в текущем разделе.
Абсолютные и относительные координаты, заданные в адресах, могут потерять актуальность при вставке или удалении строк и столбцов в данном разделе. Поэтому использование небольших значений относительных координат предпочтительнее указания абсолютных. В этом случае, потеря актуальности произойдет только при изменении близкой окрестности ячейки-макроса. Также для задания всего диапазона координат или конца диапазона предпочтительнее использование * вместо явного указания количества строк или столбцов, которое может измениться.
Если нужно не значение ячейки, доп. значение, то после идентификатора указывается имя доп. значения через символ @. Для разделов, строк и столбцов значения могут извлекаться только из доп. значений.
Для вычисления суммы или произведения по текущему столбцу в поле Параметры в качестве аргумента ничего не указывается, что равноценно пустой строке.
Примеры использования поля парам для макросов "сумма"/"произведение"
- "столбец" - сумма по столбцу со строковым идентификатором "столбец" в текущем разделе
- "%Раздел1:строка" - сумма по строке со строковым идентификатором "строка" в другом разделе относительно ячейки-макрос
- "(яч[*])" или "#яч[*]" - сумма по ячейкам со строковыми одномерными идентификаторам "яч" в текущем разделе
- "(%строка[*]@д_знач)" - сумма дополнительных значений с именем "д_знач" по строкам со строковыми одномерными идентификаторами "строка" в текущем разделе
- "([0,-1];[-1,0])" - сумма двух ячеек слева и сверху от ячейки-макроса
- "#[0,*:-2]" - сумма по ячейкам в столбце ячейки-макроса (0) от первой строки (*) и пропуская одну ячейку (-2) над ячейкой-макросом
- "%[0]" - сумма по ячейкам строки, содержащей ячейку-макрос
- "#Таблица:[7,3:*]" - сумма по абсолютным координатам ячеек в разделе "Таблица" по столбцу X = 7, пропуская первые две строки (начиная с 3-ей и до конца).
- "#Таблица:[1,2:*-1]" - сумма по абсолютным координатам ячеек в разделе "Таблица" по столбцу X = 1, пропуская первую и последнюю строку.
У ячеек-макросов "сумма" и "произведение" отличается поведение в зависимости от их расположения на форме. Если такой макрос расположен в обычной ячейке, то при печати и предварительном просмотре вычисление значения происходит по всему диапазону строк раздела, а если ячейка-макрос расположена в шапке раздела, то расчет значения происходит по диапазону строк, которые располагаются на странице.
При вводе в поле Параметры строки аргументов с ошибками в синтаксисе, на экране появляется сообщение-предупреждение об ошибке.