В процессе автоматизации документооборота в 1С:Предприятии 7.7 часто возникает задача формирования PDF-файлов «тихо», то есть без вывода диалоговых окон выбора пути сохранения и имени файла. Стандартный метод Таб.Напечатать(0) при использовании виртуального PDF-принтера обычно инициирует системное окно драйвера, что блокирует конвейерную обработку документов. Разберем подробно, как обойти это ограничение и настроить статическое сохранение файлов.
Проанализируем наиболее технологичный способ, который не зависит от настроек конкретных принтеров в операционной системе. Библиотека «Йоксель» расширяет возможности работы с табличными документами в 1С 7.7. Для решения нашей задачи нам потребуется сама компонента yoksel.dll и дополнительный плагин converter_pdf.dll.
Рассмотрим по шагам процесс реализации:
Пример кода для реализации этого метода:
ЗагрузитьВнешнююКомпоненту("yoksel.dll");
Таб = СоздатьОбъект("Таблица");
// ... Формирование таблицы стандартными средствами 1С ...
Йокс = СоздатьОбъект("ТабличныйДокумент");
Йокс.ЗагрузитьИзТаблицы(Таб);
Конвертер = СоздатьОбъект("КонвертерPDF");
ПутьСохранения = "C:\PDF_Reports\Order_" + СокрЛП(ТекущийДокумент.НомерДок) + ".pdf";
Конвертер.ЗаписатьВФайл(Йокс, ПутьСохранения);
Этот способ хорош тем, что он работает максимально быстро и полностью исключает появление любых интерфейсных окон. Вы полностью контролируете имя файла через встроенный язык 1С.
Если по каким-то причинам использование «Йокселя» невозможно, рассмотрим вариант с управлением профессиональными виртуальными принтерами, такими как Bullzip PDF Printer или PDFCreator. Эти программы предоставляют программный интерфейс (API), позволяющий задать настройки печати непосредственно перед вызовом метода Напечатать().
Для Bullzip PDF Printer принцип работы заключается в создании временного конфигурационного файла runonce.ini. Разберем алгоритм:
Output (путь к файлу), ShowSaveAS=never (отключить диалог) и ConfirmOverwrite=yes.Таб.Напечатать(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);
Выясним причину, по которой этот метод считается «классическим» для серверных решений. Если в системе нельзя устанавливать сторонние компоненты или платные принтеры, можно воспользоваться стандартной возможностью Windows — печатью в порт FILE:.
Проанализируем ситуацию по шагам:
FILE:.КомандаСистемы() вызываем консольную утилиту Ghostscript, которая перегоняет .prn в .pdf.Пример командной строки для вызова из 1С:
Команда = "gswin32c.exe -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sOutputFile=" + ИмяФайлаPDF + " " + ИмяФайлаPRN;
КомандаСистемы(Команда);
Некоторые бесплатные принтеры (например, 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 такого объекта нет, поэтому не тратьте время на попытки его реализации в старом коде.
Подведем итог нашему анализу:
Таб.Записать(Путь, "HTML")) и консольной утилиты wkhtmltopdf.Выбрав один из этих путей, вы сможете полностью автоматизировать формирование отчетности и исключить человеческий фактор при сохранении документов в PDF.