Как реализовать автоматическое сохранение печатных форм в PDF в 1С 7.7 без участия пользователя?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В процессе автоматизации документооборота в 1С:Предприятии 7.7 часто возникает задача формирования PDF-файлов «тихо», то есть без вывода диалоговых окон выбора пути сохранения и имени файла. Стандартный метод Таб.Напечатать(0) при использовании виртуального PDF-принтера обычно инициирует системное окно драйвера, что блокирует конвейерную обработку документов. Разберем подробно, как обойти это ограничение и настроить статическое сохранение файлов.

Метод 1. Использование внешней компоненты «Йоксель» (Yoksel)

Проанализируем наиболее технологичный способ, который не зависит от настроек конкретных принтеров в операционной системе. Библиотека «Йоксель» расширяет возможности работы с табличными документами в 1С 7.7. Для решения нашей задачи нам потребуется сама компонента yoksel.dll и дополнительный плагин converter_pdf.dll.

Рассмотрим по шагам процесс реализации:

  1. Загружаем внешнюю компоненту в теле модуля.
  2. Создаем объект табличного документа Йокселя и загружаем в него стандартную таблицу 1С.
  3. Используем метод конвертации для прямой записи в файл по заданному пути.

Пример кода для реализации этого метода:


ЗагрузитьВнешнююКомпоненту("yoksel.dll");
Таб = СоздатьОбъект("Таблица");
// ... Формирование таблицы стандартными средствами 1С ...
Йокс = СоздатьОбъект("ТабличныйДокумент");
Йокс.ЗагрузитьИзТаблицы(Таб);
Конвертер = СоздатьОбъект("КонвертерPDF");
ПутьСохранения = "C:\PDF_Reports\Order_" + СокрЛП(ТекущийДокумент.НомерДок) + ".pdf";
Конвертер.ЗаписатьВФайл(Йокс, ПутьСохранения);

Этот способ хорош тем, что он работает максимально быстро и полностью исключает появление любых интерфейсных окон. Вы полностью контролируете имя файла через встроенный язык 1С.

Метод 2. Программное управление виртуальными принтерами через COM-объекты

Если по каким-то причинам использование «Йокселя» невозможно, рассмотрим вариант с управлением профессиональными виртуальными принтерами, такими как Bullzip PDF Printer или PDFCreator. Эти программы предоставляют программный интерфейс (API), позволяющий задать настройки печати непосредственно перед вызовом метода Напечатать().

Для Bullzip PDF Printer принцип работы заключается в создании временного конфигурационного файла runonce.ini. Разберем алгоритм:

  1. Программно создаем текстовый файл настроек в папке профиля пользователя.
  2. Прописываем в нем параметры Output (путь к файлу), ShowSaveAS=never (отключить диалог) и ConfirmOverwrite=yes.
  3. Вызываем Таб.Напечатать(0), предварительно выбрав этот принтер в Таб.ПараметрыСтраницы().

Для PDFCreator можно использовать объектную модель COM. Посмотрим на примерную логику взаимодействия:


pdf = СоздатьОбъект("PDFCreator.clsPDFCreator");
pdf.cStart("/NoProcessingAtStartup");
pdf.cOption("UseAutosave") = 1;
pdf.cOption("AutosaveDirectory") = "C:\MyPDFs";
pdf.cOption("AutosaveFilename") = "Report_1";
pdf.cOption("AutosaveFormat") = 0; // 0 = PDF
pdf.cSaveOptions();
pdf.cClearCache();
Таб.ПараметрыСтраницы(,,,,,,,,,,,"PDFCreator");
Таб.Напечатать(0);

Метод 3. Печать в файл (PRN) и последующая конвертация через Ghostscript

Выясним причину, по которой этот метод считается «классическим» для серверных решений. Если в системе нельзя устанавливать сторонние компоненты или платные принтеры, можно воспользоваться стандартной возможностью Windows — печатью в порт FILE:.

Проанализируем ситуацию по шагам:

  1. Создаем в Windows локальный принтер (например, на базе драйвера HP LaserJet), указав порт FILE:.
  2. В 1С выполняем печать на этот принтер. Система создаст PostScript-файл (.prn).
  3. С помощью функции КомандаСистемы() вызываем консольную утилиту Ghostscript, которая перегоняет .prn в .pdf.

Пример командной строки для вызова из 1С:


Команда = "gswin32c.exe -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sOutputFile=" + ИмяФайлаPDF + " " + ИмяФайлаPRN;
КомандаСистемы(Команда);

Метод 4. Манипуляции с реестром Windows

Некоторые бесплатные принтеры (например, PDF24 или PDF-XChange) хранят путь последнего сохранения в реестре. Мы можем программно изменять эти ветки перед печатью, используя объект WScript.Shell.

Рассмотрим пример изменения пути через реестр:


Shell = СоздатьОбъект("WScript.Shell");
РегПуть = "HKEY_CURRENT_USER\Software\YourPDFPrinter\LastSaveDirectory";
Shell.RegWrite(РегПуть, "C:\Export\", "REG_SZ");
Таб.Напечатать(0);

Важно: этот метод менее надежен, так как структура реестра может измениться при обновлении драйвера принтера, и он требует включенного режима «Автосохранение» в настройках самого принтера.

Важное замечание по платформе

Обратите внимание, что в некоторых обсуждениях (например, сообщение №5) упоминается объект ПакетОтображаемыхДокументов. Помните, что данный объект доступен только в платформе 1С:Предприятие 8.2 и выше. В версии 7.7 такого объекта нет, поэтому не тратьте время на попытки его реализации в старом коде.

Рекомендации по выбору решения

Подведем итог нашему анализу:

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

← На главную