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