Как реализовать вертикальное объединение ячеек в отчете 1С

Программист 1С v8.3 (Обычные формы)
← На главную

При формировании отчетов в «1С:Предприятие» часто возникает визуальная задача: объединить повторяющиеся значения в колонках по вертикали, чтобы отчет выглядел более структурированным и читаемым. В платформе 8.1 и более поздних версиях это можно сделать несколькими способами. Проанализируем ситуацию и разберем наиболее эффективные методы реализации этой задачи.

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

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

Рассмотрим пошаговый алгоритм реализации этого метода:

  1. Определяем номер колонки, в которой необходимо выполнить объединение.
  2. Запускаем цикл по строкам табличного документа.
  3. Сравниваем значение текущей ячейки со значением в следующей строке.
  4. Если значения идентичны, мы запоминаем начало диапазона и продолжаем проверку.
  5. Как только значения перестают совпадать, вызываем метод Объединить() для найденного диапазона.

Посмотрим на пример кода, реализующий данную логику:


Процедура ОбъединитьПовторяющиесяЗначения(ТабДок, НомерКолонки)
    
    КоличествоСтрок = ТабДок.ВысотаТаблицы;
    ВерхняяСтрока = 0;
    
    Для НомерСтроки = 1 По КоличествоСтрок Цикл
        
        ТекЗначение = ТабДок.Область(НомерСтроки, НомерКолонки).Текст;
        
        Если НомерСтроки < КоличествоСтрок Тогда
            СледЗначение = ТабДок.Область(НомерСтроки + 1, НомерКолонки).Текст;
        Иначе
            СледЗначение = "---КОНЕЦ_ТАБЛИЦЫ---";
        КонецЕсли;
        
        Если ТекЗначение = СледЗначение И ТекЗначение <> "" Тогда
            Если ВерхняяСтрока = 0 Тогда
                ВерхняяСтрока = НомерСтроки;
            КонецЕсли;
        Иначе
            Если ВерхняяСтрока <> 0 Тогда
                // Выделяем область для объединения
                ОбластьОбъединения = ТабДок.Область(ВерхняяСтрока, НомерКолонки, НомерСтроки, НомерКолонки);
                ОбластьОбъединения.Объединить();
                
                // Устанавливаем красивое выравнивание по центру
                ОбластьОбъединения.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
                
                ВерхняяСтрока = 0;
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Важный нюанс: при выполнении объединения программно, текст остается только в первой ячейке объединенной области. Поэтому при последующем обращении к нижним ячейкам через свойство Текст, они могут вернуть пустую строку. Именно поэтому алгоритм должен сначала вычислить границы, а потом вызывать Объединить().

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

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

Разберем, как это настроить:

  1. Откройте схему компоновки данных и перейдите на вкладку Настройки.
  2. Выберите нужную группировку или отчет в целом.
  3. Перейдите на закладку Другие настройки.
  4. Найдите параметр Расположение группировок.
  5. Установите значение Вместе или Отдельно и в начале.
  6. Для управления именно слиянием ячеек обратите внимание на свойство Вертикальное объединение. Если установить его в «Да», система автоматически объединит одинаковые значения в колонках группировок.

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

Способ 3. Оптимизация производительности (алгоритм «Снизу вверх»)

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

Для оптимизации профессиональные разработчики рекомендуют:

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


// Пример структуры для хранения границ:
// СтруктураОбъединения = Новый Структура("Верх, Низ", 5, 12);
СписокОбластей = Новый Массив;
// ... (заполнение списка логикой сравнения) ...

// Итоговый проход по уже вычисленным координатам
Для Каждого Границы Из СписокОбластей Цикл
    ТабДок.Область(Границы.Верх, Кол, Границы.Низ, Кол).Объединить();
КонецЦикла;

Особенности при экспорте в Excel

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

Чтобы избежать проблем при экспорте:

  1. Убедитесь, что свойство ВертикальноеПоложение установлено в значение Центр.
  2. Проверьте, что в макете для объединяемых ячеек включено свойство РазмещениеТекста = Переносить, если текст длинный.
  3. Помните, что при объединении ячеек в 1С, в файле Excel физически данные будут находиться только в верхней левой ячейке области, остальные будут пустыми. Это стандартное поведение формата .xls и .xlsx.

Итоги

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

← На главную