Организация печати из серверного контекста 1С (фоновые задания, сеансы веб-сервисов или регламентные задания) — это классическая задача, с которой сталкиваются разработчики при автоматизации складов (ТСД), интернет-магазинов или систем документооборота. Основная сложность заключается в том, что серверная служба 1С работает в так называемой Сессии 0 (Session 0 Isolation), где отсутствует графический интерфейс, и обычные методы печати, доступные на клиенте, попросту не срабатывают.
В этой статье мы подробно разберем, почему стандартный подход через COMОбъект("Shell.Application") часто подводит, и проанализируем работающие способы печати с использованием внешних утилит и командной строки.
Когда мы запускаем код на стороне клиента, 1С взаимодействует с принтерами через текущую сессию пользователя Windows. Однако на сервере ситуация иная. Разберем основные причины неудач:
USR1CV8) не имеет загруженного профиля с настройками принтеров по умолчанию.ShellExecute через Shell.Application имитирует действия пользователя в проводнике, что практически невозможно в неинтерактивном режиме сервера.Как показывает практика и обсуждение специалистов, одним из самых стабильных решений является использование специализированной бесплатной утилиты PDFtoPrinter.exe. Она специально разработана для отправки PDF-файлов на принтер из командной строки без вывода графических окон.
Рассмотрим по шагам, как реализовать этот алгоритм в коде 1С:
// 1. Формируем временный файл PDF из табличного документа
ИмяПечатногоФайла = ПолучитьИмяВременногоФайла("PDF");
ТабличныйДокумент.Записать(ИмяПечатногоФайла, ТипФайлаТабличногоДокумента.PDF);
// 2. Подготавливаем объект для запуска внешней команды
WshShell = Новый COMОбъект("Wscript.Shell");
// 3. Формируем строку запуска.
// Параметры: "Путь_к_программе" "Путь_к_файлу" "Имя_принтера"
// Важно: Имя принтера должно соответствовать установленному в системе
ИмяПринтера = "Samsung - IT";
ПутьКПрограмме = "C:\PDFtoPrinter.exe";
СтрокаКоманды = """" + ПутьКПрограмме + """ """ + ИмяПечатногоФайла + """ """ + ИмяПринтера + """";
// 4. Запускаем на исполнение
WshShell.Run(СтрокаКоманды, 0, Истина);
Обратите внимание на использование четверных кавычек в строке команды. Это критически важный момент: если в путях к файлам или в названии принтера есть пробелы, Windows не сможет корректно распознать команду без обрамления их в кавычки.
Если на сервере уже установлены просмотрщики 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 убедитесь, что в настройках программы отключены все стартовые окна и предложения об обновлениях, иначе процесс может ожидать реакции пользователя в невидимой сессии.
Даже при наличии верного кода печать может не идти. Разберем технические нюансы настройки операционной системы:
System, необходимо вручную создать пустые папки:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\Desktop1C:Enterprise 8.3 Server Agent, должен иметь полные права на папку с утилитой печати, папку временных файлов и, разумеется, права на управление принтером.Local Port с указанием пути (например, \\Server\PrinterName), чтобы он был доступен всем пользователям системы.Если PDFtoPrinter или Foxit по каким-то причинам не подходят, рассмотрим утилиту SumatraPDF. Она отличается высокой скоростью работы и отличной поддержкой командной строки для «тихой» печати. Пример команды для использования в 1С:
SumatraPDF.exe -print-to "ИмяПринтера" -silent файл.pdf
Параметр -silent гарантирует, что программа не будет пытаться открыть окно просмотра, что идеально подходит для фоновых заданий.
В случае, если ваша задача — печать этикеток через терминал сбора данных, зачастую эффективнее отказаться от PDF в пользу прямой отправки команд на языке принтера (ZPL, EPL или ESC/POS). В этом случае вы формируете текстовую строку с командами и отправляете её напрямую в TCP-порт принтера (обычно порт 9100) через объект NWSocket или внешнюю компоненту. Это исключает любые проблемы с драйверами и «отступами» при конвертации в PDF.
Подводя итог, можно сказать: для успешной печати с сервера 1С забудьте о методе Напечатать() в контексте сервера без предварительной сложной настройки. Используйте проверенную связку Wscript.Shell и внешнюю консольную утилиту, предварительно настроив системные папки профиля службы.