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

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

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

Почему стандартные настройки СКД не работают?

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

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

Решение 1: Программная постобработка табличного документа

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

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

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

Пример логики программного объединения:


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

Решение 2: Использование макетов для именованных группировок

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

  1. В настройках СКД переходим на вкладку Группировки.
  2. Для группировки, которая отвечает за «Категорию», задаем Имя.
  3. Переходим на вкладку Макеты в СКД.
  4. Создаем новый Макет группировки, указывая имя, которое мы задали на предыдущем шаге.
  5. Внутри макета рисуем область так, как нам нужно, используя возможности форматирования ячеек ТабличногоДокумента.

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

Визуальные хитрости и рекомендации

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

Эти методы полезны тем, что они не «ломают» структуру документа при выгрузке в Excel. При физическом объединении ячеек методом Объединить() часто возникают проблемы с шириной колонок при экспорте, в то время как «визуальные хитрости» позволяют сохранить целостность таблицы при любых внешних выгрузках.

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

← На главную