Как избавиться от зависания процесса печати PDF при вызове из 1С через Wscript.Shell?

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

Автоматизация печати документов напрямую с сервера 1С — задача, с которой сталкивается практически каждый разработчик. Часто для этой цели используется вызов внешних консольных утилит через Wscript.Shell. Однако при работе в серверной среде (особенно на Windows Server) процесс может неожиданно зависать, оставляя «висящие» задачи в диспетчере и блокируя дальнейшую печать. Давайте разберем, как диагностировать эту проблему и какие есть альтернативные решения для повышения отказоустойчивости.

Анализ причин зависания процесса

Прежде чем менять инструмент, попробуем выяснить, почему PDFtoPrinter.exe перестает отвечать. Основная трудность заключается в том, что при ошибке утилита не оставляет записей в логах 1С. Чтобы «заставить» её говорить, воспользуемся режимом отладки:

  1. Переименуйте исполняемый файл PDFtoPrinter.exe в PDFtoPrinter-debug.exe (или создайте копию с таким именем).
  2. Если это не помогает, добавьте ключ /debug к строке запуска.
  3. При запуске в этом режиме программа должна скопировать реальную команду печати в буфер обмена Windows. Вставьте её в командную строку, чтобы увидеть реальную ошибку, которая скрывается за фасадом автоматического вызова.

Зачастую выясняется, что проблема кроется в правах доступа к принтеру, конфликте версий PDF-документов или попытках графического интерфейса открыться в неинтерактивной сессии сервера.

Переход на использование SumatraPDF

Если диагностика не выявила критических проблем, а зависания продолжаются, рекомендуем сменить утилиту на SumatraPDF. Она считается значительно более стабильной для серверных задач благодаря встроенному ключу -print-to, который корректно работает в фоновом режиме.

Для реализации этого решения обновите ваш код в 1С. Рассмотрим наиболее стабильный вариант вызова:


// Создаем COM-объект для взаимодействия с системой
Shell = Новый COMОбъект("WScript.Shell");

// Формируем строку запуска с явным указанием принтера и файла
// Обратите внимание на кавычки для путей с пробелами
СтрокаКоманды = "SumatraPDF.exe -print-to """ + Принтер + """ """ + ИмяФайла + """";

// Запускаем процесс
Shell.Run(СтрокаКоманды, 0, Истина);

Обеспечение отказоустойчивости печати

Даже с надежным инструментом печать на сервере требует правильной организации. Давайте внедрим следующие правила, чтобы исключить простои:

  1. Отказ от прямого вызова: Не вызывайте печать «на лету» прямо из транзакции или основного процесса. Записывайте задачу в таблицу (регистр сведений) с состоянием «Ожидает».
  2. Фоновый процесс: Используйте регламентное задание, которое периодически опрашивает очередь и отправляет файлы на печать по одному. Это позволит вам контролировать, завис ли конкретный процесс печати, и при необходимости завершать его командой taskkill через определенный тайм-аут.
  3. Логирование выводов: Если вы используете пакетные файлы (.bat) для запуска печати, всегда перенаправляйте поток ошибок в текстовый файл. Это делается добавлением в конец строки запуска конструкции >> log.txt 2>&1. Так вы всегда сможете прочитать причину сбоя, не воспроизводя ситуацию вручную.
  4. Использование локальных портов: Если вы печатаете на сетевой принтер, вместо использования путей вида \\Server\Printer, попробуйте установить принтер локально на сервер 1С через Standard TCP/IP Port. Это избавит вас от зависимости от сетевой службы браузера и проблем с авторизацией сетевых дисков.

Заключение

Печать из 1С — это сложный процесс взаимодействия с драйверами принтеров и ОС Windows. Если ваш текущий метод дает сбои, начните с отладки вывода ошибок. В большинстве случаев переход на SumatraPDF и вынос печати в отдельную очередь позволяют добиться практически 100% стабильности работы. Разбирайтесь с каждым сбоем как с уникальным кейсом: смотрите логи, проверяйте права учетной записи, под которой работает служба 1С:Предприятие, и старайтесь минимизировать количество «тяжелых» процессов, запускаемых параллельно.

← На главную