При разработке отчетов в системе компоновки данных (СКД) часто возникает задача, когда на разных уровнях иерархии группировок требуется выводить принципиально разные показатели или применять разные формулы расчета. Например, на уровне группировки Номенклатура необходимо вывести общий объем продаж и выручку из регистра накопления, а на подчиненном уровне Операция — количество технологических операций и их расчетную стоимость на основе объема выпуска продукции.
Попытка решить такую задачу через вычисляемые поля с конструкцией ВЫБОР КОГДА обычно не приводит к результату, так как на этапе вычисления полей СКД контекст текущей группировки еще не определен. Разберем штатные механизмы платформы 1С:Предприятие, позволяющие гибко управлять расчетом и выводом ресурсов на разных уровнях отчета.
Основной и наиболее гибкий механизм СКД — разделение формул расчета по группировкам. На вкладке Ресурсы схемы компоновки данных можно добавлять одно и то же поле несколько раз, указывая для каждой строки конкретную группировку в колонке Рассчитывать по....
Разберем по шагам, как настроить расчет:
Количество) и в колонке Рассчитывать по... выберем группировку Номенклатура. В колонке Выражение укажем стандартную агрегатную функцию:
Сумма(КоличествоОборот)
Количество, но в колонке Рассчитывать по... укажем подчиненную группировку Операция. В поле Выражение укажем формулу для операции:
Сумма(КоличествоОперации)
ВычислитьВыражение:
ВычислитьВыражение("Сумма(КоличествоОборот)", "Номенклатура") * ВТ_Операции.Цена
Функция ВычислитьВыражение позволяет явно обратиться к расчетному контексту вышестоящей группировки Номенклатура, находясь на уровне подчиненных записей Операция.Общий итог и зададим корректную формулу.Если для продукции и для операций используются принципиально разные наборы показателей, не обязательно склеивать их в одни и те же колонки. Платформа позволяет переопределить состав полей для каждого уровня структуры отчета.
Проанализируем порядок действий:
Номенклатура.Номенклатура, КоличествоОборот, ВыручкаОборот.Операция.Операция, КоличествоОперации, СтоимостьОперации.В результате таблица отчета сформирует аккуратный ступенчатый вид, где на каждом уровне будут выводиться только те колонки, которые имеют смысл для текущей группировки.
В ситуациях со сложной иерархией и специфическими требованиями к расчету итогов можно рассчитать все показатели непосредственно в тексте запроса с помощью оператора ОБЪЕДИНИТЬ ВСЕ.
Посмотрим на пример структуры запроса:
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
ЗНАЧЕНИЕ(Справочник.ТехнологическиеОперации.ПустаяСсылка) КАК Операция,
Продажи.КоличествоОборот КАК Количество,
Продажи.ВыручкаОборот КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Операции.Номенклатура,
Операции.Операция,
Операции.Количество,
Операции.Количество * Операции.Цена
ИЗ
втОперации КАК Операции
При таком подходе данные поступают в СКД уже нормализованными, что избавляет от необходимости усложнять формулы ресурсов на уровне схемы компоновки данных.