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