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