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