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

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

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

Анализ ограничений стандартных настроек СКД

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

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

Способ 1. Настройка структуры группировок и расположения полей

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

  1. Перейдем на вкладку Настройки в схеме компоновки данных.
  2. Создадим структуру: добавим группировку верхнего уровня по родительскому полю (например, НоменклатурнаяГруппа или Контрагент), а внутри нее создадим подчиненную группировку (например, Номенклатура или Договор) либо Детальные записи.
  3. На одном уровне группировки можно выводить несколько реквизитов, не создавая лишних вложенных уровней.
  4. На вкладке Другие настройки настроим параметры отображения:

    – Расположение полей группировки: установим значение Вместе или В отдельной колонке в зависимости от требуемой структуры.

    – Расположение реквизитов: установим Вместе с владельцем, чтобы реквизиты объекта выводились в одной ячейке через запятую, не размножая колонки.

    – Расположение группировок: значение Нет позволяет убрать лишние строки итогов и заголовков группировок.

Способ 2. Использование функции «СоединитьСтроки» в ресурсах

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

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

    СоединитьСтроки(СерийныйНомер, Символы.ПС) — для вывода каждого значения с новой строки внутри одной ячейки.

    или СоединитьСтроки(СерийныйНомер, ", ") — для вывода значений через запятую в одну строку.

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

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

Посмотрим на возможность создания индивидуального оформления через вкладку Макеты:

  1. На вкладке Макеты добавим Макет группировки или Макет поля.
  2. В редакторе табличного документа макета выделим нужные ячейки по горизонтали и объединим их стандартным действием платформы.
  3. Зададим параметры заполнения ячеек (Шаблон, Параметр или Текст). Это позволяет формировать сложные многоуровневые шапки и итоговые строки отчета.

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

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

Разберем пример кода с обходом строк и объединением смежных повторяющихся ячеек:


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

КонецПроцедуры

Особенности и нюансы при объединении ячеек

Проанализируем важные технические моменты, которые необходимо учитывать:

  1. Выгрузка в Excel: физически объединенные по вертикали ячейки затрудняют последующую работу пользователей с фильтрами, сортировками и сводными таблицами в сторонних табличных процессорах.
  2. Механизм расшифровки: при объединении диапазона ячеек расшифровка (значение ДанныеРасшифровки) может остаться привязанной только к первой верхней ячейке диапазона.
  3. Производительность: построчный обход больших табличных документов (более нескольких тысяч строк) и вызов метода Объединить() создают дополнительную нагрузку на клиентское или серверное приложение. Для объемных отчетов предпочтительно использовать штатные группировки СКД.
← На главную