Вычисления в выражениях

В выражениях можно выполнять два типа вычислений:

  • вычисление значения
  • вычисление условия

Вычисление значения

Вычисление значения используется с целью получить какое-то значение, на основе входных данных выражения.

Результатом вычислений может являться:

  • число (целое или дробное)
  • строка
  • дата
  • булево значение

Поля выражения, для подстановки формул вычисляющих значение, называются Формула

Вычисление условия

Вычисление условия обычно используется с целью выбора одного варианта из нескольких. Например по какой ветке выражения должен идти алгоритм. Или по какой формуле нужно вычислить какое-то значение.

Результатом вычисления условия всегда является булево значение - истина или ложь. В остальных случаях результат будет неявно приводиться к этим значениям. Например если в формуле условия выполняются арифметические операции, то в случае если полученное значение будет 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) - Возраст в днях