Почему при сохранении печатной формы 1С в PDF выгружается незаполненный макет

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

При выгрузке печатных форм документов в формат PDF или XML разработчики периодически сталкиваются с ситуацией, когда созданный файл содержит не заполненные данные документа, а исходный шаблон со служебными наименованиями параметров (например, [НомерДокумента], [Контрагент]). Проанализируем причину возникновения этой проблемы и разберем корректную архитектуру работы с табличными документами в 1С.

Выясняем причину: повторное получение макета из метаданных

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


// Формирование печатной формы
ФормированиеПечатнойФормыАкт(МакетПриемник, ОбъектДокумент);

// Ошибка: переназначение переменной
МакетПриемник = ПолучитьМакет("Акт");

// Сохранение в файл
МакетПриемник.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);

Разберем по шагам, что происходит во время выполнения этого кода:

  1. Процедура ФормированиеПечатнойФормыАкт получает объект типа ТабличныйДокумент и заполняет его данными на основе выбранного документа.
  2. Сразу после этого вызывается метод ПолучитьМакет("Акт"). Этот метод запрашивает из метаданных конфигурации исходный, не замененный значениями шаблон макета и перезаписывает им переменную МакетПриемник.
  3. В момент вызова метода Записать() в переменной находится не заполненный табличный документ, а исходный макет из конфигуратора. В результат попадает шаблон с названиями переменных.

Правильная архитектура формирования и сохранения печатной формы

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

Разберем правильный алгоритм работы с табличным документом:

  1. Создаем новый экземпляр приемника: ТабДок = Новый ТабличныйДокумент; или очищаем имеющийся: ТабДок.Очистить();.
  2. Получаем макет-шаблон из конфигуратора: Макет = ПолучитьМакет("Акт");.
  3. Получаем нужную область макета: Область = Макет.ПолучитьОбласть("Заголовок");.
  4. Заполняем параметры области нужными значениями из документа.
  5. Выводим область в итоговый документ с помощью метода ТабДок.Вывести(Область);.
  6. Сохраняем сформированный итоговый документ в требуемый формат.

Посмотрим на пример правильной реализации процедуры экспорта в PDF:


Для Каждого ЭлементТабличнойЧасти Из ТаблицаДокументов Цикл
    
    ОбъектДокумент = ЭлементТабличнойЧасти.Документ.Ссылка.ПолучитьОбъект();
    
    Если ОбъектДокумент.Проведен И ТипЗнч(ОбъектДокумент.Ссылка) = Тип("ДокументСсылка.Реализация") Тогда
        
        // Создаем итоговый документ-приемник
        ТабДок = Новый ТабличныйДокумент;
        
        // Заполняем итоговый документ через процедуру печати
        ФормированиеПечатнойФормыАктСПечатью(ТабДок, ОбъектДокумент);
        
        // Формируем уникальное имя файла
        ИмяФайла = КаталогВременныхФайлов() + "Акт_" + СокрЛП(ОбъектДокумент.Номер) + ".pdf";
        
        // Настраиваем параметры отображения и печати
        ТабДок.АвтоМасштаб = Истина;
        ТабДок.ОтображатьГруппировки = Ложь;
        ТабДок.ОтображатьЗаголовки = Ложь;
        ТабДок.ОтображатьСетку = Ложь;
        ТабДок.ТолькоПросмотр = Истина;
        
        // Записываем сформированный документ в PDF
        ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
        
    КонецЕсли;
    
КонецЦикла;

Особенности настройки табличного документа перед экспортом

Для корректной выгрузки файла в формат PDF и предотвращения проблем с форматированием рекомендуется устанавливать дополнительные свойства объекта ТабличныйДокумент:


// Включение автоматического подгона по ширине страницы
ТабДок.АвтоМасштаб = Истина;

// Отключение сервисных элементов оформления
ТабДок.ОтображатьСетку = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.ОтображатьГруппировки = Ложь;

// Защита от случайного редактирования перед сохранением
ТабДок.ТолькоПросмотр = Истина;

Важно следить за тем, чтобы формирование имени файла ИмяФайла внутри цикла основывалось на уникальных реквизитах документа (например, ОбъектДокумент.Номер или ПолучитьИмяВременногоФайла()), иначе при каждой итерации цикла предыдущий сохраненный файл будет перезаписываться новым.

← На главную