Как программно получить и сохранить печатную форму УПД в файл 1С?

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

В процессе автоматизации работы с документами часто возникает задача формирования печатных форм (например, Универсального передаточного документа — УПД) программным путем, без участия пользователя. Рассмотрим, как правильно реализовать эту задачу, опираясь на современные стандарты 1С и возможности Библиотеки стандартных подсистем (БСП).

Основные подходы к решению задачи

В современных конфигурациях 1С логика формирования печатных форм вынесена в подсистему Печать. Это позволяет унифицировать получение макетов, настройку параметров печати и формирование табличных документов. Мы разберем наиболее надежный способ — использование методов менеджера печати.

Реализация через механизмы БСП

Использование методов УправлениеПечатью — это стандарт индустрии. Такой подход гарантирует, что все настройки (подписи, печати, выбор форматов) будут учтены корректно. Давайте разберем по шагам, как подготовить и сохранить файл.

  1. Получение команды печати: Для начала необходимо найти идентификатор команды печати, соответствующий нужному документу.
  2. Подготовка настроек: Настроим параметры сохранения, указав целевой формат, в нашем случае — PDF.
  3. Генерация файла: Вызовем метод печати и запишем полученные двоичные данные на диск.

Посмотрим на пример реализации кода:


КомандыПечати = УправлениеПечатью.КомандыПечатиОбъекта(Метаданные.Документы.ЗаказНаряд);
НайденнаяКоманда = КомандыПечати.Найти("ПФ_MXL_КвитанцияЗавершающий", "Идентификатор");

Если НайденнаяКоманда = Неопределено Тогда
    Возврат;
КонецЕсли;

КомандаПечатиВФайл = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(НайденнаяКоманда);    
КомандаПечатиВФайл.МенеджерПечати = "Документ.ЗаказНаряд";

НастройкиСохранения = УправлениеПечатью.НастройкиСохранения();
НастройкиСохранения.ФорматыСохранения.Добавить(ТипФайлаТабличногоДокумента.PDF);
НастройкиСохранения.ПереводитьИменаФайловВТранслит = Ложь;
НастройкиСохранения.ПодписьИПечать = Ложь;

МассивОбъектовУчета = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СсылкаНаДокумент);
РезультатПечати = УправлениеПечатью.НапечататьВФайл(КомандаПечатиВФайл, МассивОбъектовУчета, НастройкиСохранения);

Для каждого СтрокаТаблицы Из РезультатПечати Цикл
    ПолноеИмяФайла = "C:\Files\Document.pdf";
    СтрокаТаблицы.ДвоичныеДанные.Записать(ПолноеИмяФайла);
КонецЦикла;

Разбор критически важных нюансов

При работе с УПД стоит учитывать, что этот документ часто является производным. В типовых конфигурациях логика печати может находиться как в документе Реализация товаров и услуг, так и в документе Счет-фактура выданный. Поэтому, если вы не находите нужную команду в менеджере реализации, обратитесь к модулю менеджера счета-фактуры, где реализовано заполнение строки 5Б в УПД.

Почему важно использовать БСП?

Альтернативный способ (Прямой вызов)

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


// Получаем табличный документ напрямую из модуля менеджера
ТабДок = Документы.РеализацияТоваровУслуг.Печать(МассивОбъектов, Параметры);
// Сохраняем в PDF
ТабДок.Записать("C:\Temp\Doc.pdf", ТипФайлаТабличногоДокумента.PDF);

Этот способ быстрее, но он лишает вас возможности использовать гибкие настройки сохранения, которые предоставляет БСП. Мы рекомендуем использовать этот метод только для простых внутренних задач, где не требуется поддержка подписей или специфических настроек печати пользователя.

Итоги и рекомендации

Мы выяснили, что для решения задачи формирования УПД лучше всего использовать связку УправлениеПечатью и НапечататьВФайл. Это гарантирует стабильность и соответствие печатной формы тому, что видит бухгалтер при печати из интерфейса. Всегда проверяйте, в каком модуле менеджера зарегистрирована команда печати, и не забывайте формировать массив объектов для передачи в процедуру печати, так как большинство типовых функций ожидают на вход именно массив, даже если объект один.

← На главную