Язык описания формул

Разнообразные формулы широко применяются при настройке системы. По существу, язык описания арифметических формул использует традиционный синтаксис описания таких формул, базирующийся на четырех арифметических операция (сложение, вычитание, умножение и деление), с возможностью использования нескольких дополнительных операций, а также функций.

Самый простейший пример формулы

5+8/2-4.5*2 Конечно, от такой формулы пользы не много, но она демонстрирует простоту и очевидность синтаксиса.

Чуть более сложный пример

5+8/2-pow(sqrt(9), 2) Здесь, в дополнение к арифметическим операциям, добавилось использование функций. Мы подробно рассмотрим ниже все функции. Касательно данного примере, скажем лишь, что здесь применяются популярные функции возведения в степень (pow) и извлечения квадратного корня (sqrt).

Кроме функций в выражениях могут быть использованы, так называемые, символы. Практически все символы зависят от контекста исполнения.

Общие операции, функции и символы

Операции

В формулах могут быть использованы следующие арифметические операции:

*
Операция умножения.
/
Операция деления.
%
Операция остатка от целочисленного деления.
+
Операция сложения.
-
Операция вычитания.

Кроме того, допускается использование операций сравнения:

>
Больше.
>=
Больше или равно.
<
Меньше.
<=
Меньше или равно.
=
Равно.
!=
Не равно.

Результат сравнения является числом. Если сравнение истинно, то его результат равен 1, в противном случае 0. Таким образом, допустимы довольно причудливые конструкции вроде следующей(5 > 3) + 10 будет равно 11.

Функции

abs
Принимает один аргумент. Возвращает модуль (абсолютное значение) аргумента.

abs(-10) равно 10. abs(31) равно 31.

sqrt
Принимает один аргумент. Возвращает квадратный корень аргумента.

sqrt(9) равно 3.

pow
Возводит число в степень. Принимает два аргумента: первый - число, которое необходимо возвести в степень, второй - значение степени. Если второй аргумент не задан, то функция возвращает просто первый аргумент (возведение в степень 1).

pow(5, 3) равно 125.

sin
Возвращает синус аргумента, заданного в радианах. Принимает один аргумент.

cos
Возвращает косинус аргумента, заданного в радианах. Принимает один аргумент.
tan
Возвращает тангенс аргумента, заданного в радианах. Принимает один аргумент.

round
Округляет первый аргумент до точности, заданной вторым аргументом. Округление осуществляется по бухгалтерскому правилу, то есть, 5 округляется вверх. Принимает два аргумента. У второго аргумента (точность) отбрасывается дробная часть. Отрицательная точность округляет значение до соответствующей позиции перед десятичной точкой.

Если задан только один аргумент, то первый округляется до целого значения.

round(15.235, 2) равно 5.24. round(15.235) равно 5. round(15.235, -1) равно 20.

roundup
Округляет первый аргумент до точности, заданной вторым аргументом. Округление осуществляется до наибольшего значения. Аргументы этой функции аналогичны round.

rounddown
Округляет первый аргумент до точности, заданной вторым аргументом. Округление осуществляется до наименьшего значения. Аргументы этой функции аналогичны round.

min
Возвращает минимальное из списка аргументов значение. Принимает любое число аргументов. Если не задано ни одного аргумента, то возвращает 0.

min(-1, 2.3, 0, 5, -2.2) равно -2.2.

minz
Возвращает минимальное из списка аргументов значение, не принимая в расчет величины, равные нулю. Принимает любое число аргументов.

Если не задано ни одного отличного от нуля аргумента, то возвращает 0.

minz(2.3, 0, 5) равно 2.3.

max
Возвращает максимальное из списка аргументов значение. Принимает любое число аргументов. Если не задано ни одного аргумента, то возвращает отрицательное максимально возможное число с плавающей точкой двойной точности (-1.7976931348623158e+308).

max(-1, 2.3, 0, 5, -2.2) равно 5.

?
Функция возвращает второй или третий аргумент в зависимости от результата вычисления первого аргумента.

?(5 > 3, 10, 20) равно 10. ?(5 < 3, 10, 20) равно 20.

sieve
Функция (по русски означает “решето”) возвращает величину, зависящую от того, в какой диапазон попадает аргумент.

Формат функции несколько необычен: sieve[определитель-решета](аргумент) определитель-решета выглядит так: значение-по-умолчанию; список-диапазонов

список-диапазонов представлен произвольным количеством конструкций следующего вида: нижняя-граница-диапазона ? значение

Теперь пример

sieve[1; 5 ? 1.1; 15 ? 1.2; 30 ? 1.3](21) равно 1.2 В этом примере решето представлено следующими компонентами:

определитель-решета

1; 5 ? 1.1; 15 ? 1.2; 30 ? 1.3

значение-по-умолчанию

1

список-диапазонов

5 ? 1.1; 15 ? 1.2; 30 ? 1.3
диапазоны
5 ? 1.1 величинам больше или равным 5 соответствует значение 1.1. Сверху этот диапазон ограничен следующим диапазоном. 15 ? 1.2 величинам больше или равным 15 соответствует значение 1.2. Сверху этот диапазон ограничен следующим диапазоном. 30 ? 1.3 величинам больше или равным 30 соответствует значение 1.3 Сверху этот диапазон не ограничен, так как является последним.
Величинам, которые меньше нижней границы диапазона с наименьшей границей (в нашем примере 5) будет соответствовать значение-по-умолчанию (в примере 1).

oid
Функция возвращает полный идентификатор объекта данных. Под полным идентификатором подразумевается то, что возвращаемое значение содержит и тип объекта и его идентификатор. Функция используется в специальных случаях.

Параметры:

  • Символ типа объекта данных. Допустимы следующие значения:
  • UNIT
    Единицы измерения.
    GOODSTYPE
    Типы товаров.
    GOODSCLASS
    Классы товаров.
    PERSONKIND
    Виды персоналий.
    PERSONSTATUS
    Юридические статусы персоналий.
    PERSONCATEGORY
    Категории персоналий.
    LOCATION
    Склад или иная локация (адрес, место хранения).
    GLOBALUSER
    Глобальные учетные записи.
    CURRENCY
    Валюта.
    CURRATETYPE
    Тип валютного курса.
    QUOTKIND
    Виды котировок.
    Символ типа динамического объекта
    Если динамический объект данных имеет собственный символ, то этот символ может быть использован в этой функции. Пример для этого случая приведен ниже.

    В дальнейшем приведенный выше список будет расширяться.

  • Символ объекта данных. Если значение параметра числовое, то функция ищет объект заданного первым параметром типа по идентификатору, равному второму аргументу. В противном случае функция пытается найти объект по строке символа, заданного этим аргументом.

    Идентификация объекта по символу возможна для следующих типов объектов данных:

  • UNIT
    GOODSTYPE
    GOODSCLASS
    PERSONKIND
    PERSONSTATUS
    PERSONCATEGORY
    LOCATION
    Для этого типа объекта есть две особенности:
  • Специальный символ _undef определяет нулевое значение локации (используется как параметр в функциях определения значений котировок).
  • Символ локации чувствителен к регистру знаков.
  • GLOBALUSER
    QUOTKIND
    CURRENCY
    CURRATETYPE
    Динамические объекты

    oid(UNIT, meter) возвращает идентификатор единицы измерения с символом “meter”. oid(QUOTKIND, 1) возвращает идентификатор вида котировки 1 (если вид котировки с таким идентификатором существует). Пример получения идентификатора динамического объекта. Допустим у нас есть динамический объект “Виды алкогольной продукции” и символом этого типа является ALCTYPE. Тогда для получения идентификатора, скажем, вида “Водка” (предположим, эта запись имеет символ VOD) необходимо вызвать функцию в следующем виде oid(ALCTYPE, VOD).

    Контексты исполнения

    Важным аспектом применения формул является, так называемый, контекст исполнения. Собственно, именно контекст исполнения делает формулы полезным инструментом, поскольку позволяет оперировать атрибутами документов, товаров и иных сущностей, применяемых системой.

    Так формулы могут использоваться для расчета сумм бухгалтерских проводок по документам. В этом случае система рассматривает формулы в контексте документа.Вот список контекстов:

    Контекст документа
    Используется при расчете сумм документов и формирования бухгалтерских проводок по документам.
    Контекст товара
    Используется при вычислении различных параметров товаров, особенно это относится к классифицированным товарам.

    Контекст расчета зарплаты
    Как следует из названия, используется при расчетах заработной платы.
    Контекст формул DL200
    Применяется в языке описания данных DL200.

    Контекст импорта/экспорта
    Используется при импорте/экспорте.

    Принципиальным различием контекстов является разный набор используемых в них функций. После описания общих функций и символов, мы перечислим функции, применяемые в рамках каждого из описанных контекстов.

    Контекст документа

    Символы

    Далее приведены правила распознавания символов документа программой. Правила перечислены в том порядке, в котором система их пытается идентифицировать. Этот порядок важен потому, что определяет результат работы разборщика формулы в случае совпадения символов, имеющих разный смысл.

    QTTY
    Суммарное количество торговых единиц товаров в документе.
    PHQTTY
    Суммарное количество физических единиц товаров в документе.

    Символы типов сумм документов
    Если распознается символ типа суммы документа, то результатом подстановки будет являться значение суммы этого типа в документе, связанном с контекстом.

    PRICE-DISCOUNT Вычисляет чистую цену продажи по документу (обычно, символом PRICE обозначается сумма документа в учетных ценах реализации, а PRICE - сумма скидки по документу).

    Символы формул
    Извлекается формула, соответствующая символу и вычисляется как подвыражение текущей формулы.
    ALAMT
    Сумма по строке многострочного бухгалтерского документа (например, авансового отчета).

    Префиксы символов

    Для символов типов сумм документов а также для QTTY и PHQTTY могут применяться специальные префиксы, позволяющие ссылаться на документы, с которым связан документ контекста.Префикс отделяется от символа точкой. Например: LINK.COST здесь LINK - префикс, COST - символ.

    Допустимы следующие префиксы:

    LINK
    Извлекает заданный символ из связанного документа. Связанные документы обычно есть у документов оплаты и привязанного возврата.

    Так выражение LINK.COST * AMOUNT / LINK.AMOUNT вычислит пропорциональную сумму оплаты в учетных ценах поступления для документа оплаты, привязанной к документу отгрузки.

    RCKN
    Извлекает заданный символ из зачитываемого документа. Зачитываемый документ обычно есть у документов зачетных документов оплаты.

    Функции

    В контексте документа могут быть использованы следующие специальные функции:

    amountbyvat
    Сумма документа по строкам, товары которых облагаются указанной аргументом ставкой НДС.

    amountbygvat
    Сумма документа по строкам, товары которых облагаются указанной первым аргументом ставкой НДС. Отличается от amountbyvat тем, что суммируются строки, по которым не эффективная, но номинальная (то есть, заданная для товара) ставка НДС равна указанной. Другими словами, эта функция игнорирует признаки освобождения поставщика или главной организации от НДС.

    amountbytvat
    Сумма документа по строкам, товары которых принадлежат типу oid(GOODSTYPE, id), заданному первым параметром и облагаются ставкой НДС, заданной вторым параметром. То есть, результат аналогичен amountbyvat с той разницей, что суммирование ограничивается товарами с заданным типом.

    amountbytvat(oid(GOODSTYPE, Tare), 18) Вычисляет сумму документа по строкам, товары которых имеют тип с символом Tare и облагаемых 18-процентным НДС.

    costbyvat
    Сумма документа в ценах поступления по строкам, товары которых облагаются указанной аргументом ставкой НДС.
    costvat
    Сумма НДС в ценах поступления по строкам документа, товары которых облагаются указанной аргументом ставкой НДС.

    pricebyvat
    Сумма документа в ценах реализации по строкам, товары которых облагаются указанной аргументом ставкой НДС.
    pricevat
    Сумма НДС в ценах реализации по строкам документа, товары которых облагаются указанной аргументом ставкой НДС.

    Контекст товара

    Этот контекст используется во множестве различных ситуаций, в связи с чем может иметь несколько форм. А именно:

  • Контекст может содержать полный пакет товара (например, при вызове из диалога редактирования товара при разрешении формул классифицированных товаров).
  • При расчете формул компонентов товарной структуры контекст содержит эту структуру.
  • В случае использования при экспорте документов контекст будет содержать пакет документа, что позволяет ссылаться на числовые атрибуты, присущие строкам товарных документов.
  • Контекст может быть связан с технологической сессией.
  • Функции

    vat
    Сумма НДС, которое облагается величина, переданная функции в качестве аргумента. По умолчанию предполагается, что значение первого аргумента не содержит в себе сумму НДС, которую необходимо вычленить. Если же в функции задан второй аргумент и его значение не равно нулю, тогда функция считает, что значение первого аргумента содержит в себе сумму НДС.

    vatplus
    Прибавляет сумму НДС, которое облагается величина, переданная функции в качестве аргумента. Предполагается, что величина, переданная в качестве аргумента, не содержит сумму НДС.
    vatminus
    Вычитает сумму НДС из величины, переданной в качестве аргумента. Предполагается, что эта величина, содержит сумму НДС.

    getquot
    Возвращает значение котировки товара. В качестве параметров функции могут быть переданы идентификаторы объектов (oid), определяющих значение котировки. Как минимум, в функцию должен быть передан идентификатор вида котировки, кроме того, опционально, могут быть переданы идентификаторы валюты, аналитической статьи (с которой связана котировка) и склада.

    getquot(oid(QUOTKIND, Q01), oid(LOCATION))

    getquotcp
    Возвращает значение котировки товара, возможно, относительно заданных параметров цены поступления и цены реализации (для относительных котировок).

    getquotcp(oid(QUOTKIND, Q01), oid(LOCATION), quot.sdeal, quot.sdeal)

    Префиксы символов

    Префикс уточняет товар, к которому относится символ, следующий за префиксом после точки. Пример: MAIN.X - классификатор X основного товара структуры.

    MAIN
    Основной товар структуры. Применяется в случае, если контекст работает с товарной структурой (например, при автоматическом расчете формул в компонентах структур).

    MAINCOM
    Товар главного компонента структуры. По этому префиксу может быть идентифицирован товар только в том случае, если контекст ссылается на структуру и эта структура имеет один компонент с признаком ✓Основной компонент.
    PREV
    Специализированный префикс, применяемый для расчетов по технологическим сессиям перенастройки процессоров.

    Вместо этого префикса подставляется товар, который производился процессором до сессии перенастройки.

    QUOT
    Этот префикс позволяет получить значение котировки по основному товару контекста. Вслед за этим префиксом должен следовать символ вида котировки.

    Например: QUOT.BASE возвращает значение базовой (BASE) котировки для основного товара контекста. Если контекст содержит товарный документ, то будет возвращено значение котировки, связанное со складом, валютой и контрагентом документа.

    LOTTAG
    При использовании контекста с товарным документом, этот префикс возвращает значение тега лота, с символом, заданным после точки.

    Например: LOTTAG.SPCCOST возвращает значение некоторой специализированной цены (SPCCOST), связанной с лотом текущей строки товарного документа.

    TAG
    Префикс возвращает значение тега товара. Символ типа тега определяется строкой, следующей после точки.

    Например: TAG.MAXPRICE возвращает значение тега товара с символом MAXPRICE.

    Префикс введен в релизе 7.5.1.

    Символы

    ID
    Возвращает значение идентификатора товара.

    Символ введен в релизе 7.5.1.

    X
    Возвращает значение классификатора X товара.
    Y
    Возвращает значение классификатора Y товара.
    Z
    Возвращает значение классификатора Z товара.
    W
    Возвращает значение классификатора W товара.
    KIND
    Возвращает идентификатор перечисляемого объекта Вид товара. Идентификатор возвращается в форме, аналогичной той, что возвращается функцией oid() и может применяться только для сравнения посредством операторов = или !=.

    Например: KIND==oid(ALCTYPE, VOD)

    GRADE
    Тоже, что и KIND, только для классификатора Сорт.
    ADDPROP
    Тоже, что и KIND, только для классификатора Классификатор.
    ADDPROP2
    Тоже, что и KIND, только для классификатора Классификатор 2.
    TYPE
    Возвращает идентификатор типа товара. Идентификатор возвращается в форме, аналогичной той, что возвращается функцией oid() и может применяться только для сравнения посредством операторов = или !=.

    Например: TYPE==oid(GOODSTYPE, ASSETS)

    PHUPERU
    Возвращает соотношение физических единиц товара к торговым.
    QTTY
    При использовании контекста с товарным документом возвращает количество в текущей товарной строке документа.

    Если контекст связан с технологической сессией, то этот символ заменяется на значение количества товара в строках сессии.

    QTY
    Тоже, что и QTTY.

    PHQTTY
    Тоже, что и QTTY только в пересчете на физические единицы измерения.
    PHQTY
    Тоже, что и PHQTTY.
    QTTYCOM
    Применяется для контекста, связанного с товарной структурой. Возвращает количества компонента структуры.
    COST
    При использовании контекста с товарным документом возвращает цену поступления текущей строки документа.
    PRICE
    При использовании контекста с товарным документом возвращает цену реализации текущей строки документа.
    DISCOUNT
    При использовании контекста с товарным документом возвращает скидку текущей строки документа.
    A1
    При ручном расчете значения по формуле этот символ заменяется на первый параметр, введенный пользователем.
    A2
    При ручном расчете значения по формуле этот символ заменяется на второй параметр, введенный пользователем.
    A3
    При ручном расчете значения по формуле этот символ заменяется на третий параметр, введенный пользователем.
    PI
    Константа .

    Контекст расчета зарплаты

    Контекст формул DL200

    Контекст импорта/экспорта