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