Как в отчете СКД разбить период по месяцам и настроить отчет по произвольному документу?

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

При разработке отчетов в системах 1С на базе схемы компоновки данных (СКД) часто возникает необходимость сгруппировать данные по месяцам за выбранный интервал дат. При этом требуется выводить не просто порядковые номера месяцев (1, 2, 10 и т. д.), а наглядные наименования (например, «Октябрь 2023 г.»). Кроме того, нередко встает задача сделать отчет универсальным, чтобы пользователь мог выбирать произвольный тип документа конфигурации.

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

Шаг 1. Группировка периода по месяцам в запросе СКД

Ошибкой при получении месяцев в запросах является применение функции МЕСЯЦ(). Она возвращает лишь числовой номер месяца от 1 до 12, из-за чего теряется информация о годе, а корректная хронологическая сортировка становится невозможной.

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

Проанализируем пример запроса для конкретного документа:


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

На вкладке Ресурсы схемы компоновки данных зададим агрегатную функцию для подсчета количества документов:

Количество(Ссылка)

Шаг 2. Настройка формата отображения названия месяца

Для того чтобы вместо значения вида 01.10.2023 0:00:00 в отчете отображалось название месяца с годом, настроим формат поля Месяц:

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

Обозначение ММММ выводит полное наименование месяца в именительном падеже, а yyyy отвечает за четырехзначный год. В результате отчет выведет значения вида «Октябрь 2023 г.», «Ноябрь 2023 г.».

Заполнение месяцев без документов (дополнение периода)

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

  1. В настройках структуры отчета для группировки по полю Месяц перейдем в свойства группировки.
  2. Установим параметр Тип дополнения = Месяц.
  3. Зададим границы периода: Начальная дата = &ДатаНачала и Конечная дата = &ДатаОкончания.

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

Шаг 3. Реализация выбора произвольного документа

Язык запросов 1С не поддерживает динамическую передачу имени таблицы через параметр (конструкция ИЗ &ИмяТаблицы приведет к синтаксической ошибке). Выясним, как обойти это ограничение.

Вариант 1. Динамическая подмена текста запроса

Наиболее универсальное решение — модификация текста запроса в событии ПриКомпоновкеРезультата модуля объекта отчета перед выгрузкой данных. Мы считываем имя нужного документа и формируем запрос строкой:


Процедура ПриКомпоновкеРезультата(ИсполнительКомпоновки, СхемаКомпоновки, Настройки, КомпоновщикРезультата)
	
	// ИмяДокумента может быть получено из настроек отчета или реквизита формы
	ИмяДокумента = "ЗаказКлиента"; 
	
	ТекстЗапроса = 
		"ВЫБРАТЬ
		|	Док.Ссылка КАК Ссылка,
		|	НАЧАЛОПЕРИОДА(Док.Дата, МЕСЯЦ) КАК Месяц
		|ИЗ
		|	Документ." + ИмяДокумента + " КАК Док
		|ГДЕ
		|	Док.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
		|	И Док.Проведен = ИСТИНА";
	
	// Подменяем текст запроса в схеме компоновки
	СхемаКомпоновки.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
	
КонецПроцедуры

При использовании этого метода следует помнить, что у всех документов гарантированно присутствуют только стандартные реквизиты: Ссылка, Дата, Номер, Проведен и ПометкаУдаления. Произвольные реквизиты (например, Подразделение или Контрагент) могут отсутствовать у некоторых видов документов, поэтому их наличие перед добавлением в запрос рекомендуется проверять через метаданные объекта.

Вариант 2. Использование Журнала документов

Если требуется получать данные по заранее определенному списку документов, можно создать в конфигураторе Журнал документов, включить в него все необходимые типы и строить запрос по таблице этого журнала. В таком случае запрос останется статичным.

Вариант 3. "Универсальный отчет" БСП

Если разработка ведется в типовой конфигурации на базе Библиотеки Стандартных Подсистем (БСП), нет необходимости писать собственный код. Достаточно использовать механизм Универсального отчета БСП, который предоставляет пользователю встроенную возможность выбирать любой объект метаданных и группировать данные по периодам.

← На главную