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