Вычисления в выражениях
В выражениях можно выполнять два типа вычислений:
- вычисление значения
- вычисление условия
Вычисление значения
Вычисление значения используется с целью получить какое-то значение, на основе входных данных выражения.
Результатом вычислений может являться:
- число (целое или дробное)
- строка
- дата
- булево значение
Поля выражения, для подстановки формул вычисляющих значение, называются Формула
Вычисление условия
Вычисление условия обычно используется с целью выбора одного варианта из нескольких. Например по какой ветке выражения должен идти алгоритм. Или по какой формуле нужно вычислить какое-то значение.
Результатом вычисления условия всегда является булево значение - истина или ложь. В остальных случаях результат будет неявно приводиться к этим значениям. Например если в формуле условия выполняются арифметические операции, то в случае если полученное значение будет 0, результатом будет логическая “ложь”. Для остальных чисел результат будет логическая “истина”
Поля выражения, для подстановки формул вычисляющих условия, называются Условие.
Формулы
Работа с формулами не отличается для вычисления значений и условий. Разница только в обработке результата. При вычислении условий результат всегда будет приводиться к булевому значению.
Формула представляет из себя последовательность:
- аргументов
- операторов
- функций
- символов приоритетов операторов
Аргументами могут быть:
- Числовые значения (целые и дробные)
- Строковые значения
- Булевы значения
- Даты
Аргумент может быть задан непосредственно в формуле, а может быть подставлен из внешнего источника. Такие аргументы имеют числовой индекс и начинаются с символа $ (например $5). Подробнее работа с ними будет описана далее.
Операторы подразделяются в зависимости от типов аргументов на:
- арифметические операторы
- операторы сравнения
- логические операторы
- строковые операторы
Функции выполняют вычисления над входными аргументами и имеют вид - funcName($1, $2). Т.е. название функции и ее аргументы. Количество аргументов специфично для каждой функции.
Для указания приоритета операторов используются круглые скобки - ( ). В точном соответствии с их математическим использованием.
Для повышения читаемости в формулах допустимо использовать пробелы между операторами (они игнорируются компилятором). В числовых значениях для разделения разрядов пробелы недопустимы.
Примеры формул:
($1-5)*3+$2
($1==6) or ($2==$3)
$1 + round(($2*5)/100)
Аргументы формул
Аргументы представляющие целые числа задаются обычным числом, отрицательные числа указываются со знаком минус, например:
5 10 -50 100500
Без предшествующих нулей и разделителя разрядов.
В аргументах - дробных числах, разряды после запятой отделяются точкой:
5.25 10.1 -50.2222 100.500
Строковые аргументы задаются в одинарных кавычках:
'Газопылевое облако'
Аргументы, значения которых загружаются из внешнего источника задаются в виде индекса аргумента с символом $:
$1 $15 $25
Привязка аргументов
Аргументы, значения которых подгружаются из внешних источников должны быть привязаны к выражению. Привязка выполняется в блоке Аргументы
В качестве источника необходимо выбрать сущность и ее поле (разные поля сущностей могут содержать разные данные). Далее необходимо добавить объект.
После добавления объект получит порядковый индекс (на рисунке $1). Именно он должен использовать в формуле в качестве аргумента.
В случае если привязанная сущность не встретится в алгоритме, при вычислении выражения возникнет ошибка.
Если такая ситуация (отсутствие сущности в алгоритме) является корректной и необходимо чтобы выражение вычислялось без нее, нужно указать значение в поле По умолчанию. Которое будет использовано для вычисления, если не удалось получить значение из самой сущности.
Выражения - Переменные
Переменные - это особый тип выражений, которые хранят в себе предыдущее вычисленное значение. В формуле доступ к предыдущему значению можно получить через аргумент со специальным именем - $self.
Например, можно организовать счетчик увеличивая предыдущее значение на 1, следующим образом:
$self + 1
Арифметические операторы
Оператор | Название | Результат |
---|---|---|
-$1 | Отрицание | Смена знака для $1. |
$1 + $2 | Сложение | Сумма $1 и $2. |
$1 - $2 | Разность | Разность $1 и $2. |
$1 * $2 | Умножение | Произведение $1 и $2. |
$1 / $2 | Деление | Частное от деления $1 на $2. |
$1 % $2 | Деление по модулю | Целочисленный остаток от деления $1 на $2. |
Операторы сравнения
Оператор | Название | Результат |
---|---|---|
$1 == $2 | Равно | Возвращается true, если значение $1 равно значению $2 |
$1 != $2 | Не равно | Возвращается true, если значение $1 не равно значению $2. |
$1 < $2 | Меньше | Возвращается true, если значение $1 меньше значения $2. |
$1 > $2 | Больше | Возвращается true, если значение $1 больше значения $2. |
$1 <= $2 | Меньше или равно | Возвращается true, если значение $1 меньше или равно значению $2. |
$1 >= $2 | Больше или равно | Возвращается true, если значение $1 больше или равно значению $2. |
Логические операторы
Оператор | Название | Результат |
---|---|---|
$1 and $2 | И | Возвращается true, если и $1, и $2 true. |
$1 or $2 | Или | Возвращается true, если или $1, или $2 true. |
$1 xor $2 | Исключающее или | Возвращается true, если $1, или $2 true, но не оба. |
! $1 | Отрицание | Возвращается true, если $1 не true. |
Строковые операторы
Оператор | Название | Результат |
---|---|---|
$1 . $2 | Конкатенация | Оператор точка ‘.’ Возвращается объединение строк $1 и $2. |
Математические функции
Входные аргументы данных функций должны иметь числовое значение - целое или дробное. При попытке передать аргумент другого типа, будет выполнено неявное преобразования его к числу, которое скорее всего в результате даст 0.
Функция | Аргументы | Описание |
---|---|---|
abs($1) | $1 - значение для вычисления | Возвращает абсолютную величину (модуль числа) |
Округление | ||
ceil($1) | $1 - значение для округления | Округляет дробное число в бо́льшую сторону |
floor($1) | $1 - значение для округления | Округляет дробное число в меньшую сторону |
round($1, $2) | $1 - значение для округления $2 - (опционально) количество десятичных знаков |
Округляет число до заданного количества знаков после запятой |
Сравнение | ||
max($1, $2) | $1 - значение для сравнения $2 - значение для сравнения |
Возвращает наибольшее значение |
min($1, $2) | $1 - значение для сравнения $2 - значение для сравнения |
Находит наименьшее значение |
Возведение в степень | ||
sqrt($1) | $1 - значение для вычисления | Извлекает квадратный корень |
pow($1, $2) | $1 - основание $2 - показатель степени |
Возводит в степень |
exp($1) | $1 - степень для возведения | Вычисляет степень числа e |
log($1) | $1 - значение для вычисления | Вычисляет натуральный логарифм |
log10($1) | $1 - значение для вычисления | Вычисляет десятичный логарифм |
Тригонометрия | ||
pi() | - | Возвращает число Пи |
sin($1) | $1 - значение для вычисления | Вычисляет синус |
cos($1) | $1 - значение для вычисления | Вычисляет косинус |
tan($1) | $1 - значение для вычисления | Вычисляет тангенс |
acos($1) | $1 - значение для вычисления | Вычисляет арккосинус |
asin($1) | $1 - значение для вычисления | Вычисляет арксинус |
atan($1) | $1 - значение для вычисления | Вычисляет арктангенс |
Примеры формул
Арифметические выражения
$1 + 50
$1*2 + $2/100
$1 + ceil($2/100)
$1 + round($2*20/100)
Строковые выражения
'Поезд выехал из пункта '.$1.' и прибыл в пункт '.$2
Логические выражения
Используются для вычисления условий
$1==100
($1>100) and ($2<=90)
$1!=500
Логические выражения могут также использовать математические операции
(($1-$2)>=100) and (ceil($2)<80)
Работа с датами
Дата - отдельный тип значений аргументов формул и результатов выражений.
Дата представлена некоторым внутренним объектом. Работа в выражениях с ним происходит посредством вызовов специальных функций для работы с датами.
Входными аргументами для таких выражений должны быть также Объекты Даты, соответствующие поля есть например у Доп.Инфо, принимающих на входе дату.
Если выражение возвращает дату (в виде объекта), то при подстановке такого значения в документ, будут доступны функции форматирования даты.
Вспомогательным объектом при работе с датами является интервал.
Интервал - это тоже некоторый внутренний объект, представляющий интервал в днях, месяцах, годах. Используется при вычислениях над датой (например прибавить к текущей дате 3 года).
Функции для работы с датами
Функция | Аргументы | Описание |
---|---|---|
dateCurrent() | - | Возвращает текущую дату (объект) |
Вычисления с датами | ||
dateAdd($1, $2) | $1 - Дата (Объект) $2 - Интервал (Объект) |
Возвращает дату (объект) полученную путем добавления к $1 интервала $2 |
dateSub($1, $2) | $1 - Дата (Объект) $2 - Интервал (Объект) |
Возвращает дату (объект) полученную путем вычитания из $1 интервала $2 |
Создание интервалов | ||
intervalDays($1) | $1 - Количество дней | Возвращает интервал (объект) соответствующий количеству дней в $1 |
intervalMonths($1) | $1 - Количество месяцев | Возвращает интервал (объект) соответствующий количеству месяцев в $1 |
intervalYears($1) | $1 - Количество лет | Возвращает интервал (объект) соответствующий количеству лет в $1 |
Вычисления числовых значений на основе даты Результатом вычислений являются целые числа |
||
dateDiffDays($1, $2) | $1 - Дата (Объект) $2 - Дата (Объект) |
Возвращает количество дней между датой $1 и датой $2 |
daysInMonth($1) | $1 - Дата (Объект) | Возвращает количество дней в месяце, для даты $1 |
daysInYear($1) | $1 - Дата (Объект) | Возвращает количество дней в году, для даты $1 |
day($1) | $1 - Дата (Объект), опционально |
Возвращает число (день) месяца для указанной даты. Если дата не указана, используется текущая дата. |
month($1) | $1 - Дата (Объект), опционально |
Возвращает номер месяца для указанной даты. Если дата не указана, используется текущая дата. |
year($1) | $1 - Дата (Объект), опционально |
Возвращает год для указанной даты. Если дата не указана, используется текущая дата. |
age($1) | $1 - Дата рождения (Объект) | Возвращает количество полных лет для указанной даты рождения $1 |
ageMonths($1, $2) | $1 - Дата рождения (Объект) $2 - одно из: - ‘full’ - ‘year’ |
Возвращает количество полных месяцев для указанной даты рождения $1 Для ‘full’ возвращается полное количество месяцев. Для ‘year’ возвращается количество месяцев с начала текущего года. |
ageDays($1, $2) | $1 - Дата рождения (Объект) $2 - одно из: - ‘full’ - ‘year’ - ‘month’ |
Возвращает количество полных дней для указанной даты рождения $1. Для ‘full’ возвращается полное количество дней. Для ‘year’ возвращается количество дней с начала текущего года. Для ‘month’ возвращается количество дней с начала текущего месяца. |
ageWeeks($1, $2) | $1 - Дата рождения (Объект) $2 - одно из: - ‘full’ - ‘year’ - ‘month’ |
Возвращает количество полных дней для указанной даты рождения $1. Для ‘full’ возвращается полное количество недель. Для ‘year’ возвращается количество недель с начала текущего года. Для ‘month’ возвращается количество недель с начала текущего месяца. |
Проверки условий на основе дат Результатом вычислений является true или false (да или нет), в зависимости от того выполняется заданное условие или нет. |
||
isAcademicYear($1) | $1 - Дата (Объект) | Возвращает булево значение true или false, означающее попадает ли указанная в $1 дата в академический год (с 01.09 по 01.06) |
dateLess($1, $2, $3) | $1 - Проверямая дата (Объект) $2 - Дата для сравнения (Объект), опционально $3 - Учитывать равно (true или false), опционально |
Проверяет меньше ли дата $1 чем дата $2. Если в $3 передано true, проверяется условие меньше или равно (по умолчанию false). Если значение $2 не передано или передано null, сравнение происходит с текущей датой. |
dateGreater($1, $2, $3) | $1 - Проверямая дата (Объект) $2 - Дата для сравнения (Объект), опционально $3 - Учитывать равно (true или false), опционально |
Проверяет больше ли дата $1 чем дата $2. Если в $3 передано true, проверяется условие меньше или равно (по умолчанию false). Если значение $2 не передано или передано null, сравнение происходит с текущей датой. |
dateDaysPassed($1, $2) | $1 - Дата (Объект) $2 - Количество дней |
Проверяет прошло ли на текущий момент заданное в $2 количество дней от даты $1. |
dateSameDayOfMonth($1, $2, $3) | $1 - Проверямая дата (Объект) $2 - Исходная дата (Объект), опционально $3 - Смещение в днях, опционально |
Проверяет совпадает ли число (день месяца) даты $1 с числом даты $2, смещенным на количество дней $3. Если значение $3 не передано, проверяется без смещения. Если значение $2 не передано, сравнивается с текущей датой. |
Примеры формул с датами
dateCurrent() - Текущая дата
dateDiffDays($2, $1) - Количество дней между двумя датами
dateDiffDays(dateCurrent(), $1) - Количество дней до текущей даты
dateAdd($1, intervalDays(10)) - Добавить 10 дней к дате
dateAdd($1, intervalMonths($2)) - Добавить к дате $2 месяцев
dateAdd($1, intervalYears(5)) - Добавить к дате 5 лет
dateSub($1, intervalDays(10)) - Вычесть из даты 10 дней
daysInMonth($1) - Количество дней в месяце
ageDays($1) - Возраст в днях