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

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

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

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

Причины некорректного вывода структуры колонок и базовая настройка СКД

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

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

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

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

Главная ошибка при работе с динамическими колонками — попытка нарисовать всю шапку целиком в одной фиксированной области ячеек. Динамическая шапка в СКД формируется по принципу единичных шаблонов:

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

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

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

Разберем по шагам пошаговый вывод данных с помощью процессора вывода:


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

Динамическая модификация схемы компоновки перед формированием

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

Для реализации этого метода выполняем следующий алгоритм:

  1. В обработчике ПриКомпоновкеРезультата запросом получаем актуальный список элементов справочника колонок и их родителей (разделов).
  2. Для каждого элемента справочника программно добавляем в коллекцию СхемаКомпоновкиДанных.ВычисляемыеПоля новое вычисляемое поле с выражением вида: ВЫБОР КОГДА ПолеКолонки = &ЗначениеКолонки ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ.
  3. Добавляем созданные поля в коллекцию СхемаКомпоновкиДанных.Ресурсы с функцией Сумма(...).
  4. В настройках отчета создаем горизонтальные папки группировок: создаем папку для каждого раздела (с горизонтальным расположением полей) и помещаем внутрь нее соответствующие вычисляемые поля-ресурсы. В этом случае СКД сформирует жесткую и красивую двухуровневую шапку без использования динамических таблиц.
← На главную