Как в отчете СКД вывести динамические колонки по месяцам от заданной даты?

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

При разработке отчетов в Системе компоновки данных (СКД) часто возникает задача вывести динамическую таблицу, где колонками выступают месяцы за определенный период (например, за последние 12 месяцев от выбранной пользователем даты). Частая ошибка начинающих разработчиков — попытка зафиксировать 12 колонок в тексте запроса с помощью условий ВЫБОР КОГДА МЕСЯЦ(...) = 1.... Такой подход громоздок, снижает производительность и требует ручной верстки макета.

В этом материале мы проанализируем, как правильно и лаконично решить эту задачу средствами языка запросов 1С и механизмов СКД.

Ошибочный подход: жесткое кодирование месяцев в запросе

Разберем, почему не стоит писать подобные конструкции в запросе:


СУММА(ВЫБОР КОГДА МЕСЯЦ(ОтгрузкаТМЦОбороты.Период) = 1 ТОГДА ОтгрузкаТМЦОбороты.КоличествоОборот КОНЕЦ) КАК Январь,
СУММА(ВЫБОР КОГДА МЕСЯЦ(ОтгрузкаТМЦОбороты.Период) = 2 ТОГДА ОтгрузкаТМЦОбороты.КоличествоОборот КОНЕЦ) КАК Февраль

Основные недостатки этого метода:

  1. Жесткая привязка к календарному году: такой запрос корректно отработает только в пределах с января по декабрь одного года. Если отчет формируется, например, за период с декабря 2023 по ноябрь 2024 года, порядок и логика колонок нарушатся.
  2. Избыточность кода: запрос становится огромным и сложным для поддержки.
  3. Игнорирование возможностей СКД: система компоновки данных создана для того, чтобы автоматически разворачивать временные периоды в колонки таблицы.

Шаг 1. Формирование правильного запроса

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

Рассмотрим оптимальный вариант запроса к регистру накопления:


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

Разберем ключевые моменты данного запроса:

  1. Периодичность виртуальной таблицы: передача периодичности Период или Месяц в параметры виртуальной таблицы оборотов заставляет платформу автоматически сгруппировать данные по выбранному интервалу. Дополнительная группировка с помощью СГРУППИРОВАТЬ ПО в запросе не требуется.
  2. Расчет интервала: функция ДОБАВИТЬКДАТЕ(&ВыбДата, МЕСЯЦ, -11) отсчитывает 11 месяцев назад от даты формирования. В сумме с текущим месяцем получается ровно 12 месяцев. Если требуется захватить 13 месяцев (включая аналогичный месяц прошлого года для сравнения), значение меняется на -12.
  3. Тип поля периода: в выборку попадает дата вида 01.12.2023 00:00:00, что сохранит правильную хронологическую сортировку при выводе колонок.

Шаг 2. Настройка параметров схемы компоновки данных

Чтобы пользователю было удобно работать с отчетом и он не вводил начальную и конечную дату вручную, настроим расчет границ на вкладке Параметры в СКД:

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

    Для начала периода:

    НачалоПериода(ДобавитьКДате(&ДатаОтчета, "Месяц", -11), "Месяц")

    Для конца периода:

    КонецПериода(&ДатаОтчета, "Месяц")
  3. Для внутренних параметров установим флаг Ограничение доступности, чтобы в форме отчета пользователь видел только одно понятное поле — ДатаОтчета.

Шаг 3. Настройка структуры отчета (разворот в колонки)

Теперь перейдем на вкладку Настройки и создадим структуру отчета типа Таблица:

  1. В секцию Строки добавляем группировку по полю Товар.
  2. В секцию Колонки добавляем группировку по полю ПериодМесяц.
  3. В секцию Ресурсы добавляем поле Количество с функцией Сумма(Количество).

Шаг 4. Настройка форматирования дат в названиях колонок

Чтобы в заголовках колонок вместо полных дат (например, 01.12.2023 0:00:00) отображались понятные названия месяцев и лет (например, Декабрь 2023), настроим оформление:

  1. Перейдем на вкладку Поля набора данных.
  2. Найдем поле ПериодМесяц и в колонке Оформление откроем настройки.
  3. В параметре Формат укажем строку формата: ДФ='MMMM yyyy' (или ДЛФ=ММММ YYYY).

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

Важные нюансы: обработка пропусков месяцев

Если в каком-то из 12 месяцев не было продаж, виртуальная таблица оборотов не вернет данных за этот период, и соответствующая колонка может выпасть из таблицы.

Для сохранения непрерывности шкалы месяцев можно использовать встроенный механизм СКД:

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

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

← На главную