Работа с вычисляемыми полями

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

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

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

Пример

В схеме компоновки данных определим набор данных - запрос:

Копировать в буфер обмена
ВЫБРАТЬ
 ВложенныйЗапрос.Подразделение,
 ВложенныйЗапрос.Номенклатура,
 СУММА(ВложенныйЗапрос.СтоимостьФакт) КАК СтоимостьФакт,
 СУММА(ВложенныйЗапрос.СтоимостьПлан) КАК СтоимостьПлан
ИЗ
 (ВЫБРАТЬ
  ПродажиОбороты.Подразделение КАК Подразделение,
  ПродажиОбороты.Номенклатура КАК Номенклатура,
  ПродажиОбороты.СтоимостьОборот КАК СтоимостьФакт,
  0 КАК СтоимостьПлан
 ИЗ
  РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
 
 ОБЪЕДИНИТЬ ВСЕ
 
 ВЫБРАТЬ
  ПланыПродажОбороты.Подразделение,
  ПланыПродажОбороты.Номенклатура,
  0,
  ПланыПродажОбороты.СтоимостьОборот
 ИЗ
  РегистрНакопления.ПланыПродаж.Обороты КАК ПланыПродажОбороты) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО
 ВложенныйЗапрос.Подразделение,
 ВложенныйЗапрос.Номенклатура

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

Определим вычисляемое поле. Для этого перейдем в конструкторе схемы компоновки данных на вкладку Вычисляемые поля и добавим поле.

Назовем поле ПеревыполнениеПлана. В качестве выражения поля введем:

Копировать в буфер обмена
ВЫБОР
КОГДА СтоимостьПлан = 0
ТОГДА "Не запланировано"
ИНАЧЕ 100 * (СтоимостьФакт - СтоимостьПлан) / СтоимостьПлан
КОНЕЦ

Таким образом, значением данного поля в случае, если значение поля СтоимостьПлан равно 0, будет строка Не запланировано, и процент от перевыполнения плана в противном случае.

Для того чтобы в результат данное поле выводилось с точностью два знака, установим для поля в оформлении формат ЧДЦ=2.

Определим настройки отчета, для этого добавим группировку - детальные записи (группировку без полей группировки) и в выбранные поля добавим поля Номенклатура, Подразделение, Стоимость план, Стоимость факт, Перевыполнение плана.

Результат отчета будет выглядеть так:

Номенклатура Подразделение Стоимость план Стоимость факт Перевыполнение плана
Вентилятор настольный Отдел оптовой продажи 238,32 737,55 209,48
Мужские сапоги с искусственным мехом Отдел оптовой продажи 234,24   -100,00
Мишка (конфеты) Отдел розничной продажи   114,91 Не запланировано

Т.е. для каждой строчки было рассчитано значение вычисляемого поля.

Для того чтобы по вычисляемому полю можно было рассчитывать итоги, добавим данное поле в список ресурсов. В конструкторе схемы компоновки это делается на вкладке Ресурсы. Выберем поле и добавим его в список ресурсов. Аналогичную операцию выполним и для полей СтоимостьПлан и СтоимостьФакт.

Теперь в итог отчета будет выводиться сумма по полям, в том числе и по полю ПеревыполнениеПлана:

Номенклатура Подразделение Стоимость план Стоимость факт Перевыполнение плана
Вентилятор настольный Отдел оптовой продажи 238,32 737,55 209,48
Мужские сапоги с искусственным мехом Отдел оптовой продажи 234,24   -100,00
Мишка (конфеты) Отдел розничной продажи   114,91 Не запланировано
Итого 472,56 852,46 109,48

Однако, простым суммированием, мы получили не вполне адекватный итог по перевыполнению плана. Мы получили сумму процентов по каждой комбинации Номенклатура / Подразделение.

Для того чтобы получить правильный итог по выполнению плана изменим формулу расчета итога по полю Выполнение плана:

Копировать в буфер обмена
ВЫБОР 
КОГДА СУММА(СтоимостьПлан) = 0
ТОГДА "Не запланировано"
ИНАЧЕ 100 * (СУММА(ВЫБОР КОГДА СтоимостьПлан <> 0 ТОГДА СтоимостьФакт ИНАЧЕ 0 КОНЕЦ) - СУММА(СтоимостьПлан)) / СУММА(СтоимостьПлан)
КОНЕЦ

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

Введем данную формулу в выражение ресурса:

Теперь результат отчета будет выглядеть так:

Номенклатура Подразделение Стоимость план Стоимость факт Перевыполнение плана
Вентилятор настольный Отдел оптовой продажи 238,32 737,55 209,48
Мужские сапоги с искусственным мехом Отдел оптовой продажи 234,24   -100,00
Мишка (конфеты) Отдел розничной продажи   114,91 Не запланировано
Итого 472,56 852,46 56,08