При доработке печатных форм (например, УПД, ТОРГ-12, счетов-фактур или актов) разработчики часто сталкиваются с ситуацией, когда табличный документ содержит строки с индивидуальным форматом колонок. Если попытаться объединить ячейки по вертикали между строками с разной структурой колонок, платформа 1С выдает блокировку или не выполняет объединение в интерактивном редакторе. Разберем причины такого поведения платформы, проанализируем частые ошибки при программной адресации и рассмотрим проверенные способы реализации требуемого макета.
Механизм Формат строк в табличном документе 1С позволяет задавать для конкретной строки или группы строк собственное количество колонок и их индивидуальную ширину, не влияя на соседние строки. Однако платформа налагает фундаментальное ограничение: невозможно объединить по вертикали ячейки, принадлежащие строкам с разным форматом.
Поскольку сетка колонок в таких строках физически не совпадает (координаты вертикальных линий и их количество различны), платформа не может построить единый прямоугольный диапазон. Попытка обойти это ограничение программно через метод Объединить() также приведет к ошибке во время выполнения.
Рассмотрим частую синтаксическую ошибку, возникающую при попытке указать диапазон ячеек табличного документа. Посмотрим на некорректный вызов:
// ОШИБКА: Переменная не определена (R29C2)
Область = ТабДок.Область(R29C2, R30C2, R31C2);
Платформа воспринимает конструкцию R29C2 как имя переменной 1С, которая не объявлена в коде. Адресация в формате R1C1 должна передаваться строковым литералом в кавычках либо числовыми координатами строк и колонок:
// Вариант 1: Использование строкового адреса в нотации R1C1
Область = ТабДок.Область("R29C2:R31C2");
// Вариант 2: Использование числовых индексов (Верх, Лево, Низ, Право)
Область = ТабДок.Область(29, 2, 31, 2);
// Попытка объединить:
Область.Объединить();
Важно помнить: даже при синтаксически верном обращении метод Область.Объединить() завершится ошибкой, если строки 29, 30 и 31 имеют несовпадающий формат колонок. Рассмотрим рабочие способы решения этой задачи.
Самый простой и логичный путь — отказаться от раздельного формата колонок для тех строк, которые необходимо связать общими вертикальными блоками.
Проанализируем профессиональный подход к созданию сложных регламентированных форм, в которых присутствует множество разнородных блоков (шапка, реквизиты сторон, подписи, табличная часть). Чтобы полностью исключить проблемы с объединением строк:
При таком подходе вертикальные и горизонтальные границы ячеек согласованы по всему документу, что дает полную свободу объединения в любых секциях.
Если структура колонок зафиксирована типовым функционалом и сбросить формат строк невозможно, решением является использование графического текстового блока поверх макета:
РисунокТекст = ТабДок.Рисунки.Найти("ТекстПодписи", Тип("РисунокТабличногоДокумента"));
Если РисунокТекст <> Неопределено Тогда
РисунокТекст.Текст = "Ответственное лицо: " + ИмяСотрудника;
КонецЕсли;
Если макет состоит из разнородных частей, разберем возможность разделения сложной структуры на отдельные именованные области. В коде формирования печатной формы области выводятся независимо:
// Вывод верхней части с собственным форматом
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
// Вывод вертикальных колонок табличной части
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТаблицы");
Для Каждого Стр Из ДанныеТаблицы Цикл
ОбластьСтрока.Параметры.Заполнить(Стр);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
// Вывод подвала с независимым форматом колонок
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ТабДок.Вывести(ОбластьПодвал);
Такой подход позволяет формировать секции с совершенно разными форматами строк последовательно сверху вниз через метод ТабличныйДокумент.Вывести() без необходимости объединять ячейки на стыках секций.