Как реализовать печать документов из фонового задания на сервере 1С?

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

Организация печати из серверного контекста 1С (фоновые задания, сеансы веб-сервисов или регламентные задания) — это классическая задача, с которой сталкиваются разработчики при автоматизации складов (ТСД), интернет-магазинов или систем документооборота. Основная сложность заключается в том, что серверная служба 1С работает в так называемой Сессии 0 (Session 0 Isolation), где отсутствует графический интерфейс, и обычные методы печати, доступные на клиенте, попросту не срабатывают.

В этой статье мы подробно разберем, почему стандартный подход через COMОбъект("Shell.Application") часто подводит, и проанализируем работающие способы печати с использованием внешних утилит и командной строки.

Почему не работает стандартная печать на сервере?

Когда мы запускаем код на стороне клиента, 1С взаимодействует с принтерами через текущую сессию пользователя Windows. Однако на сервере ситуация иная. Разберем основные причины неудач:

  1. Отсутствие окружения: Служба 1С (обычно под пользователем USR1CV8) не имеет загруженного профиля с настройками принтеров по умолчанию.
  2. Интерактивные окна: Многие драйверы принтеров при получении команды на печать пытаются вывести диалоговое окно (например, о низком уровне тонера). В фоновом задании это окно некому закрыть, и процесс «зависает».
  3. Изоляция сессий: Метод ShellExecute через Shell.Application имитирует действия пользователя в проводнике, что практически невозможно в неинтерактивном режиме сервера.

Решение №1: Использование утилиты PDFtoPrinter

Как показывает практика и обсуждение специалистов, одним из самых стабильных решений является использование специализированной бесплатной утилиты PDFtoPrinter.exe. Она специально разработана для отправки PDF-файлов на принтер из командной строки без вывода графических окон.

Рассмотрим по шагам, как реализовать этот алгоритм в коде 1С:


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

// 2. Подготавливаем объект для запуска внешней команды
WshShell = Новый COMОбъект("Wscript.Shell");

// 3. Формируем строку запуска. 
// Параметры: "Путь_к_программе" "Путь_к_файлу" "Имя_принтера"
// Важно: Имя принтера должно соответствовать установленному в системе
ИмяПринтера = "Samsung - IT"; 
ПутьКПрограмме = "C:\PDFtoPrinter.exe";

СтрокаКоманды = """" + ПутьКПрограмме + """ """ + ИмяПечатногоФайла + """ """ + ИмяПринтера + """";

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

Обратите внимание на использование четверных кавычек в строке команды. Это критически важный момент: если в путях к файлам или в названии принтера есть пробелы, Windows не сможет корректно распознать команду без обрамления их в кавычки.

Решение №2: Печать через Foxit Reader или Adobe Acrobat

Если на сервере уже установлены просмотрщики PDF, такие как Foxit Reader, можно воспользоваться их ключами командной строки. Ключ /t позволяет отправить файл на конкретный принтер и завершить работу приложения после постановки задачи в очередь печати.

Проанализируем пример реализации:


WshShell = Новый COMОбъект("Wscript.Shell");
// Путь к исполняемому файлу Foxit Reader
ПутьКПриложению = "C:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitReader.exe";
ФайлПечати = "C:\test.pdf";
ИмяПринтера = "HP Universal Printing PCL 6";

// Формируем команду: Приложение.exe /t "ПутьКФайлу" "ИмяПринтера"
СтрокаКоманды = """" + ПутьКПриложению + """ /t """ + ФайлПечати + """ """ + ИмяПринтера + """";

WshShell.Run(СтрокаКоманды, 0, Истина);

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

Важные настройки сервера для успешной печати

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

  1. Создание папок Desktop: Это «магическое» решение многих проблем серверной печати. Драйверы принтеров часто ищут папку рабочего стола в профиле пользователя. Если служба 1С работает от имени System, необходимо вручную создать пустые папки:
    • C:\Windows\System32\config\systemprofile\Desktop
    • C:\Windows\SysWOW64\config\systemprofile\Desktop
  2. Права доступа: Пользователь, под которым запущена служба 1C:Enterprise 8.3 Server Agent, должен иметь полные права на папку с утилитой печати, папку временных файлов и, разумеется, права на управление принтером.
  3. Установка принтера: Сетевые принтеры, добавленные под вашей учетной записью, сервер не увидит. Принтер нужно устанавливать как локальный, используя Local Port с указанием пути (например, \\Server\PrinterName), чтобы он был доступен всем пользователям системы.

Альтернатива: Использование SumatraPDF

Если PDFtoPrinter или Foxit по каким-то причинам не подходят, рассмотрим утилиту SumatraPDF. Она отличается высокой скоростью работы и отличной поддержкой командной строки для «тихой» печати. Пример команды для использования в 1С:

SumatraPDF.exe -print-to "ИмяПринтера" -silent файл.pdf

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

Прямая печать (RAW) для термопринтеров и ТСД

В случае, если ваша задача — печать этикеток через терминал сбора данных, зачастую эффективнее отказаться от PDF в пользу прямой отправки команд на языке принтера (ZPL, EPL или ESC/POS). В этом случае вы формируете текстовую строку с командами и отправляете её напрямую в TCP-порт принтера (обычно порт 9100) через объект NWSocket или внешнюю компоненту. Это исключает любые проблемы с драйверами и «отступами» при конвертации в PDF.

Подводя итог, можно сказать: для успешной печати с сервера 1С забудьте о методе Напечатать() в контексте сервера без предварительной сложной настройки. Используйте проверенную связку Wscript.Shell и внешнюю консольную утилиту, предварительно настроив системные папки профиля службы.

← На главную