Разработка и Конфигурация · 10 мин
1С: как программно объединить ячейки в макете
Как в 1С программно объединить ячейки в макете табличного документа: метод Объединить, параметры макета, примеры кода, типичные ошибки и проверка результата.
Программное объединение ячеек в макете 1С — типовая задача при формировании печатных форм: шапки отчётов, итоговые строки, многострочные заголовки колонок. Объединение выполняется методом Объединить() области табличного документа либо заранее в конструкторе макета. Выбор способа зависит от того, статична структура макета или меняется в зависимости от данных.
Основная логика проста: вы обращаетесь к области табличного документа через метод Область(), указывая диапазон ячеек, и вызываете у этой области метод Объединить(). После объединения диапазон ведёт себя как одна ячейка: текст и оформление задаются для неё целиком.
Важно понимать разницу между двумя подходами. Объединение в самом макете (в конфигураторе) подходит для фиксированной структуры — например, заголовок «Акт сверки» на всю ширину таблицы. Программное объединение нужно, когда количество объединяемых колонок или строк вычисляется в момент формирования отчёта: число периодов, складов, колонок с показателями.
Как работает метод Объединить у области табличного документа
Табличный документ в 1С адресуется по принципу «строка–колонка». Область можно получить по имени (если она задана в макете) или по координатам вида R5C2:R5C8, где R — номер строки, C — номер колонки. Метод Объединить() вызывается именно у объекта «ОбластьЯчеекТабличногоДокумента».
Минимальный пример:
ТабДок = Новый ТабличныйДокумент;
Область = ТабДок.Область("R1C1:R1C6");
Область.Объединить();
Область.Текст = "Отчёт по продажам";
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
После вызова Объединить() обращение к любой ячейке внутри диапазона фактически работает с объединённой областью. Текст, шрифт, рамки и выравнивание применяются ко всей объединённой ячейке целиком. Если до объединения в ячейках были разные значения, сохранится содержимое левой верхней ячейки диапазона.
Метод не имеет параметров и не возвращает значения. Если область уже объединена, повторный вызов не вызывает ошибки — операция идемпотентна. Разъединение выполняется тем же методом Объединить() повторно либо методом Разъединить() в тех версиях платформы, где он доступен; надёжнее проверять свойство Объединение области, если логика это требует.
Объединение ячеек в конструкторе макета без кода
Если структура печатной формы постоянна, программное объединение не требуется вовсе. В конфигураторе откройте макет (например, макет печатной формы документа), выделите мышью нужный диапазон ячеек и в контекстном меню выберите «Объединить». Ячейки сольются в одну, и при выводе макета через ПолучитьОбласть() и Вывести() объединение сохранится автоматически.
Этот способ предпочтителен для шапок, подписей, строк «Итого», где количество колонок известно на этапе разработки. Преимущество очевидно: меньше кода, меньше места для ошибки, а визуально результат виден сразу в редакторе макета.
Ограничение подхода — статичность. Если отчёт строится по произвольному набору колонок (пользователь выбирает периоды, склады, аналитики), заранее объединить ячейки нельзя: диапазоны станут известны только в момент выполнения кода. Тогда без программного объединения не обойтись.
Два способа объединения
Подходит для фиксированной структуры формы. Не требует кода, но не работает при динамическом числе колонок.
Подходит для динамических отчётов и переменных диапазонов. Требует аккуратного расчёта координат строк и колонок.
Программное объединение при выводе макета: типовой сценарий
Классическая задача — отчёт с динамическим числом колонок. Например, шапка содержит заголовок, который должен занимать все колонки с данными, а их число зависит от выбранных периодов. Порядок действий такой:
- 1Выведите области макета в табличный документ через ПолучитьОбласть() и Вывести() или Присоединить()
- 2Определите координаты нужного диапазона: номер строки и границы колонок
- 3Получите область: ТабДок.Область("R" + НомСтроки + "C1:R" + НомСтроки + "C" + ЧислоКолонок)
- 4Вызовите у области метод Объединить()
- 5Задайте текст и выравнивание объединённой ячейки
- 6Выведите табличный документ на форму или в файл и проверьте результат визуально
Пример кода для шапки динамического отчёта:
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетОтчета");
// Выводим шапку с колонками
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
// Колонки периодов присоединяем справа
Для Каждого Период Из СписокПериодов Цикл
ОбластьКолонка = Макет.ПолучитьОбласть("КолонкаПериода");
ОбластьКолонка.Параметры.ИмяПериода = Период;
ТабДок.Присоединить(ОбластьКолонка);
КонецЦикла;
// Объединяем первую строку на всю ширину
ВсегоКолонок = 1 + СписокПериодов.Количество();
ОбластьЗаголовок = ТабДок.Область("R1C1:R1C" + ВсегоКолонок);
ОбластьЗаголовок.Объединить();
ОбластьЗаголовок.Текст = "Динамика показателей";
ОбластьЗаголовок.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
Ключевой момент — корректный расчёт координат. Номер строки зависит от того, сколько областей уже выведено, а номер последней колонки — от числа присоединённых блоков. Удобно запоминать позиции в переменных сразу после вывода: свойство ТабДок.ВысотаТаблицы даст номер последней заполненной строки, ТабДок.ШиринаТаблицы — последней колонки.
Объединение по вертикали и именованных областей
Объединять можно не только горизонтальные диапазоны. Вертикальное объединение применяется, когда значение (например, наименование группы товаров) должно занимать несколько строк детальных записей:
НачалоГруппы = ТабДок.ВысотаТаблицы + 1;
// ... вывод строк детальных записей ...
КонецГруппы = ТабДок.ВысотаТаблицы;
Если КонецГруппы > НачалоГруппы Тогда
ОбластьГруппа = ТабДок.Область("R" + НачалоГруппы + "C1:R" + КонецГруппы + "C1");
ОбластьГруппа.Объединить();
ОбластьГруппа.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
КонецЕсли;
Также метод Объединить() работает с областями, полученными по имени: ТабДок.Область("Шапка"). Однако именованная область, определённая в макете, при выводе копируется в табличный документ вместе со своими свойствами, и если объединение уже задано в макете, программно его дублировать не нужно.
Типичные ошибки и ограничения
Самая частая ошибка — неверные координаты диапазона. Если указать строку, которой ещё нет в документе, или перепутать порядок адресации, объединение либо не сработает, либо захватит лишние ячейки. Всегда проверяйте ВысотаТаблицы и ШиринаТаблицы перед формированием адреса.
Вторая группа проблем — пересечение объединённых областей. Если попытаться объединить диапазон, частично перекрывающий уже объединённую область, поведение может быть неочевидным: платформа не всегда выдаёт явную ошибку, но структура документа нарушается, и при выгрузке в Excel возникают «разорванные» ячейки.
Отдельное ограничение касается расшифровки и параметров. После объединения параметр расшифровки задаётся для всей объединённой ячейки целиком. Если внутри диапазона были ячейки с разными расшифровками, останется одна — учитывайте это в интерактивных отчётах.
Проверка результата и отладка
После формирования документа проверьте результат визуально: выведите табличный документ на форму или сохраните в файл ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.MXL) и откройте. Объединённая ячейка должна выделяться как единое целое, текст — позиционироваться согласно заданному выравниванию.
Как проверить результат
Выделяется весь объединённый диапазон как одна ячейка
Ячейки выделяются по отдельности — объединение не сработало
Объединение сохраняется, структура колонок ровная
Появляются лишние столбцы или разорванные ячейки
Отображается полностью с заданным выравниванием
Текст обрезан или унаследовано неверное значение
Для отладки координат полезен приём: временно раскрасьте целевую область перед объединением (Область.ЦветФона = WebЦвета.СветлоЖелтый). Если подсветилась не та область — ошибка в расчёте адресов, и её проще найти до объединения.
FAQ: частые вопросы по объединению ячеек в 1С
Можно ли разъединить ячейки программно?
Да. У той же области вызовите метод Разъединить(), а если он недоступен в вашей версии платформы — повторный вызов Объединить() для ряда конфигураций работает как переключатель. Перед операцией проверьте состояние области, чтобы не получить обратный эффект.
Почему после объединения пропал текст из части ячеек?
При объединении сохраняется только содержимое левой верхней ячейки диапазона. Записывайте итоговый текст в область уже после вызова Объединить() или заранее убедитесь, что нужное значение находится в первой ячейке диапазона.
Работает ли объединение при выводе через СКД?
В схеме компоновки данных структурой макета управляет сама СКД, и прямое программное объединение ячеек результата не предусмотрено. Для нестандартных заголовков используют макеты оформления СКД или формируют документ вручную через ТабличныйДокумент без компоновки.
Как объединить ячейки в уже существующем файле MXL?
Загрузите файл в табличный документ методом ТабДок.Прочитать(ИмяФайла), затем работайте с областями обычным способом: Область(...).Объединить(). После изменений сохраните файл методом Записать().
Сохранится ли объединение при выгрузке в Excel?
Да, табличный документ 1С корректно переносит объединённые ячейки в формат Excel. Проблемы возникают только при пересекающихся или некорректно заданных областях, поэтому перед выгрузкой стоит проверить документ визуально.
Что выбрать: объединение в макете или в коде?
Если число объединяемых ячеек известно на этапе разработки — объединяйте в макете, это проще и надёжнее. Программное объединение оправдано только при динамической структуре: переменном числе колонок, группировках с объединением по вертикали, универсальных отчётах.
Что важно запомнить
Программное объединение выполняется методом Объединить() у области табличного документа после её вывода. Координаты диапазона рассчитывайте по ВысотаТаблицы и ШиринаТаблицы, текст задавайте после объединения, а для статичных форм используйте объединение прямо в макете.