При формировании печатных форм в системе 1С:Предприятие 7.7 разработчики часто сталкиваются с задачей группировки данных. Классический пример: при выводе таблицы значений необходимо объединить по вертикали повторяющиеся ячейки в первой колонке (например, название группы товаров, контрагента или склада), оставив детальные строки в соседних колонках обособленными. Это делает документ визуально структурированным и удобным для чтения.
В этой статье мы подробно разберем, как решить эту задачу на платформе 1С 7.7. Мы проанализируем три основных подхода: классический программный метод с использованием штатной функции Объединить(), способ визуальной имитации через управление свойствами границ ячеек, а также профессиональное решение с использованием сторонней компоненты «Йоксель».
Этот метод основан на использовании встроенного языка 1С 7.7. Главная сложность здесь заключается в том, что мы не можем объединить ячейки непосредственно в момент вывода строки методом ВывестиСекцию(), поскольку на этом этапе табличный документ еще не сформирован до конца, и мы не знаем точных координат будущих строк.
Для реализации этой логики мы должны применить двухэтапный алгоритм: сначала последовательно выводить строки в цикле, фиксируя координаты начала и окончания группы одинаковых значений, а затем обращаться к полученной области и производить физическое объединение ячеек.
Разберем по шагам программный алгоритм:
ВысотаТаблицы()).Рассмотрим пример готового кода, реализующего данный алгоритм:
// Создаем объект Таблица и выводим заголовок
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Печать");
Таб.ВывестиСекцию("Заголовок");
// Предположим, что у нас есть ТаблицаЗначений под именем ТЗ_Данные
// Сортируем ее по ключевой колонке "Группа"
ТЗ_Данные.Сортировать("Группа");
НачалоОбъединения = 0;
ТекущаяГруппа = "";
ТЗ_Данные.ВыбратьСтроки();
Пока ТЗ_Данные.ПолучитьСтроку() = 1 Цикл
// Выводим очередную детальную строку
Таб.ВывестиСекцию("Строка");
НомерСтрокиТЗ = ТЗ_Данные.НомерСтроки;
ВсегоСтрокТЗ = ТЗ_Данные.КоличествоСтрок();
Если НомерСтрокиТЗ = 1 Тогда
// Для первой строки просто запоминаем значение и стартовую позицию в печатной форме
ТекущаяГруппа = ТЗ_Данные.Группа;
НачалоОбъединения = Таб.ВысотаТаблицы();
Иначе
// Если значение в ключевой колонке изменилось
Если ТЗ_Данные.Группа <> ТекущаяГруппа Тогда
КонецОбъединения = Таб.ВысотаТаблицы() - 1; // Предыдущая строка
// Если в группе было больше одной строки, выполняем объединение
Если КонецОбъединения > НачалоОбъединения Тогда
ОбластьГруппы = Таб.Область("R" + НачалоОбъединения + "C1:R" + КонецОбъединения + "C1");
ОбластьГруппы.Объединить();
ОбластьГруппы.ВертикальноеПоложение(3); // 3 — выравнивание по центру, 1 — по верху, 2 — по низу
КонецЕсли;
// Фиксируем начало новой группы
ТекущаяГруппа = ТЗ_Данные.Группа;
НачалоОбъединения = Таб.ВысотаТаблицы();
КонецЕсли;
КонецЕсли;
// Отдельно обрабатываем достижение последней строки таблицы значений
Если НомерСтрокиТЗ = ВсегоСтрокТЗ Тогда
КонецОбъединения = Таб.ВысотаТаблицы();
Если КонецОбъединения > НачалоОбъединения Тогда
ОбластьГруппы = Таб.Область("R" + НачалоОбъединения + "C1:R" + КонецОбъединения + "C1");
ОбластьГруппы.Объединить();
ОбластьГруппы.ВертикальноеПоложение(3);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Таб.Показать();
Важное примечание: Данный штатный подход отлично работает на небольших объемах данных (примерно до 50–100 строк). Если ваша печатная форма содержит сотни или тысячи строк, вы столкнетесь с серьезными проблемами производительности табличного движка 1С 7.7. Процесс выполнения метода Объединить() начнет резко тормозить формирование отчета. Кроме того, при наличии вертикально объединенных ячеек встроенный механизм экспорта в Excel (XLS) часто работает некорректно и может вызывать зависание системы, особенно если для ячеек включено свойство «Автовысота».
Если печатная форма содержит значительное количество строк, а зависания и медленная работа недопустимы, мы можем прибегнуть к «хитрости» — визуальной имитации объединения. Этот прием часто называют методом невидимых границ (invisible borders).
Суть метода заключается в том, что мы физически не объединяем ячейки. Вместо этого мы выводим текст группировки только в самой первой ячейке группы, а у всех последующих строк этой группы очищаем текст. При этом у смежных ячеек программно стираются горизонтальные линии сетки (границы).
Разберем, как реализовать этот алгоритм:
Преимущества визуальной имитации:
Объединить()).Недостатки метода:
Для крупных проектов и сложных отчетов оптимальным решением является использование внешней компоненты Йоксель (библиотека SpreadSheet.dll). Это мощная альтернатива штатному табличному документу 1С 7.7, которая полностью заменяет стандартный движок отображения и печати таблиц.
Йоксель позволяет выполнять полноценное физическое объединение ячеек любой сложности без какого-либо падения производительности платформы. Он оптимизирован для работы со сложной структурой ячеек и гарантирует стабильный, быстрый экспорт документов в форматы Excel (XLS/XLSX) и PDF.
Основные возможности Йокселя при работе с объединением ячеек:
Для интеграции Йокселя в вашу конфигурацию достаточно зарегистрировать библиотеку в системе и использовать ее объекты через СоздатьОбъект("ТабличныйДокумент") вместо стандартного вызова СоздатьОбъект("Таблица").
Мы проанализировали три различных способа группировки данных в печатных формах 1С 7.7. Выбор конкретного метода зависит от технических условий вашей задачи:
Объединить()). Он прост в реализации и не требует сторонних библиотек.