Как настроить группировку по периодам в отчете СКД по документам?

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

При разработке отчетов в системе компоновки данных (СКД) часто возникает задача вывести показатели не просто общим итогом по документам, а с детализацией по интервалам времени: месяцам, кварталам, дням или годам. Если отчет строится напрямую по таблице документов (например, Документ.ЗаказКлиента), решение заключается в правильной подготовке поля даты в запросе и последующей настройке группировок компоновки данных.

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

Базовый способ: приведение даты к началу периода в запросе

Проанализируем ситуацию, когда необходимо сгруппировать суммы и количество документов по месяцам. Самый прямой путь — применить функцию языка запросов НАЧАЛОПЕРИОДА к дате документа.

Разберем пример запроса для набора данных СКД:


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

В данном запросе функция НАЧАЛОПЕРИОДА(ЗаказКлиента.Дата, МЕСЯЦ) округляет дату каждого документа до первого числа соответствующего месяца. Далее в настройках СКД достаточно добавить группировку по полю ПериодМесяц, а для полей Сумма и КоличествоЗаказов задать функции ресурса (СУММА(Сумма) и СУММА(КоличествоЗаказов)) на вкладке «Ресурсы».

Автоматические дочерние поля периодов в СКД

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

  1. .ПериодДень
  2. .ПериодНеделя
  3. .ПериодМесяц
  4. .ПериодКвартал
  5. .ПериодГод

Если в запросе просто выбрать поле ЗаказКлиента.Дата, то на вкладке «Настройки» в дереве группировок можно сразу выбирать дочернее поле Дата.ПериодМесяц или Дата.ПериодДень. Это позволяет изменять периодичность отчета в настройках пользователя без редактирования текста запроса.

Вывод периодов без документов (Дополнение периодов)

Рассмотрим случай, когда за какой-либо месяц не было зарегистрировано ни одного документа. При стандартной выборке такой месяц просто отсутствует в результате. Чтобы выводить в отчете все периоды интервала, даже если по ним нет данных, используется механизм дополнения периодов СКД.

Настройка выполняется по следующим шагам:

  1. Переходим в настройки отчета на вкладку «Структура» и выбираем нужную группировку периода (например, ПериодМесяц).
  2. В окне свойств группировки находим параметр Тип дополнения и устанавливаем значение Месяц (или День, Квартал в зависимости от нужной детализации).
  3. В свойствах Начальная дата и Конечная дата указываем выражения параметров отчета: &НачалоПериода и &КонецПериода.

Важное ограничение: дополнение периодов штатно работает только для полей типа Дата, полученных непосредственно из запроса набора данных. Для полей, созданных через «Вычисляемые поля» СКД, встроенный механизм дополнения работать не будет.

Корректная обработка границ периода

Посмотрим на частую ошибку при установке отбора по датам. Если пользователь выбирает конечную дату периода как 31.12.2023, то без указания времени параметр получает значение 31.12.2023 00:00:00. В результате документы, проведенные в течение дня 31 декабря, не попадают в выборку.

Чтобы избежать этой проблемы, на вкладке «Параметры» в СКД для параметра &КонецПериода в колонке «Выражение» задается обязательное преобразование:

КОНЕЦПЕРИОДА(&КонецПериода, "ДЕНЬ")

Это гарантирует, что граница отбора будет включительно захватывать последнюю секунду дня (23:59:59).

Оптимизация отчетов по документам

Проанализируем производительность запроса. Выборка данных напрямую из таблиц документов на больших массивах данных работает медленнее, чем обращение к виртуальным таблицам регистров накопления, так как у документов отсутствуют предварительно рассчитанные итоги.

Если в системе ведутся соответствующие регистры накопления (например, регистр продаж или заказов), эффективнее строить отчет по виртуальной таблице .Обороты с указанием периодичности:


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

Использование виртуальных таблиц регистров существенно повышает скорость формирования отчета и обеспечивает корректную работу с итогами и периодичностью.

← На главную