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