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

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

При разработке отчетов в Системе компоновки данных (СКД) программисты часто сталкиваются с требованиями заказчиков сделать отчет «как в Excel». Одно из самых частых пожеланий — объединить вертикальные ячейки с одинаковыми значениями (например, название подразделения или аналитики), напротив которых в соседних столбцах выводятся различные показатели за разные периоды.

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

Проанализируем ситуацию на конкретном примере. Нам необходимо вывести отчет по загрузке сотрудников подразделений (например, АХО). В строках должно выводиться подразделение, а в смежных ячейках по вертикали — три показателя: «Календарная загрузка», «Фактическая загрузка» и «Приведенная загрузка». В колонках отчета должен выводиться период (дни или месяцы).

---

Метод 1. Перевод показателей в ресурсы и их вертикальное расположение (Рекомендуемый)

Это самый элегантный и производительный способ, не требующий написания программного кода. Вместо того чтобы делать показатели «Календарная», «Фактическая» и «Приведенная» значениями группировки строк, мы спроектируем схему компоновки так, чтобы эти показатели стали самостоятельными ресурсами.

Рассмотрим пошагово, как реализовать этот метод:

  1. Проектирование запроса: В схеме компоновки данных пишем запрос таким образом, чтобы показатели выбирались отдельными полями.
    Например, вместо одной строки с полем ТипПоказателя и полем Значение, мы выбираем три поля: ЧасыКалендарные, ЧасыФактические и ЧасыПриведенные.
  2. Определение ресурсов: Переходим на вкладку «Ресурсы» в СКД. Добавляем все три поля в список ресурсов с соответствующими функциями агрегации (например, Сумма(ЧасыКалендарные), Сумма(ЧасыФактические), Сумма(ЧасыПриведенные)).
  3. Настройка структуры отчета: Переходим на вкладку «Настройки».
    • Добавляем в структуру элемент типа «Таблица».
    • В Строки таблицы добавляем группировку по нашему аналитическому разрезу (например, Подразделение или Сотрудник).
    • В Колонки таблицы добавляем группировку по периоду (например, ПериодДень или ПериодМесяц).
  4. Вывод ресурсов: В окне настроек «Выбранные поля» (для всей таблицы или для группировки строк) указываем наши ресурсы: ЧасыКалендарные, ЧасыФактические, ЧасыПриведенные.
  5. Вертикальное расположение ресурсов: Выделяем в структуре настроек элемент «Таблица» и переходим на вкладку «Другие настройки» (в нижней части экрана). Находим параметр «Расположение ресурсов» и устанавливаем для него значение «Вертикально».

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

---

Метод 2. Программная постобработка в событии «ПриКомпоновкеРезультата»

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

Разберем алгоритм работы в модуле объекта отчета:

  1. Открываем модуль объекта отчета и находим (или создаем) предопределенную процедуру ПриКомпоновкеРезультата.
  2. Устанавливаем свойство СтандартнаяОбработка = Ложь, чтобы взять процесс вывода отчета под свой контроль.
  3. Программного выполняем стандартный вывод отчета в табличный документ.
  4. После вывода запускаем процедуру обхода строк табличного документа для поиска одинаковых значений в нужной колонке и их физического объединения.

Посмотрим на пример программной реализации этого алгоритма:


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

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

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

---

Метод 3. Визуальное «псевдообъединение» через Условное оформление

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

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

Выясним алгоритм настройки этого метода:

  1. Добавление вычисляемого поля: Нам необходимо понимать, какая строка в группе является первой, а какая — последующей. Для этого в запросе или в вычисляемых полях СКД можно использовать системные поля автонумерации строк в группировке (например, использовать функцию общего модуля, которая считает индекс строки внутри группы).
  2. Настройка правил условного оформления:
    • В настройках отчета переходим на вкладку «Условное оформление».
    • Добавляем новое правило. В оформлении указываем: Цвет текста равен цвету фона (или белый), а Стиль границы сверху устанавливаем в значение Нет линии.
    • В условиях применения правила указываем, что наше вычисляемое поле номера строки в группе больше 1 (ПорядковыйНомерВГруппе > 1).
    • В области применения правила выбираем только ту колонку, ячейки которой мы хотим визуально объединить.

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

---

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

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

Выясним, как это сделать:

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

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

Резюме

Мы подробно проанализировали четыре основных способа настройки объединения вертикальных ячеек. Для большинства стандартных задач идеально подходит Метод 1 (перевод показателей в ресурсы с их вертикальным выводом). Он не требует программирования и работает максимально быстро. Если же перед вами стоит нетипичная задача со сложной логикой вывода — смело используйте программный Метод 2 с постобработкой результирующего табличного документа.

← На главную