Как объединить ячейки таблицы разных форматов строк в макете 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При доработке печатных форм (например, УПД, ТОРГ-12, счетов-фактур или актов) разработчики часто сталкиваются с ситуацией, когда табличный документ содержит строки с индивидуальным форматом колонок. Если попытаться объединить ячейки по вертикали между строками с разной структурой колонок, платформа 1С выдает блокировку или не выполняет объединение в интерактивном редакторе. Разберем причины такого поведения платформы, проанализируем частые ошибки при программной адресации и рассмотрим проверенные способы реализации требуемого макета.

Почему 1С запрещает объединение ячеек разного формата

Механизм Формат строк в табличном документе 1С позволяет задавать для конкретной строки или группы строк собственное количество колонок и их индивидуальную ширину, не влияя на соседние строки. Однако платформа налагает фундаментальное ограничение: невозможно объединить по вертикали ячейки, принадлежащие строкам с разным форматом.

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

Ошибки адресации ячеек в программном коде

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


// ОШИБКА: Переменная не определена (R29C2)
Область = ТабДок.Область(R29C2, R30C2, R31C2);

Платформа воспринимает конструкцию R29C2 как имя переменной 1С, которая не объявлена в коде. Адресация в формате R1C1 должна передаваться строковым литералом в кавычках либо числовыми координатами строк и колонок:


// Вариант 1: Использование строкового адреса в нотации R1C1
Область = ТабДок.Область("R29C2:R31C2");

// Вариант 2: Использование числовых индексов (Верх, Лево, Низ, Право)
Область = ТабДок.Область(29, 2, 31, 2);

// Попытка объединить:
Область.Объединить();

Важно помнить: даже при синтаксически верном обращении метод Область.Объединить() завершится ошибкой, если строки 29, 30 и 31 имеют несовпадающий формат колонок. Рассмотрим рабочие способы решения этой задачи.

Способ 1. Приведение строк к единому формату колонок

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

  1. Выделим строки макета, формат которых нужно вернуть к общей сетке.
  2. В главном меню редактора выберем пункт Таблица → Формат строк → Удалить формат строк (или воспользуемся пунктом Сделать формат строк таким же, как..., указав строку с базовым форматом).
  3. После того как координатная сетка строк станет однородной, выделим требуемый диапазон ячеек и выполним стандартное объединение через контекстное меню или панель инструментов.
  4. Если ширина колонок сместилась, скорректируем горизонтальные границы ячеек путем повторного объединения соседних колонок внутри строки.

Способ 2. Проектирование макета на модульной микросетке

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

  1. Создается единый формат для всех строк макета без использования индивидуальных форматов строк.
  2. Ширина колонок всего документа настраивается как «микросетка» — создается большое количество очень узких колонок (шириной от 1 до 3 символов).
  3. Любые элементы формы — широкие колонки таблицы, поля для подписей, текстовые блоки — формируются объединением нужного количества ячеек по горизонтали и вертикали.

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

Способ 3. Использование графического объекта «Текст» поверх таблицы

Если структура колонок зафиксирована типовым функционалом и сбросить формат строк невозможно, решением является использование графического текстового блока поверх макета:

  1. В главном меню перейдем в Таблица → Рисунки → Текст.
  2. Разместим текстовый блок поверх строк с разным форматом, закрывая нужный диапазон ячеек.
  3. В свойствах созданного объекта настроим цвет фона, тип и цвет границ (рамки), выравнивание текста и автоматический перенос.
  4. Привяжем границы объекта к ячейкам макета, чтобы при масштабировании печатной формы блок сохранял свои пропорции.
  5. Если текст блока должен формироваться динамически, в коде модуля печати обратимся к рисунку по имени:

РисунокТекст = ТабДок.Рисунки.Найти("ТекстПодписи", Тип("РисунокТабличногоДокумента"));
Если РисунокТекст <> Неопределено Тогда
    РисунокТекст.Текст = "Ответственное лицо: " + ИмяСотрудника;
КонецЕсли;

Способ 4. Программный вывод несвязанных областей

Если макет состоит из разнородных частей, разберем возможность разделения сложной структуры на отдельные именованные области. В коде формирования печатной формы области выводятся независимо:


// Вывод верхней части с собственным форматом
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);

// Вывод вертикальных колонок табличной части
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТаблицы");
Для Каждого Стр Из ДанныеТаблицы Цикл
    ОбластьСтрока.Параметры.Заполнить(Стр);
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

// Вывод подвала с независимым форматом колонок
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ТабДок.Вывести(ОбластьПодвал);

Такой подход позволяет формировать секции с совершенно разными форматами строк последовательно сверху вниз через метод ТабличныйДокумент.Вывести() без необходимости объединять ячейки на стыках секций.

← На главную