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

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

Разберем классическую, но от этого не менее сложную задачу при разработке отчетов в 1С. Часто возникает необходимость вывести кросс-таблицу, где строки группируются стандартно (например, «Склад» — «Родитель» — «Номенклатура»), а вот колонки должны иметь сложную иерархию — для этого подойдёт конструктор сложных управленческих отчетов для 1С. Например, верхний уровень колонок — «Город», а под ним располагаются «Номера магазинов». При этом количество городов и магазинов формируется динамически в зависимости от настроек отбора.

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

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

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

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


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

Мы обходим строки шапки отчета. Написать каркас кода поможет Консоль кода + ИИ-помощник (GigaChat) — поможет консоль кода для пошаговой отладки в 1С. Если в соседних колонках текст совпадает (например, один и тот же «Город»), мы объединяем их с помощью метода Объединить(). Это позволяет получить идеальную шапку независимо от того, как меняется количество выведенных колонок.

Способ 2: Использование пользовательских макетов СКД

Если мы хотим избежать написания программного кода постобработки (или используется Пользовательская СКД), давайте посмотрим на встроенные возможности вкладки «Макеты» в схеме компоновки данных.

  1. Переходим на вкладку «Макеты» в СКД.
  2. Добавляем «Макет группировки» для поля, которое выступает верхним уровнем шапки (в нашем случае «Город»).
  3. Тип макета устанавливаем как «Заголовок» (или «Заголовок иерархии», если применяется иерархический вывод).
  4. В нижнем поле рисуем нужную нам область ячеек, объединяем их визуально так, как нам нужно, и настраиваем параметры вывода.
  5. В свойствах выделенной области указываем параметр, в который будет передаваться название города.

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

Способ 3: Настройка групп в «Выбранных полях»

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

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

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

Способ 4: Использование вычисляемых полей («Костыль»)

Разберем еще один интересный прием (отладить который поможет Консоль запросов для управляемых форм 8.3), который часто используется разработчиками, когда стандартные группировки подводят. Это создание фиктивной группировки с помощью вычисляемого поля.

  1. На вкладке «Вычисляемые поля» добавляем новое поле, назовем его, например, ОбщийЗаголовок.
  2. В колонке «Выражение» пишем фиксированную строку, например, "Общие показатели" или формируем составную строку программным путем в СКД.
  3. В структуре настроек отчета добавляем группировку колонок по этому новому вычисляемому полю.
  4. Детальные записи или группировки по ресурсам/магазинам помещаем внутрь этой фиктивной группировки.

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

Способ 5: Хитрость с путями к данным

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

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

Подводя итоги, можно сказать следующее: если структура ваших колонок сильно зависит от пользовательских отборов и их количество нельзя предсказать заранее, смело выбирайте программную постобработку (Способ 1). Если же набор подчиненных колонок (ресурсов) статичен и заранее известен, проще всего обойтись макетами или группами выбранных полей (Способы 2 и 3).

← На главную