Как настроить иерархию периодов (Месяц-Неделя-День) в отчете на СКД?

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

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

Шаг 1: Подготовка набора данных

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


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

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

Шаг 2: Настройка ролей полей периода

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

Для каждого уровня иерархии настроим следующие параметры:

  1. Откроем конструктор строки «Роль».
  2. Установим флажок «Период».
  3. Укажем «Тип периода» (например, для месяца — Месяц, для дня — День).
  4. Для подчиненных полей (Неделя, День) обязательно заполним «Родительское поле». Для Дня родителем будет Неделя, для Недели — Месяц.

Такая настройка позволит системе автоматически группировать данные и корректно обрабатывать ситуацию, когда за определенный день нет оборотов.

Шаг 3: Использование функции дополнения периодов

Проанализируем ситуацию: если в середине недели не было продаж, стандартный отчет просто пропустит этот день, и визуальная структура колонок «поплывет». Чтобы этого избежать, воспользуемся механизмом дополнения периодов.

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

Шаг 4: Настройка структуры колонок в компоновке

Теперь перейдем на вкладку «Настройки» и создадим структуру типа «Таблица». Посмотрим, как правильно расположить группировки в колонках:

  1. Добавим в колонки группировку по полю Месяц.
  2. Внутри нее (как подчиненную) добавим группировку по полю Неделя.
  3. Внутри недели добавим группировку по полю Период (день).

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

Шаг 5: Оформление заголовков и использование макетов

Если стандартный вывод кажется «корявым» (например, заголовки месяцев дублируются над каждой неделей), воспользуемся Макетами. Рассмотрим, как создать пользовательский макет для шапки:

  1. Перейдем на вкладку «Макеты».
  2. Добавим «Макет заголовка группировки».
  3. Выберем область табличного документа, которую мы хотим видеть в качестве заголовка.
  4. В ячейках макета можно использовать параметры, например, [Формат(Месяц, "ДФ='MMMM yyyy'")].

Использование макетов позволяет принудительно объединить ячейки и задать нужный стиль оформления (цвета, рамки, шрифты), который не будет меняться при переформировании отчета.

Шаг 6: Программная постобработка (если нужно «идеально»)

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


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Инициализируем схему и компоновщик
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // Здесь выполняем постобработку ДокументРезультат
    // Например, поиск и объединение одинаковых ячеек в шапке
    ПостобработкаШапки(ДокументРезультат);
    
КонецПроцедуры

Функция ПостобработкаШапки должна обходить область заголовков ТабличногоДокумента и вызывать метод Объединить() для смежных ячеек с одинаковыми значениями периода. Это гарантирует «чистый» визуальный вид, как в старых отчетах на обычных формах.

Резюме

Мы проанализировали основные способы создания иерархии периодов в СКД. Для большинства задач достаточно правильно настроить Роли полей и Дополнение периодов. Если же требования к внешнему виду высоки, используйте Макеты группировок или программную постобработку результата. Это позволит вам создавать функциональные и эстетически приятные отчеты, сохраняя все преимущества системы компоновки данных.

← На главную