К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как объединить ячейки в 1С программно

Как объединить ячейки в 1С программно: метод Объединить() табличного документа, работа с областями, объединение по строкам и колонкам, типичные ошибки и примеры кода.

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

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

Где в 1С вообще объединяют ячейки

Объединение ячеек применимо только к табличным документам — это печатные формы, макеты отчётов, табличные документы на формах. В самих данных (таблицах значений, регистрах, справочниках) понятия «объединённая ячейка» не существует: там структура жёсткая, и склеить два поля нельзя. Если задача звучит как «объединить колонки в запросе», речь идёт о конкатенации строк, а не о ячейках.

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

Базовый синтаксис метода Объединить()

Метод вызывается у области табличного документа и не принимает параметров. Область предварительно получают одним из способов: по координатам, по имени именованной области или через ПолучитьОбласть() у макета. После вызова все ячейки внутри прямоугольника сливаются в одну.

ТабДок = Новый ТабличныйДокумент;

// Получаем область с 1-й по 3-ю колонку первой строки

ОбластьШапка = ТабДок.Область("R1C1:R1C3");

ОбластьШапка.Объединить();

ОбластьШапка.Текст = "Общий заголовок";

ТабДок.Показать("Пример объединения");

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

Обратная операция — метод Разъединить(). Он возвращает область к исходной сетке ячеек, при этом содержимое остаётся в левой верхней ячейке, остальные очищаются.

bsl
Область = ТабДок.Область("R2C1:R3C4");
Область.Объединить();
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
Область.Текст = "Итого по группе";

Объединение ячеек при выводе макета

Объединение в готовом макете конфигуратора

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

Динамическое объединение после вывода области

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

Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("Печать");

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

ТабДок = Новый ТабличныйДокумент;

СтрокаНачала = ТабДок.ВысотаТаблицы + 1;

ТабДок.Вывести(ОбластьСтрока);

// Объединяем колонки 2–4 в только что выведенной строке

АдресОбласти = "R" + СтрокаНачала + "C2:R" + СтрокаНачала + "C4";

ОбластьОбъединения = ТабДок.Область(АдресОбласти);

ОбластьОбъединения.Объединить();

ОбластьОбъединения.Текст = "Описание позиции";

Порядок действий при динамическом объединении
  1. 1
    Получите макет и нужную область через ПолучитьОбласть()
  2. 2
    Зафиксируйте текущую высоту табличного документа до вывода
  3. 3
    Выведите область методом Вывести() или Присоединить()
  4. 4
    Вычислите адрес диапазона по номерам строк и колонок
  5. 5
    Получите область методом Область() и вызовите Объединить()
  6. 6
    Заполните текст и оформление объединённой ячейки
  7. 7
    Проверьте результат на печатной форме или предпросмотре

Объединение по горизонтали и вертикали

Метод Объединить() одинаково работает для горизонтальных, вертикальных и прямоугольных диапазонов. Горизонтальное объединение (R1C1:R1C5) типично для заголовков, растянутых на несколько колонок. Вертикальное (R2C1:R5C1) применяют, когда одно значение относится к нескольким строкам — например, номер документа напротив списка его позиций.

Прямоугольное объединение (R2C2:R4C6) используют для крупных блоков — подписей, логотипов, полей «Примечание». Учтите: чем сложнее структура объединений, тем труднее потом программно адресоваться к соседним ячейкам, поскольку часть координат «поглощается» объединённой областью.

Способы объединения

В макете конфигуратора

Подходит для статичных форм; не требует кода, но не гибок при изменении структуры на лету

Метод Объединить() после вывода

Универсальный вариант для динамических форм; требует точного расчёта координат

Объединение в именованной области макета

Объединение сохраняется при каждом выводе области; удобно для повторяющихся шапок и подвалов

Оформление объединённой ячейки

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

ОбластьОбъединения.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;

ОбластьОбъединения.ВертикальноеПоложение = ВертикальноеПоложение.Центр;

ОбластьОбъединения.РазмещениеТекста = ТипСмещенияТабличногоДокумента.Переносить;

Рамки задаются через объект Линия и свойства ГраницаСверху, ГраницаСнизу и аналогичные. Важный нюанс: рамки применяются к внешнему контуру объединённой области, внутренних границ после склейки уже нет — если они нужны, объединять ячейки не следует.

Типичные ошибки и ограничения

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

Вторая группа проблем — неверные координаты. Адресация в формате R1C1 начинается с единицы, а после вывода нескольких областей легко ошибиться в смещении строк. Надёжный приём — всегда вычислять начальную строку через ВысотаТаблицы до вывода, как показано в примере выше, а не зашивать номера строк константами.

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

Типичные ошибки
01
Объединение области, пересекающейся с уже объединённой — ошибка выполнения; сначала вызовите Разъединить()
02
Жёстко зашитые номера строк вместо расчёта через ВысотаТаблицы — объединение попадает не в те ячейки при изменении данных
03
Заполнение текста до объединения — содержимое всех ячеек, кроме левой верхней, теряется
04
Попытка объединить ячейки табличной части или динамического списка — метод Объединить() существует только у областей табличного документа

Проверка результата

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

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

Контрольные точки

Как проверить результат

Положение объединённой области
Норма

Объединены именно нужные строки и колонки на любых данных

Тревожный признак

Область смещается при разном количестве строк документа

Содержимое ячейки
Норма

Текст полный, выровнен, переносится по строкам

Тревожный признак

Текст пропал или виден только фрагмент из одной исходной ячейки

Выгрузка в Excel
Норма

Объединение сохраняется, структура читается

Тревожный признак

Ячейки разъединены или сетка искажена

Частые вопросы

Можно ли объединить ячейки в табличной части документа?

Нет. Табличная часть — это структурированная коллекция строк с фиксированными колонками, а не табличный документ. Объединение возможно только на печатной форме или в отчёте, куда данные табличной части выводятся.

Как разъединить ранее объединённые ячейки?

Вызовите метод Разъединить() у той же области: ТабДок.Область("R1C1:R1C3").Разъединить(). Содержимое останется в левой верхней ячейке, остальные ячейки диапазона станут пустыми.

Что происходит с данными ячеек при объединении?

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

Как объединить ячейки в отчёте на СКД?

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

Почему возникает ошибка «Недопустимое объединение областей»?

Ошибка означает, что объединяемый диапазон пересекается с уже существующей объединённой областью. Найдите конфликтующую область, вызовите для неё Разъединить() и повторите объединение корректного диапазона.

Сохраняется ли объединение при сохранении в Excel?

Да, при сохранении табличного документа в формате XLS/XLSX объединённые ячейки переносятся как объединённые. Но сложные пересекающиеся структуры и нестандартное оформление стоит проверить на тестовом файле.

Итог

Что важно запомнить

Ячейки объединяются методом Объединить() у области табличного документа, полученной по координатам R1C1. Текст задавайте после объединения, координаты вычисляйте через ВысотаТаблицы, а пересечения с уже объединёнными областями устраняйте методом Разъединить().