При разработке отчетов в системе компоновки данных (СКД) часто возникает задача вывести данные в виде таблицы, где колонки сгруппированы по периодам: сначала идет месяц, под ним — недели, а внутри недель — конкретные дни. Несмотря на кажущуюся простоту, стандартный механизм вывода СКД может формировать «ступенчатые» или некорректно объединенные заголовки. В этой статье мы подробно разберем, как правильно настроить иерархию периодов, чтобы отчет выглядел профессионально и был удобен для пользователя.
Для начала проанализируем наш запрос. Чтобы СКД могла эффективно работать с периодами, нам необходимо предоставить ей базовое поле даты. Рассмотрим простейший пример запроса к регистру накопления:
ВЫБРАТЬ
ПродажиОбороты.Период КАК Период,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СуммаОборот КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК ПродажиОбороты
Здесь важно выбрать периодичность День, чтобы у системы была возможность детализировать данные до конкретной даты. После написания запроса мы можем пойти двумя путями: либо создавать отдельные поля для месяца и недели прямо в тексте запроса, либо использовать вычисляемые поля в СКД. Рассмотрим второй вариант как более гибкий.
Это критически важный этап, который многие пропускают. Перейдем на вкладку «Наборы данных». Для поля Период и всех производных полей необходимо настроить колонку «Роль». Выясним, почему это важно: без указания ролей СКД не понимает взаимосвязь между «днем» и «месяцем» как частями одного целого.
Для каждого уровня иерархии настроим следующие параметры:
Месяц, для дня — День).Дня родителем будет Неделя, для Недели — Месяц.Такая настройка позволит системе автоматически группировать данные и корректно обрабатывать ситуацию, когда за определенный день нет оборотов.
Проанализируем ситуацию: если в середине недели не было продаж, стандартный отчет просто пропустит этот день, и визуальная структура колонок «поплывет». Чтобы этого избежать, воспользуемся механизмом дополнения периодов.
В настройках отчета, на уровне группировок колонок, перейдем к свойствам поля периода. Найдем параметр «Тип дополнения» и выберем соответствующее значение (День, Неделя или Месяц). Также укажем даты начала и окончания периода. Теперь СКД гарантированно выведет все ячейки в пределах выбранного диапазона, даже если они пустые.
Теперь перейдем на вкладку «Настройки» и создадим структуру типа «Таблица». Посмотрим, как правильно расположить группировки в колонках:
Месяц.Неделя.Период (день).Важный момент: Чтобы избежать дублирования ресурсов под каждым заголовком, в каждой группировке колонок на вкладке «Выбранные поля» необходимо снять флаг Авто и оставить только само поле периода. Ресурсы (Сумма, Количество) должны быть добавлены только на самом верхнем уровне или в общих настройках отчета.
Если стандартный вывод кажется «корявым» (например, заголовки месяцев дублируются над каждой неделей), воспользуемся Макетами. Рассмотрим, как создать пользовательский макет для шапки:
[Формат(Месяц, "ДФ='MMMM yyyy'")].Использование макетов позволяет принудительно объединить ячейки и задать нужный стиль оформления (цвета, рамки, шрифты), который не будет меняться при переформировании отчета.
В некоторых сложных случаях, когда встроенных средств оформления СКД недостаточно (например, требуется специфическое объединение ячеек в шапке, которое не поддерживается штатно), можно прибегнуть к постобработке. Рассмотрим пример кода, который можно разместить в модуле объекта отчета после выполнения компоновки:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Инициализируем схему и компоновщик
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Здесь выполняем постобработку ДокументРезультат
// Например, поиск и объединение одинаковых ячеек в шапке
ПостобработкаШапки(ДокументРезультат);
КонецПроцедуры
Функция ПостобработкаШапки должна обходить область заголовков ТабличногоДокумента и вызывать метод Объединить() для смежных ячеек с одинаковыми значениями периода. Это гарантирует «чистый» визуальный вид, как в старых отчетах на обычных формах.
Мы проанализировали основные способы создания иерархии периодов в СКД. Для большинства задач достаточно правильно настроить Роли полей и Дополнение периодов. Если же требования к внешнему виду высоки, используйте Макеты группировок или программную постобработку результата. Это позволит вам создавать функциональные и эстетически приятные отчеты, сохраняя все преимущества системы компоновки данных.