Как объединить ячейки и сгруппировать строки в СКД

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на системе компоновки данных (СКД) разработчики часто сталкиваются с необходимостью вывести данные с объединением ячеек по вертикали для родительской группировки. В платформе 1С по умолчанию данные выводятся либо иерархическим деревом, либо повторением значений родителя в каждой строке детальных записей.

Рассмотрим подробнее основные способы решения этой задачи, включая программную постобработку сформированного табличного документа, использование функций компоновки данных, произвольных макетов и настроек условного оформления.

Способ 1. Программная постобработка в модуле объекта отчета

Выясним причину, почему этот способ является наиболее универсальным: он позволяет сохранить точность стандартной компоновки и затем физически объединить смежные ячейки в итоговом документе.

Для реализации этого подхода переопределим процедуру ПриКомпоновкеРезультата в модуле объекта отчета. Разберем по шагам порядок действий:

  1. Отключим стандартную обработку формирования отчета, установив параметр СтандартнаяОбработка = Ложь.
  2. Выполним программную компоновку отчета и сформируем результат в ТабличныйДокумент.
  3. Объединим смежные ячейки в нужных колонках с помощью метода Объединить() области табличного документа.

Проанализируем пример кода процедуры постобработки в модуле отчета:


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

Способ 2. Объединение подчиненных элементов через функцию «СоединитьСтроки»

Если задача заключается в том, чтобы выводить список подчиненных элементов (например, номенклатуру) одной строкой через разделитель напротив группировки (физического лица), воспользуемся встроенной функцией СКД СоединитьСтроки().

Рассмотрим порядок настройки этого варианта:

  1. Перейдем на вкладку «Ресурсы» в схеме компоновки данных.
  2. Добавим детальное поле (например, Номенклатура) в список ресурсов.
  3. В поле выражения укажем функцию: СоединитьСтроки(Номенклатура, ", ").
  4. На вкладке «Настройки» укажем только группировку по родителю (физическому лицу) без добавления вложенных детальных записей.

В результате платформа схлопнет детальные строки группы в одну ячейку, перечислив значения через указанный разделитель.

Способ 3. Визуальное объединение через условное оформление

Посмотрим на метод, который не меняет структуру ячеек табличного документа, но позволяет визуально объединить строки группировки без написания кода.

  1. Добавим вычисляемое поле для определения первой записи в группе или порядкового номера строки.
  2. В разделе «Условное оформление» зададим правило для всех строк группы, кроме первой.
  3. Для этих строк отключим отображение текста и установим границы ГраницаСверху и ГраницаСнизу в значение «Нет линии».

Границы между ячейками исчезнут, и визуально несколько строк сольются в одну ячейку.

Способ 4. Использование произвольных макетов СКД

Проанализируем еще один способ — настройку собственных макетов группировок. На вкладке «Макеты» схемы компоновки данных можно переопределить макет поля или макет группировки.

  1. Добавим новый макет группировки для нужной поля-группировки.
  2. Выделим область ячеек в редакторе макета и объединим их с помощью стандартного инструмента «Объединить».
  3. Укажем параметры заполнения ячеек (ИмяПараметра) и зафиксируем оформление.

Этот способ требует аккуратности при настройке областей, однако позволяет гибко управлять внешним видом отчета без использования кода.

← На главную