Разработка и Конфигурация · 10 мин
Как объединить ячейки в макете 1С программно
Как объединить ячейки в макете 1С программно: метод Объединить(), работа с областями табличного документа, типовые ошибки и примеры кода на встроенном языке.
Объединение ячеек в табличном документе 1С — стандартная задача при формировании печатных форм: шапки накладных, подписи, группировочные строки отчётов. В конфигураторе это делается мышкой через свойство «Объединение», но когда макет строится динамически или одна область должна адаптироваться под данные, требуется программный способ.
Во встроенном языке 1С за объединение отвечает метод Объединить() объекта «ОбластьЯчеекТабличногоДокумента». Он работает только с прямоугольной областью, полученной через Область() табличного документа. Понимание того, как адресуются ячейки и какие ограничения накладывает метод, избавляет от большинства ошибок.
Ниже разобран синтаксис метода, способы получения области, объединение в макете и в результирующем табличном документе, а также типичные проблемы: пересечение с уже объединёнными ячейками, потеря текста и ошибки при выводе областей.
Как работает метод Объединить() в табличном документе
Метод Объединить() вызывается у области ячеек табличного документа и превращает прямоугольный диапазон в одну ячейку. Синтаксис минимальный: сначала получаем область, затем вызываем метод без параметров.
ТабДок = Новый ТабличныйДокумент;
Область = ТабДок.Область("R1C1:R1C5");
Область.Объединить();
Область.Текст = "Шапка документа";
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
Важная особенность: после объединения содержимым новой ячейки становится значение левой верхней ячейки диапазона. Текст и параметры остальных ячеек безвозвратно удаляются. Поэтому заполнять текст лучше уже после объединения — так исключается случайная потеря данных.
Обратная операция — метод Разъединить(). Он снимает объединение, но не восстанавливает ранее удалённое содержимое ячеек. Это стоит учитывать, если макет модифицируется динамически в зависимости от условий.
Способы получить область для объединения
Метод Область() принимает адрес в нескольких форматах, и выбор формата зависит от того, откуда берутся координаты. Самый читаемый — строковый адрес в нотации R1C1.
Три рабочих варианта:
ТабДок.Область("R2C3:R2C8")— по строковому адресу диапазона;ТабДок.Область(2, 3, 2, 8)— по числовым координатам: строка начала, колонка начала, строка конца, колонка конца;ТабДок.Область("ИмяОбласти")— по имени именованной области, заданной в макете.
Числовой вариант удобен в циклах, когда границы диапазона вычисляются. Строковый — нагляднее для фиксированных адресов. Именованные области стоит использовать, когда макет заранее подготовлен в конфигураторе и логика привязана к его структуре.
// Объединение в цикле по вычисляемым координатам
Для НомерСтроки = 3 По 10 Цикл
ОбластьСтроки = ТабДок.Область(НомерСтроки, 1, НомерСтроки, 4);
ОбластьСтроки.Объединить();
КонецЦикла;
Область = ТабДок.Область("R1C1:R1C5");
Область.Объединить();
Область.Текст = "Заголовок";Объединение ячеек при выводе областей макета
Частый сценарий: макет содержит отдельные ячейки, но в зависимости от данных часть из них нужно объединить после вывода. Например, если у товара нет характеристики, две колонки сливаются в одну широкую.
Порядок действий: вывести область макета методом Вывести() или Присоединить(), затем получить область в результирующем документе по координатам и объединить. Координаты выведенной области возвращает метод Вывести() — он отдаёт структуру с границами, либо используется ТабДок.ВысотаТаблицы до и после вывода.
ВысотаДо = ТабДок.ВысотаТаблицы;
ТабДок.Вывести(ОбластьМакета);
// Область макета заняла строки с ВысотаДо+1 по ТабДок.ВысотаТаблицы
Область = ТабДок.Область(ВысотаДо + 1, 2, ТабДок.ВысотаТаблицы, 4);
Область.Объединить();
Альтернатива — заранее подготовить в макете два варианта области: с объединёнными ячейками и без, и выбирать нужный по условию. Это надёжнее программного объединения, потому что внешний вид контролируется визуально в конфигураторе, а не вычисляется в рантайме.
Как выбрать подход
Объединение по вертикали и группировка строк
Вертикальное объединение применяется для повторяющихся значений в группах: номер заказа напротив нескольких строк товаров, общий комментарий к блоку. Синтаксис тот же — диапазон охватывает несколько строк в одной колонке.
// Номер заказа напротив строк 5–12 в первой колонке
Область = ТабДок.Область("R5C1:R12C1");
Область.Объединить();
Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
При группировке в цикле важно запоминать строку начала группы. Когда группа заканчивается (меняется ключевое поле), объединяется диапазон от сохранённой строки до текущей. Объединять диапазон из одной строки не нужно — это лишний вызов, а в некоторых случаях источник путаницы при последующем разъединении.
Для вертикально объединённых ячеек почти всегда требуется выравнивание по центру по вертикали и включённое свойство РазмещениеТекста со значением «Переносить», иначе длинный текст обрежется по ширине одной колонки.
- 1Сформируйте табличный документ или выведите нужные области макета
- 2Определите координаты диапазона: фиксированные или вычисленные по ВысотаТаблицы
- 3Получите область: ТабДок.Область("R1C1:R1C5") или по числовым координатам
- 4Вызовите Область.Объединить()
- 5Заполните текст и задайте выравнивание уже после объединения
- 6Проверьте результат на печатной форме: текст, границы, перенос строк
Типичные ошибки и ограничения метода
Главное ограничение: метод работает только с прямоугольными областями. Попытка объединить несмежные ячейки или область со «ступенькой» вызовет ошибку. Также нельзя объединить диапазон, пересекающийся с уже существующим объединением, — сначала нужно вызвать Разъединить() для пересекающейся области.
Вторая частая проблема — потеря текста. Если до объединения текст был в правой или нижней ячейке диапазона, после объединения он исчезнет. Правило простое: заполняйте левую верхнюю ячейку или присваивайте текст после вызова метода.
Третья группа ошибок связана с именованными областями. Если в макете ячейки уже объединены вручную, а код пытается объединить пересекающийся диапазон, возникнет исключение. Перед программным объединением область, полученную из макета, иногда безопаснее сначала разъединить.
Объединение ячеек в СКД и готовых отчётах
Если печатная форма строится через систему компоновки данных, программное объединение в готовом табличном документе — крайняя мера. Правильное место для объединения — макет СКД: в редакторе макета ячейки объединяются визуально, как в обычном макете, и результат сохраняется в схеме.
Постобработка результата компоновки оправдана только когда структура объединения зависит от данных и не выражается в макете. В этом случае обходите табличный документ после ПроцессорВывода, находите нужные области по тексту или координатам и объединяйте. Учтите, что такой код хрупок: изменение макета СКД сломает привязку к координатам.
Проверка результата и отладка
После объединения проверьте три вещи: текст на месте и читается, границы ячейки соответствуют ожидаемому диапазону, печатная форма корректно разбивается на страницы. Быстрый способ отладки — вывести табличный документ на форму и визуально сверить с эталоном.
Для программной проверки можно получить ту же область повторно и прочитать её свойства: у объединённой области Текст возвращает значение объединённой ячейки, а попытка обратиться к внутренней ячейке диапазона покажет, что она является частью объединения.
Как проверить результат
Отображается значение левой верхней ячейки или присвоенное после объединения
Текст пуст или пропал — заполняли до объединения не ту ячейку
Рамка охватывает весь диапазон как единая ячейка
Внутри видны разрывы линий — диапазон объединён не полностью
Объединённая область не разрывается между страницами некорректно
Ячейка обрезана — проверьте высоту строк и размещение текста
Частые вопросы
Можно ли объединить ячейки в уже существующем файле Excel через 1С?
Напрямую метод Объединить() работает только с объектом ТабличныйДокумент. Для файла Excel сначала загрузите его в табличный документ методом Прочитать(), выполните объединение и сохраните обратно. Либо используйте COM-объект Excel с его собственным методом Range.Merge, если работа идёт на Windows с установленным Office.
Почему после Объединить() пропал текст?
Метод сохраняет содержимое только левой верхней ячейки диапазона. Если текст был в другой ячейке, он удаляется. Решение: присваивайте текст свойству области уже после вызова Объединить() или заранее переносите значение в левую верхнюю ячейку.
Как объединить ячейки по горизонтали в цикле для каждой строки?
Используйте числовые координаты: ТабДок.Область(НомерСтроки, КолонкаНачала, НомерСтроки, КолонкаКонца).Объединить(). Номер строки вычисляйте через ТабДок.ВысотаТаблицы после каждого вывода области макета.
Что делать, если возникает ошибка «область пересекается с объединённой»?
Сначала вызовите Разъединить() для пересекающейся области или для всего затронутого диапазона, затем выполняйте новое объединение. Учтите, что разъединение не восстановит ранее удалённый текст — его нужно заполнить заново.
Работает ли Объединить() для областей, полученных из макета по имени?
Да, именованная область — тот же объект ОбластьЯчеекТабличногоДокумента. Но если внутри неё уже есть объединённые ячейки из макета, новое пересекающееся объединение вызовет ошибку. Проверяйте структуру макета или разъединяйте область перед изменениями.
Можно ли отменить объединение без потери данных?
Метод Разъединить() снимает объединение, но удалённое при объединении содержимое ячеек не восстанавливает. Если откат критичен, храните копию табличного документа или значений ячеек до вызова Объединить().
Что важно запомнить
Объединение выполняется методом Область("R1C1:R1C5").Объединить() у табличного документа. Текст сохраняется только из левой верхней ячейки — заполняйте его после объединения. Пересечение с существующими объединениями вызывает ошибку, а для статичных форм надёжнее объединять ячейки прямо в макете конфигуратора.