Разработка и Конфигурация · 9 мин
Как программно объединить ячейки в табличном документе 1С
Как программно объединить ячейки в табличном документе 1С: метод Объединить(), работа с областями, типовые ошибки, примеры кода и проверка результата.
Объединение ячеек в табличном документе 1С выполняется методом Объединить(), который вызывается у области ячеек. Метод доступен как на сервере, так и на толстом клиенте, работает с любой прямоугольной областью — отдельной ячейкой, диапазоном или именованной областью макета. Это стандартный приём при формировании печатных форм: шапки отчётов, многострочные заголовки колонок, подписи и итоговые строки почти всегда строятся через объединение.
Ключевой момент, который часто упускают: объединяется не значение, а область. После вызова Объединить() несколько ячеек превращаются в одну, текст и параметры берутся из левой верхней ячейки диапазона, а содержимое остальных ячеек теряется. Поэтому порядок действий имеет значение — сначала обычно объединяют, потом заполняют текст, либо заранее переносят нужные данные в первую ячейку.
Ниже разобран синтаксис метода, способы получения области, объединение в макете и в уже сформированном документе, разъединение, типовые ошибки и проверка результата. Примеры приведены на встроенном языке 1С и работают в типовых конфигурациях на управляемых и обычных формах.
Метод Объединить(): синтаксис и базовый пример
Метод Объединить() вызывается у объекта типа ОбластьЯчеекТабличногоДокумента и не принимает параметров. Минимальный пример — объединение трёх ячеек первой строки:
ТабДок = Новый ТабличныйДокумент;
Область = ТабДок.Область("R1C1:R1C3");
Область.Объединить();
Область.Текст = "Отчёт по продажам";
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
Обратите внимание: после объединения объект области продолжает ссылаться на весь диапазон, поэтому свойства Текст, Шрифт, ЦветФона, ГоризонтальноеПоложение можно задавать через ту же переменную — они применятся к объединённой ячейке как к единому целому.
Если нужна постраничная адресация с переменными, удобнее использовать числовой вариант получения области: ТабДок.Область(НомерСтроки, НомерКолонкиС, НомерСтрокиПо, НомерКолонкиПо). Например, ТабДок.Область(2, 1, 3, 2).Объединить() объединит вертикальный блок 2×2 ячейки начиная со строки 2.
ТабДок = Новый ТабличныйДокумент;
Область = ТабДок.Область("R1C1:R1C3");
Область.Объединить();
Область.Текст = "Заголовок отчёта";
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;Получение области: по адресу, по имени, через макет
Способ получения области зависит от того, откуда берутся ячейки. Для пустого документа, который строится «с нуля», используется адресная адресация R1C1 или числовые координаты. Для документа, сформированного из макета, чаще применяют именованные области.
Если область объявлена в макете (например, «Шапка»), её получают через Макет.ПолучитьОбласть("Шапка") и затем выводят в результирующий документ методом ТабДок.Вывести(ОбластьМакета). Объединение, заданное в самом макете интерактивно, сохраняется при выводе автоматически — дополнительно вызывать Объединить() не нужно.
Если макет не содержит нужного объединения, его можно выполнить после вывода области в документ. Для этого запоминают позицию вывода через ТабДок.ВысотаТаблицы до вызова Вывести() и затем адресуются к нужным строкам и колонкам.
Объединение ячеек при выводе из макета
Типовая задача — объединить ячейки в строке, которая выводится из макета в цикле, например сгруппировать итог по нескольким колонкам. Порядок действий выглядит так:
- 1Получите область макета: ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаИтог")
- 2Запомните текущую высоту: СтрокаНач = ТабДок.ВысотаТаблицы + 1
- 3Выведите область: ТабДок.Вывести(ОбластьСтрока)
- 4Получите диапазон: ТабДок.Область(СтрокаНач, 2, СтрокаНач, 5)
- 5Вызовите Объединить() и задайте текст объединённой ячейки
ОбластьИтог = Макет.ПолучитьОбласть("СтрокаИтог");
СтрокаНач = ТабДок.ВысотаТаблицы + 1;
ТабДок.Вывести(ОбластьИтог);
Объединяемая = ТабДок.Область(СтрокаНач, 2, СтрокаНач, 5);
Объединяемая.Объединить();
Объединяемая.Текст = "Итого по документу:";
Такой подход безопасен, потому что координаты вычисляются от фактической высоты документа, а не зашиты константами. Если в коде используются фиксированные номера строк, любая вставка новой области выше сместит адресацию и объединение попадёт не на те ячейки.
Разъединение и повторное объединение
Обратная операция выполняется методом Разъединить() у той же области. После разъединения каждая ячейка диапазона снова становится самостоятельной, текст остаётся в левой верхней ячейке, остальные будут пустыми.
Перед повторным объединением желательно проверять текущее состояние. Попытка объединить область, которая частично пересекается с уже объединённой, приведёт к ошибке выполнения. Надёжный приём — сначала вызвать Разъединить() для затронутого диапазона в попытке, а затем выполнять новое объединение.
Попытка
ТабДок.Область(СтрокаНач, 1, СтрокаНач, 6).Разъединить();
Исключение
// Область не была объединена — ничего делать не нужно
КонецПопытки;
ТабДок.Область(СтрокаНач, 1, СтрокаНач, 3).Объединить();
Типичные ошибки и ограничения
Чаще всего разработчики сталкиваются с четырьмя проблемами. Первая — потеря текста: объединение выполняется после заполнения всех ячеек диапазона, и содержимое всех ячеек, кроме левой верхней, безвозвратно удаляется. Вторая — пересечение областей: объединить диапазон, часть которого уже входит в другое объединение, нельзя, платформа выдаст ошибку.
Третья ошибка — непрямоугольные области. Метод работает только с прямоугольными диапазонами; именованная область произвольной формы или область типа «колонки таблицы» для объединения не подходит. Четвёртая — работа с автоотчётами: в отчётах на СКД ячейки результата программно объединять поздно и бессмысленно, там группировку и шапку нужно настраивать в схеме компоновки, а не постобработкой табличного документа.
Проверка результата
После формирования документа полезно программно убедиться, что объединение применилось корректно. Проверить можно через свойства области: у объединённой ячейки ширина и высота охватывают весь диапазон, а обращение к любой «внутренней» ячейке возвращает ту же объединённую область.
Как проверить результат
Область("R1C2") возвращает диапазон R1C1:R1C3
Возвращается одиночная ячейка — объединение не сработало
Текст соответствует значению левой верхней ячейки
Текст пустой или обрезан — данные вводились в другую ячейку диапазона
В предварительном просмотре ячейка отображается как единая с корректным выравниванием
Видны границы внутри диапазона или текст уходит за край
Финальную проверку всегда выполняйте визуально: откройте сформированный документ или предварительный просмотр печати. Программные проверки не покажут проблем с переносом текста, высотой строки и границами, которые заметны только на экране.
Что важно запомнить
Объединение выполняется методом Объединить() у прямоугольной области табличного документа. Текст берётся из левой верхней ячейки, поэтому сначала объединяйте, потом заполняйте. Координаты вычисляйте от ВысотаТаблицы, а не константами. Пересечения объединённых областей недопустимы, для отмены используйте Разъединить().
Частые вопросы
Можно ли объединить ячейки по вертикали?
Да. Укажите диапазон, охватывающий несколько строк одной колонки, например ТабДок.Область("R2C1:R5C1").Объединить(). Ограничений на направление нет — важна только прямоугольная форма области.
Почему после объединения пропал текст?
При объединении сохраняется содержимое только левой верхней ячейки диапазона. Если текст был записан в другую ячейку, он удаляется. Решение — либо заполнять текст после вызова Объединить(), либо заранее переносить значение в первую ячейку диапазона.
Как объединить ячейки в отчёте на СКД?
Постобработка результата СКД — неправильный путь. Объединение и группировку заголовков нужно настраивать в макете схемы компоновки данных (закладка «Макеты» в настройках СКД) либо через собственный макет оформления. Там объединение задаётся как в обычном табличном документе.
Работает ли Объединить() в управляемых формах и на сервере?
Да, табличный документ и метод Объединить() доступны в серверном коде, в том числе в тонком и веб-клиенте через серверные вызовы. Ограничение одно: интерактивное отображение документа пользователю возможно только на клиенте, но само формирование и объединение выполняются на сервере без проблем.
Как узнать, объединена ли ячейка?
Достаточно сравнить адрес области, полученной по одиночной ячейке, с адресом самой ячейки: если ТабДок.Область("R2C1").Имя возвращает диапазон вида «R2C1:R5C1», ячейка входит в объединение. Отдельного булева свойства «объединена» у области нет.
Что делать, если при объединении возникает ошибка?
Почти всегда причина — пересечение с уже объединённой областью или непрямоугольный диапазон. Вызовите Разъединить() для затронутого диапазона в конструкции Попытка/Исключение, затем повторите объединение. Также проверьте, что координаты области существуют в документе и не выходят за его границы.