Язык описания виртуального итога

Ограничимся пока неформальным изложением DSL-языка виртуальных итогов. Приведем полностью текст виртуального итога, упомянутого в прошлом разделе и разберем его составные части:

// dimensions and variables
dim AgentID (Agent): en(Agent), ru(Контрагент)
dim CostItemID (CostItem): en(CostItem), ru(Статья)
var Amount: en(Amount), ru(Сумма)
 
// calculated groups
group Income: en(Income), ru(Приход)
  var Amount
      total Expense: -Amount
          filter CostItemID: 108 with descendants
end
 
group Outcome: en(Outcome), ru(Расход)
  var Amount
      total Expense: -Amount
          filter CostItemID: 81, 112 with descendants

  total Convertation: Amount

           value CostItemID: 81
end

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

dim IncomeDocumentID (PurchaseDocument): en(Income document), ru(Приходный документ)

Во втором разделе описываются вычисляемые группы (group). В каждой группе для каждой переменной виртуального итога нужно перечислить источники данных. Источниками данных могут быть итоги (total) или другие вычисляемые группы (group). На источники данных можно накладывать фильтр (filter): так, в нашем примере по статье затрат мы можем судить, к доходам или расходам нужно отнести ту или иную проводку.

Обратите внимание на вычисляемую группу Outcome. В ней переменная Amount получает данные из двух итогов: из Затрат и Конвертации. Измерения итога Затраты (AgentID, CostItemID) автоматически отображаются на одноименные измерения виртуального итога. Однако в итоге Конвертация этих измерений нет: при конвертации валюты никакие контрагенты и статьи затрат не задействованы. Чтобы в нашем отчете курсовая разница показывалась как отдельная статья затрат, нужно явно указать код статьи затрат для всех проводок по итогу Конвертация. Для этого используется отображение измерения на значение (value):

value CostItemID: 81

Есть еще одна ситуация, когда может потребоваться отображение измерения: нужное измерение в итоге-источнике данных есть, но называется по-другому. Или нужного измерения нет, но есть ссылающийся на него справочник. В этих случаях можно воспользоваться отображением измерения на другое измерение (dim):

dim OfficeID: StoreID.OfficeID

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