Как настроить иерархическое отображение вложенных группировок в колонках СКД?

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

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

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

Способ 1. Правильная настройка структуры группировок колонок в СКД

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

Рассмотрим по шагам, как это сделать:

  1. Откроем схему компоновки данных и перейдем на вкладку «Настройки».
  2. В структуре отчета добавим таблицу. Внутри области «Колонки» добавим родительскую группировку (например, поле, отвечающее за верхний уровень иерархии).
  3. Внутрь родительской группировки колонок добавим подчиненную группировку (например, детальное поле). Структура должна выглядеть как дерево, где одна группировка физически находится внутри другой.
  4. Выделим подчиненную группировку колонок, перейдем на вкладку «Выбранные поля», снимем флажок «Авто» и вручную добавим только те поля, которые должны отображаться на нижнем уровне.
  5. Для родительской группировки в окне «Другие настройки» найдем параметр «Расположение полей группировок» и установим для него значение «Отдельно» или «Отдельно и только в итогах». Это позволит избежать избыточного дублирования колонок и пустых ячеек в шапке.

Способ 2. Использование ресурсов вместо группировок колонок

Если состав колонок верхнего уровня фиксирован и заранее известен (например, виды доставки: Авто, Авиа, Железнодорожный транспорт), то вместо динамической группировки колонок можно использовать ресурсы.

Проанализируем этот подход:

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

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

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

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

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

Разберем пример кода:


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

Процедура ОбъединитьОдинаковыеЯчейкиШапки(ТабличныйДокумент)
    // Задаем область поиска шапки (например, первые 5 строк)
    ВысотаШапки = 5; 
    ШиринаТаблицы = ТабличныйДокумент.ШиринаТаблицы;
    
    Для Строка = 1 По ВысотаШапки Цикл
        Колонка = 1;
        Пока Колонка < ШиринаТаблицы Цикл
            ТекущаяОбласть = ТабличныйДокумент.Область(Строка, Колонка);
            ЗначениеТекущей = ТекущаяОбласть.Текст;
            
            Если ПустаяСтрока(ЗначениеТекущей) Тогда
                Колонка = Колонка + 1;
                Продолжить;
            КонецЕсли;
            
            Шаг = 1;
            Пока (Колонка + Шаг) <= ШиринаТаблицы Цикл
                СоседняяОбласть = ТабличныйДокумент.Область(Строка, Колонка + Шаг);
                Если СоседняяОбласть.Текст = ЗначениеТекущей Тогда
                    Шаг = Шаг + 1;
                Иначе
                    Прервать;
                КонецЕсли;
            КонецЦикла;
            
            Если Шаг > 1 Тогда
                ОбластьОбъединения = ТабличныйДокумент.Область(Строка, Колонка, Строка, Колонка + Шаг - 1);
                ОбластьОбъединения.Объединить();
                Колонка = Колонка + Шаг;
            Иначе
                Колонка = Колонка + 1;
            EndIf;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

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

← На главную