Источники-итоги, фильтры

Рассмотрим вычисляемую группу, которая берет данные из одного итога:

group SampleGroup: en(Sample group), ru(Пример группы)
  var Quantity
      total Stock: Quantity
end

Для переменной указывается итог-источник Stock. Как описать эту же вычисляемую группу, если в виртуальном итоге две переменные, Quantity и Amount? Нужно указать источник данных для каждой переменной виртуального итога:

group SampleGroup: en(Sample group), ru(Пример группы)
  var Quantity
      total Stock: Quantity
  var Amount
      total Stock: Amount
end

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

group SampleGroup: en(Sample group), ru(Пример группы)
  var Quantity
      total Stock: -Quantity
end

Еще одна частая ситуация: одна вычисляемая группа должна выводить только списания по итогу, а другая — только начисления. Чтобы отобрать только начисления, у переменной итога можно указать модификатор Add (например, Quantity.Add), чтобы только списания — Sub. Наш отчет чистильщика обуви мог бы использовать этот механизм, чтобы отделять прибыли от убытков, не ориентируясь на статьи затрат. Этот фильтр можно комбинировать с изменением знака переменной:

group SampleGroup: en(Sample group), ru(Пример группы)
  var QuantityAdd
      total Stock: Quantity.Add
  var QuantitySub
      total Stock: -Quantity.Sub
end

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

В простейшем случае такой фильтр представляет собой список кодов записей, перечисленных через запятую. Для иерархических справочников есть дополнительная конструкция «вместе с дочерними» (with descendants), которая означает, что в выборку попадет запись со всеми ее потомками. Кроме того, фильтр можно инвертировать, указав список записей, которые надо исключить из выборки (except):

group SampleGroup: en(Sample group), ru(Пример группы)
  var Quantity
      total Stock: Quantity
          filter ArticleID.GroupID: except 1, 2, 3 with descendants
end