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

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

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

Настройка иерархической структуры колонок

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

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

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

Корректная настройка выбранных полей

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

  1. Выделим корневой элемент настроек (Отчет) и перейдем на вкладку «Выбранные поля». Убедимся, что там нет полей Месяц и День, если они должны выводиться только в шапке таблицы.
  2. Зайдем в настройки группировки Месяц. На вкладке «Выбранные поля» снимем флаг «Использовать родительские настройки» и добавим только поле Месяц.
  3. Зайдем в настройки вложенной группировки День. Аналогично снимем флаг наследования и добавим только поле День.

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

Управление расположением группировок и итогов

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

Использование пользовательских макетов для сложной шапки

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

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

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

Программная обработка в «ПриКомпоновкеРезультата»

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


// Отключаем стандартный вывод
СтандартнаяОбработка = Ложь;

// Выполняем компоновку
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки());

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

// После вывода можно вручную объединить ячейки, если это необходимо
// Например, поиск области и вызов метода Объединить()
ДокументРезультат.Область(1, 1, 1, 10).Объединить();

Однако помните, что к ручному объединению стоит прибегать только в крайних случаях, так как СКД обладает мощным встроенным механизмом работы с макетами, который покрывает 99% задач по оформлению табелей.

Фиксация заголовков для удобства пользователя

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

В «Дополнительных настройках» СКД найдем параметры «Фиксация слева» и «Фиксация сверху». Установим для фиксации сверху значение Обычная. Это закрепит все строки, которые система определила как заголовок (включая наш «растянутый» месяц и дни).

Соблюдение этих правил позволит вам создавать профессиональные и удобные для чтения отчёты с любой сложностью вложенности заголовков.

← На главную