При формировании сложных печатных форм в 1С часто возникает ситуация, когда основной документ должен включать в себя фрагменты других макетов. Классический пример — угловой штамп организации или комиссии, который хранится в отдельном справочнике и может редактироваться пользователем. В этой статье мы подробно разберем, как реализовать вставку одного табличного документа в другой, обеспечив правильное позиционирование и сохранение всех данных.
Для начала вспомним стандартные инструменты работы с объектом ТабличныйДокумент. Большинство отчетов строятся с помощью методов Вывести() и Присоединить(). Рассмотрим их особенности:
Однако эти методы имеют существенное ограничение: они всегда работают относительно «курсора» (текущей позиции вывода). Если нам нужно вставить произвольный макет (например, штамп) в уже существующую структуру документа так, чтобы он не просто приклеился сбоку, а занял конкретное место, этих функций может быть недостаточно. Часто программисты сталкиваются с тем, что Присоединить() выводит область не там, где ожидалось, если структура строк основного документа сложная.
Когда требуется вставить один табличный документ в часть другого, наиболее эффективным инструментом является метод ВставитьОбласть(). Проанализируем его синтаксис:
ТабличныйДокумент.ВставитьОбласть(ИсходнаяОбласть, ОбластьПриемник, ТипСмещения, ТипЗаполнения)
Разберем параметры подробнее:
ТипСмещенияТабличногоДокумента.ПоВертикали).Посмотрим на практический пример кода, где мы берем штамп из отдельного макета и помещаем его в итоговый документ:
// Получаем макет штампа из справочника
МакетШтампа = Справочники.Комиссии.ПолучитьМакет("УгловойШтамп");
ОбластьШтампа = МакетШтампа.ПолучитьОбласть("Шапка");
// Определяем, куда именно в итоговом документе (ТабДок) мы хотим его вставить
// Предположим, у нас в основном макете есть пустая область-контейнер
ОбластьКудаВставлять = ТабДок.Область("R1C1:R5C5");
// Выполняем вставку
ТабДок.ВставитьОбласть(ОбластьШтампа, ОбластьКудаВставлять);
Частой проблемой при использовании ВставитьОбласть() является ситуация, когда границы и картинки переносятся, а текст (особенно если это параметры) исчезает. Выясним причину этого поведения.
Если в исходном макете ячейка определена как Параметр, то при простом копировании области в целевой документ 1С ожидает, что вы заполните этот параметр уже в новом документе. Рассмотрим правильную последовательность действий:
ПолучитьОбласть().ВставитьОбласть() для переноса уже заполненных данных в итоговый табличный документ.Проанализируем исправленный код:
// 1. Получаем область-источник
ИсходнаяОбласть = МакетШтампа.ПолучитьОбласть("Шапка");
// 2. Заполняем параметры конкретными данными комиссии
ИсходнаяОбласть.Параметры.НазваниеКомиссии = "Комиссия по закупкам";
ИсходнаяОбласть.Параметры.Дата = ТекущаяДата();
// 3. Выделяем диапазон ячеек внутри заполненной области
// Важно: берем именно Область(), а не всю переменную ИсходнаяОбласть
ОбластьДляКопирования = ИсходнаяОбласть.Область();
// 4. Вставляем в целевой документ
ТабДок.ВставитьОбласть(ОбластьДляКопирования, ТабДок.Область("R1C1:R5C5"));
При вставке одного документа в другой «сбоку» (справа), вы неизбежно столкнетесь с тем, что колонки вставляемой области подстроятся под ширину колонок целевого документа. Если в штампе была узкая колонка для номера, а в основном письме на этом месте широкая колонка с текстом, верстка штампа «развалится».
Рассмотрим альтернативное решение: Рисунок типа ТабличныйДокумент.
Если штамп имеет очень сложную структуру ячеек, которую невозможно вписать в сетку основного документа, мы можем воспользоваться объектом РисунокТабличногоДокумента. В 1С рисунок может содержать не только картинку, но и целый табличный документ.
Алгоритм действий в этом случае:
Рисунок.ТипРисункаТабличногоДокумента.ТабличныйДокумент.Объект этого рисунка наш сформированный макет штампа.Этот метод позволяет штампу сохранять свою собственную независимую сетку колонок и строк, находясь при этом внутри основного листа. Если же итоговый документ сохраняется в формате PDF и вам требуется брендировать его уже после генерации, можно применить обработку для добавления штампа в PDF-документы без использования сторонних библиотек.
Подводя итог, можно сказать, что выбор метода зависит от задачи. Если нужно просто добавлять данные последовательно — используйте Вывести() и Присоединить(). Если требуется вставить заранее подготовленный блок (макет) в конкретное место — используйте ВставитьОбласть(). А для случаев с конфликтующей шириной колонок идеальным решением станет внедрение через объект Рисунок. Помните о заполнении параметров до момента вставки, чтобы не потерять текстовую информацию. Если же вы хотите модифицировать уже сформированный табличный документ без изменения алгоритмов его построения, можно использовать инструмент для постобработки готовых печатных форм на основе методов БСП.