Как объединить ячейки с одинаковыми значениями в печатной форме 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

Метод №1. Штатное программное объединение с использованием метода Объединить()

Этот метод основан на использовании встроенного языка 1С 7.7. Главная сложность здесь заключается в том, что мы не можем объединить ячейки непосредственно в момент вывода строки методом ВывестиСекцию(), поскольку на этом этапе табличный документ еще не сформирован до конца, и мы не знаем точных координат будущих строк.

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

Разберем по шагам программный алгоритм:

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

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


// Создаем объект Таблица и выводим заголовок
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Печать");
Таб.ВывестиСекцию("Заголовок");

// Предположим, что у нас есть ТаблицаЗначений под именем ТЗ_Данные
// Сортируем ее по ключевой колонке "Группа"
ТЗ_Данные.Сортировать("Группа");

НачалоОбъединения = 0;
ТекущаяГруппа = "";

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

Таб.Показать();

Важное примечание: Данный штатный подход отлично работает на небольших объемах данных (примерно до 50–100 строк). Если ваша печатная форма содержит сотни или тысячи строк, вы столкнетесь с серьезными проблемами производительности табличного движка 1С 7.7. Процесс выполнения метода Объединить() начнет резко тормозить формирование отчета. Кроме того, при наличии вертикально объединенных ячеек встроенный механизм экспорта в Excel (XLS) часто работает некорректно и может вызывать зависание системы, особенно если для ячеек включено свойство «Автовысота».

Метод №2. Визуальная имитация (скрытие горизонтальных границ ячеек)

Если печатная форма содержит значительное количество строк, а зависания и медленная работа недопустимы, мы можем прибегнуть к «хитрости» — визуальной имитации объединения. Этот прием часто называют методом невидимых границ (invisible borders).

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

Разберем, как реализовать этот алгоритм:

  1. При выводе первой строки группы выводим значение ключевого поля. При этом нижняя граница ячейки делается невидимой (или белого цвета).
  2. В последующих строках этой же группы мы вообще не выводим текст в первую колонку (оставляем ее пустой), а также убираем у ячеек верхнюю и нижнюю границы.
  3. На последней строке группы мы восстанавливаем нижнюю границу (делаем ее стандартной черной линией), чтобы визуально отделить группу от следующей.

Преимущества визуальной имитации:

Недостатки метода:

Метод №3. Использование внешней компоненты «Йоксель» (Yoksel)

Для крупных проектов и сложных отчетов оптимальным решением является использование внешней компоненты Йоксель (библиотека SpreadSheet.dll). Это мощная альтернатива штатному табличному документу 1С 7.7, которая полностью заменяет стандартный движок отображения и печати таблиц.

Йоксель позволяет выполнять полноценное физическое объединение ячеек любой сложности без какого-либо падения производительности платформы. Он оптимизирован для работы со сложной структурой ячеек и гарантирует стабильный, быстрый экспорт документов в форматы Excel (XLS/XLSX) и PDF.

Основные возможности Йокселя при работе с объединением ячеек:

Для интеграции Йокселя в вашу конфигурацию достаточно зарегистрировать библиотеку в системе и использовать ее объекты через СоздатьОбъект("ТабличныйДокумент") вместо стандартного вызова СоздатьОбъект("Таблица").

Резюме и рекомендации

Мы проанализировали три различных способа группировки данных в печатных формах 1С 7.7. Выбор конкретного метода зависит от технических условий вашей задачи:

← На главную