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