При разработке отчетов на системе компоновки данных (СКД) программисты часто сталкиваются с задачей красивого вывода вложенных группировок. Если в строках иерархическое представление формируется автоматически в виде удобного дерева со сдвигами, то при выводе группировок в колонках (столбцах) кросс-таблицы СКД по умолчанию стремится расположить их линейно. В результате шапка отчета выглядит перегруженной или некорректно отображает подчиненность элементов.
В этой статье мы подробно разберем, как решить эту проблему с помощью стандартных настроек компоновщика, использования ресурсов или программной постобработки результирующего табличного документа.
Самый простой и правильный путь — настроить вложенность непосредственно в структуре настроек отчета СКД. Если иерархические уровни представлены разными полями (например, транспортные средства разделены на категории: Авто, Авиа, Море), мы можем жестко задать структуру подчинения в настройках таблицы.
Рассмотрим по шагам, как это сделать:
Если состав колонок верхнего уровня фиксирован и заранее известен (например, виды доставки: Авто, Авиа, Железнодорожный транспорт), то вместо динамической группировки колонок можно использовать ресурсы.
Проанализируем этот подход:
Сумма).Этот способ гарантирует идеальный внешний вид шапки отчета, так как структура колонок становится статической и полностью контролируется разработчиком.
Бывают ситуации, когда структура колонок полностью динамическая, а стандартные механизмы выравнивания СКД не позволяют добиться требуемого дизайна шапки. В этом случае мы можем прибегнуть к постобработке готового табличного документа.
Для реализации этого метода переопределим процедуру ПриКомпоновкеРезультата в модуле объекта отчета. Мы отключим стандартный вывод, сформируем табличный документ программно, а затем объединим смежные ячейки шапки с одинаковыми значениями.
Разберем пример кода:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Сформируем отчет программно
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Алгоритм постобработки шапки табличного документа
ОбъединитьОдинаковыеЯчейкиШапки(ДокументРезультат);
КонецПроцедуры
Процедура ОбъединитьОдинаковыеЯчейкиШапки(ТабличныйДокумент)
// Задаем область поиска шапки (например, первые 5 строк)
ВысотаШапки = 5;
ШиринаТаблицы = ТабличныйДокумент.ШиринаТаблицы;
Для Строка = 1 По ВысотаШапки Цикл
Колонка = 1;
Пока Колонка < ШиринаТаблицы Цикл
ТекущаяОбласть = ТабличныйДокумент.Область(Строка, Колонка);
ЗначениеТекущей = ТекущаяОбласть.Текст;
Если ПустаяСтрока(ЗначениеТекущей) Тогда
Колонка = Колонка + 1;
Продолжить;
КонецЕсли;
Шаг = 1;
Пока (Колонка + Шаг) <= ШиринаТаблицы Цикл
СоседняяОбласть = ТабличныйДокумент.Область(Строка, Колонка + Шаг);
Если СоседняяОбласть.Текст = ЗначениеТекущей Тогда
Шаг = Шаг + 1;
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
Если Шаг > 1 Тогда
ОбластьОбъединения = ТабличныйДокумент.Область(Строка, Колонка, Строка, Колонка + Шаг - 1);
ОбластьОбъединения.Объединить();
Колонка = Колонка + Шаг;
Иначе
Колонка = Колонка + 1;
EndIf;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Этот код находит в указанных строках шапки идущие подряд ячейки с одинаковым текстом и объединяет их по горизонтали. Таким образом, родительская группировка будет красиво растянута над всеми своими подчиненными элементами.