Как программно сформировать печатную форму в 1С 8.3 и сохранить её в PDF?

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

В современной практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача автоматизации документооборота. Одной из самых востребованных функций является автоматическое формирование печатной формы документа и её последующее сохранение в файл формата PDF для отправки по электронной почте или архивации. В данной статье мы разберем по шагам, как реализовать этот механизм, проанализируем возможные трудности и изучим примеры кода для различных ситуаций.

Основы формирования печатной формы

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

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

Разберем по шагам: Метод 1. Использование стандартных средств платформы

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


// Создаем объект Табличный документ
ТабДок = Новый ТабличныйДокумент;

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

// Указываем имя файла и путь, куда он будет сохранен
ПутьКФайлу = "C:\Temp\Invoice_" + Строка(ДокументСсылка.Номер) + ".pdf";

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

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

Разберем подробнее: Метод 2. Работа в среде Библиотеки стандартных подсистем (БСП)

Если вы работаете в типовой конфигурации (например, 1С:ERP, 1С:Управление торговлей или 1С:Бухгалтерия), рекомендуется использовать механизмы БСП. Это обеспечит более стабильную работу и соблюдение прав доступа. Рассмотрим, как это сделать через подсистему УправлениеПечатью.

Проанализируем алгоритм действий при использовании БСП:

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

ПараметрыПечати = Новый Структура;
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ИНВОЙС");
ОбъектыПечати = Новый СписокЗначений;

УправлениеПечатью.СформироватьПечатныеФормыДляТиражирования(
    "Документ.РеализацияТоваровУслуг",
    "ИНВОЙС",
    МассивСсылок,
    ПараметрыПечати,
    КоллекцияПечатныхФорм,
    ОбъектыПечати
);

СтрокаПечатнойФормы = КоллекцияПечатныхФорм.Найти("ИНВОЙС", "ИмяВТаблице");
Если СтрокаПечатнойФормы <> Неопределено Тогда
    ТабДок = СтрокаПечатнойФормы.ТабличныйДокумент;
    ТабДок.Записать("D:\Reports\Order.pdf", ТипФайлаТабличногоДокумента.PDF);
КонецЕсли;

Тонкости настройки и решение проблем

Рассмотрим подробнее важные моменты, которые часто упускают из виду программисты при реализации данной задачи. Выясним причину возможных ошибок, таких как отсутствие прав доступа или пустой файл.

Во-первых, если код выполняется на сервере (например, в регламентном задании), убедитесь, что у пользователя, под которым запущен агент службы 1C:Enterprise, есть права на запись в целевую папку. Если прав недостаточно, система выдаст ошибку доступа.

Во-вторых, стоит обратить внимание на шрифты. При сохранении в PDF на серверах под управлением Linux необходимо, чтобы в системе были установлены Microsoft Core Fonts, иначе текст в PDF может отображаться некорректно или "кракозябрами".

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

Оптимизация: Сохранение во временное хранилище

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


// Получаем имя временного файла на сервере
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");

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

// Помещаем файл во временное хранилище для передачи на клиент
АдресФайлаВоХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));

// Удаляем временный файл после использования, чтобы не засорять диск
УдалитьФайлы(ИмяФайла);

Этот метод является наиболее безопасным и чистым с точки зрения администрирования системы, так как 1С сама очистит временные папки через некоторое время, а мы не создаем лишних зависимостей от путей на диске C: или D:.

Заключение

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

← На главную