Как объединить заголовки колонок в таблице СКД и создать общую шапку

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

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

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

Метод 1: Использование фиктивной родительской группировки

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

  1. Откроем настройки нашего отчета в СКД на вкладке Настройки.
  2. Перейдем к структуре отчета, выделим нашу Таблицу и найдем область Колонки.
  3. Нажмем правую кнопку мыши на текущей группировке колонок (например, по полю ПериодДень) и выберем пункт Сгруппировать (или просто добавим новую группировку выше уровнем).
  4. В поле группировки не будем выбирать существующее поле из набора данных. Вместо этого нажмем на кнопку выбора и в поле Выражение введем строку в кавычках: "В том числе по дням".
  5. Теперь перетащим нашу исходную группировку по дням внутрь этой новой группировки-строки.

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

Метод 2: Настройка «Группы колонок» в выбранных полях

Рассмотрим ситуацию, когда нам нужно объединить несколько разных ресурсов или полей под общим заголовком внутри одной колонки. Для этого воспользуемся механизмом группировки выбранных полей.

Разберем по шагам:

  1. Зайдем в настройки конкретной группировки колонок таблицы.
  2. Перейдем на закладку Выбранные поля.
  3. Нажмем Добавить -> Новая группа выбранных полей.
  4. В появившемся окне укажем Заголовок: В том числе по дням.
  5. В поле Расположение крайне важно выбрать вариант Спецзаголовок. Это заставит СКД объединить заголовок группы над всеми полями, входящими в эту группу.
  6. Переместим нужные поля (например, Объем, Количество) внутрь этой группы.

Посмотрим на результат: если группировка по дням выводит несколько ресурсов, они будут аккуратно объединены общим заголовком «В том числе по дням», который не будет дублироваться для каждого ресурса отдельно. Для точечной настройки расположения показателей подойдёт способ вывода ресурса только в одной колонке средствами СКД.

Метод 3: Использование пользовательских макетов (Профессиональный подход)

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

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

  1. Перейдем на закладку Макеты в конструкторе СКД.
  2. Нажмем Добавить макет группировки.
  3. В появившемся списке выберем группировку колонок, для которой хотим задать заголовок.
  4. Тип макета установим как Заголовок.
  5. В области табличного документа выделим ячейку или группу ячеек. Объединим их стандартными средствами 1С (ПКМ -> Объединить).
  6. Впишем текст В том числе по дням.
  7. Чтобы под этим заголовком выводились динамические даты, в следующей строке макета нужно указать параметр (например, ПараметрПериод) и в свойствах макета связать его с полем Период.

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

Метод 4: Тонкая настройка расположения группировок

Иногда проблема «раздутости» отчета кроется в избыточных настройках вывода реквизитов. Посмотрим, как это исправить в дополнительных настройках СКД.

Перейдем на вкладку Другие настройки (на уровне всего отчета или конкретной таблицы) и обратим внимание на следующие параметры:

Метод 5: Программная постобработка табличного документа

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

Рассмотрим пример кода, который можно разместить в модуле отчета (например, в процедуре ПриКомпоновкеРезультата или в обработчике нажатия кнопки формирования на форме):


// Сначала формируем отчет стандартным способом
ТабДок = Элементы.Результат; // Или ваш ТабличныйДокумент
ЭтотОбъект.СкомпоноватьРезультат(ТабДок);

// Теперь ищем в первой или второй строке повторяющиеся значения
// и объединяем их программно
НомерСтрокиШапки = 1; // Укажите номер строки, где находится ваш текст
МаксКолонка = ТабДок.ШиринаТаблицы;

ТекущаяКолонка = 1;
Пока ТекущаяКолонка < МаксКолонка Цикл
    ТекстЯчейки = ТабДок.Область(НомерСтрокиШапки, ТекущаяКолонка).Текст;
    
    Если ТекстЯчейки = "В том числе по дням" Тогда
        НачалоОбъединения = ТекущаяКолонка;
        
        // Ищем, сколько колонок подряд содержат такой же текст
        Пока ТекущаяКолонка < МаксКолонка 
             И ТабДок.Область(НомерСтрокиШапки, ТекущаяКолонка + 1).Текст = ТекстЯчейки Цикл
            ТекущаяКолонка = ТекущаяКолонка + 1;
        КонецЦикла;
        
        Если ТекущаяКолонка > НачалоОбъединения Тогда
            ОбластьДляОбъединения = ТабДок.Область(НомерСтрокиШапки, НачалоОбъединения, НомерСтрокиШапки, ТекущаяКолонка);
            ОбластьДляОбъединения.Объединить();
            ОбластьДляОбъединения.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
        КонецЕсли;
    КонецЕсли;
    
    ТекущаяКолонка = ТекущаяКолонка + 1;
КонецЦикла;

Этот метод гарантирует 100% результат, так как мы работаем напрямую с готовым ТабличныйДокумент. Однако помните, что при изменении структуры отчета программный код может потребовать корректировки (например, если изменится номер строки шапки).

Резюме

Мы проанализировали ситуацию и нашли пять способов решения проблемы. Для большинства задач идеально подходит Метод 1 (фиктивная группировка с текстом в выражении), так как он наиболее прост в реализации и поддержке. Если же вам нужна сложная визуализация, рекомендуем освоить Механизм макетов.

Используйте эти приемы, чтобы ваши отчеты были не только информативными, но и эстетически приятными для пользователей!

← На главную