Как сгруппировать колонки в СКД для вывода итогов за один интервал и поквартально за второй?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Рассмотрим несколько эффективных способов решения этой задачи: от использования вычисляемых полей и специализированной группировки в запросе до настройки параллельных группировок в структуре отчета.

Способ 1. Использование единого группировочного поля с представлением

Наиболее универсальный и гибкий подход заключается в создании искусственного поля для группировки колонок. Это поле будет возвращать одну и ту же фиксированную дату для всех записей из первого интервала (до &Дата1) и дату начала соответствующего квартала для второго интервала (после &Дата1).

Разберем реализацию этого способа по шагам:

  1. В запросе или в Вычисляемых полях СКД добавим поле, например, ГруппаПериода. Выражение для расчета этого поля будет следующим:
    
    ВЫБОР
    	КОГДА Дата <= &Дата1 ТОГДА &НачалоПериода
    	ИНАЧЕ НАЧАЛОПЕРИОДА(Дата, КВАРТАЛ)
    КОНЕЦ
    
  2. Чтобы в шапке отчета вместо даты начала периода выводился понятный заголовок, зададим для поля ГруппаПериода свойство «Выражение представления»:
    
    ВЫБОР
    	КОГДА ГруппаПериода = &НачалоПериода ТОГДА "Итог до Даты1"
    	ИНАЧЕ Формат(ГруппаПериода, "ДФ='кк ''кв.'' гггг''г.'''")
    КОНЕЦ
    
  3. В настройках структуры СКД на вкладке «Колонки» добавим группировку по полю ГруппаПериода.

Важно: Возвращаемое значение поля должно иметь тип Дата, а не Строка. Если возвращать строковое представление (например, "До Дата1" и "1 кв. 2024"), платформа отсортирует колонки по алфавиту, из-за чего колонка с первичными итогами может оказаться в конце таблицы. Использование даты сохранит правильный хронологический порядок колонок.

Способ 2. Разделение ресурса на два отдельных поля через ВЫБОР КОГДА

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

Проанализируем пример выражения в запросе:


ВЫБОР
	КОГДА Дата МЕЖДУ &НачалоПериода И &Дата1 ТОГДА Сумма
	ИНАЧЕ 0
КОНЕЦ КАК СуммаДоДата1,

ВЫБОР
	КОГДА Дата МЕЖДУ &Дата1 И &КонецПериода ТОГДА Сумма
	ИНАЧЕ 0
КОНЕЦ КАК СуммаПослеДата1

При таком подходе в настройках структуры отчета:

  1. В колонках первой группировкой выводится показатель СуммаДоДата1 (без дополнительных подгруппировок по времени).
  2. Второй группировкой выводится СуммаПослеДата1 с вложенной группировкой по полю ПериодКвартал.

Способ 3. Параллельные группировки в структуре СКД без изменения запроса

Если менять сам текст запроса или создавать вычисляемые поля нежелательно, настроить отображение можно напрямую в редакторе настройки структуры СКД.

Рассмотрим порядок настройки:

  1. На вкладке «Структура» в разделе «Колонки» создадим две параллельные группировки одного уровня (находящиеся строго друг под другом).
  2. Первая группировка: группировка без указания поля (детальные записи/фиксация). В её индивидуальных настройках отбора (на вкладке «Отбор» текущей группировки) укажем условие: Дата <= &Дата1. В пользовательском заголовке группировки укажем: «Итог до Дата1».
  3. Вторая группировка: группировка по полю ПериодКвартал. В её отборе зададим условие: Дата > &Дата1.

Платформа сначала сформирует одну фиксированную колонку с суммой за первый интервал, а затем пристыкует динамические колонки по кварталам за второй интервал.

Способ 4. Разделение данных через ОБЪЕДИНИТЬ ВСЕ в запросе

Для оптимизации работы с большими объемами данных группировку можно перенести на сторону СУБД с помощью объединения двух выборок в наборе данных:


ВЫБРАТЬ
	&НачалоПериода КАК ПериодГруппировки,
	СУММА(Сумма) КАК Сумма
ИЗ
	РегистрНакопления.Продажи КАК Продажи
ГДЕ
	Продажи.Период МЕЖДУ &НачалоПериода И &Дата1
ГРУППИРОВАТЬ ПО
	&НачалоПериода

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(Продажи.Период, КВАРТАЛ),
	СУММА(Сумма)
ИЗ
	РегистрНакопления.Продажи КАК Продажи
ГДЕ
	Продажи.Период МЕЖДУ &Дата1 И &КонецПериода
ГРУППИРОВАТЬ ПО
	НАЧАЛОПЕРИОДА(Продажи.Период, КВАРТАЛ)

В СКД создается одна группировка колонок по полю ПериодГруппировки, что гарантирует высокую скорость обработки данных.

Ограничения платформы и технические нюансы

Выбирая решение, обязательно учтем следующие важные моменты работы СКД:

  1. Автоматическое дополнение периодов: Стандартный механизм СКД «Дополнение периодов» (вывод пустого квартала, если по нему не было движений) работает только для штатных полей-периодов виртуальных таблиц. Для искусственных группировок, созданных через ВЫБОР КОГДА, автодополнение не применяется. Если требуется обязательно выводить все кварталы периода, их нужно дополнять вручную через соединение с производственным календарем или таблицей периодов.
  2. Остаточные показатели: Если суммируемый ресурс является остатком (а не оборотом), простое суммирование через ВЫБОР КОГДА даст некорректный результат. Для остатков следует использовать роли полей НачальныйОстаток и КонечныйОстаток и стандартные виртуальные таблицы остатков и оборотов.
  3. Программная обработка: Если штатные средства шапки не позволяют добиться желаемого визуального оформления, вывод отчета можно перехватить в модуле объекта в событии ПриКомпоновкеРезультата и доработать итоговый ТабличныйДокумент программно.
← На главную