Вопрос организации автоматической печати документов, особенно когда речь идет о регламентных заданиях, является одной из классических задач при автоматизации бизнес-процессов. Часто разработчики сталкиваются с ситуацией, когда код, успешно работающий в интерактивном режиме под управлением пользователя, напрочь отказывается функционировать в фоновом задании. Разберем подробно, почему это происходит и как правильно реализовать процедуру печати на стороне сервера.
Прежде всего, проанализируем ситуацию, описанную в сообщениях форума. Автор упоминает использование «обычных форм», что часто вводит в заблуждение начинающих разработчиков. Важно понимать: вне зависимости от того, используете ли вы Толстый клиент (обычные формы) или Тонкий клиент, регламентное задание всегда выполняется на стороне сервера в неинтерактивном сеансе.
Рассмотрим основной нюанс: сервер 1С:Предприятия ничего не знает о вашем локальном компьютере, ваших подключенных принтерах или сессии Windows, в которой вы работаете. Когда запускается регламентное задание, оно выполняется от имени системной учетной записи (обычно это usr1cv8). Следовательно, сервер может «увидеть» только те принтеры, которые установлены непосредственно на нем или доступны ему по сети.
Выясним причину, по которой принтер может быть недоступен серверу, даже если вы прописали его имя в коде. Основная проблема заключается в правах доступа учетной записи службы 1С. Проанализируем шаги, которые необходимо предпринять системному администратору:
Агент сервера 1С:Предприятия. По умолчанию это usr1cv8 или LocalSystem.\\PrintServer\HP_LaserJet_400.Для диагностики доступности принтера со стороны сервера мы рекомендуем запустить консоль PowerShell от имени пользователя 1С на сервере и выполнить команду Get-Printer. Если в списке нет нужного устройства, 1С не сможет отправить на него документ.
Теперь перейдем к коду. Для печати мы используем объект ТабличныйДокумент. Рассмотрим пример того, как правильно передать управление принтером в фоновом задании. Нам необходимо использовать свойство ИмяПринтера и метод Напечатать() с определенными параметрами.
Разберем пример кода:
// Создаем табличный документ (например, из макета)
ТабДок = Новый ТабличныйДокумент;
// ... здесь идет заполнение документа данными ...
// Указываем сетевое имя принтера, доступное серверу
ТабДок.ИмяПринтера = "\\Workstation01\Samsung_ML2160";
// Важный момент: печать должна быть без вывода диалога
// Так как в регламентном задании некому нажать "ОК"
ТабДок.Напечатать(РежимИспользованияПринтера.ПечатьБезДиалога);
Важно: Метод Напечатать(РежимИспользованияПринтера.ПечатьБезДиалога) является обязательным для серверного кода. Если вызвать метод с параметром ПечатьСДиалогом, регламентное задание зависнет навсегда, ожидая реакции пользователя в невидимом окне, или завершится с критической ошибкой.
Если ваш сервер 1С работает под управлением ОС Linux, ситуация меняется. В этом случае подсистема печати Windows не используется. Посмотрим, как это работает там. В Linux за печать отвечает служба CUPS. Чтобы 1С могла печатать, принтер должен быть добавлен в очередь печати CUPS на самом сервере. В коде 1С в свойстве ИмяПринтера нужно будет указать ровно то имя, которое задано принтеру в конфигурации CUPS.
Иногда даже при правильном коде печать не идет. Проанализируем ситуацию: некоторые драйверы принтеров (особенно бытовых моделей) при получении задания на печать выбрасывают информационные окна (например, «Заканчивается тонер» или «Выберите тип бумаги»).
Поскольку регламентное задание работает в «нулевой сессии», эти окна никто не видит. Это приводит к тому, что поток печати блокируется. Чтобы избежать этого, мы рекомендуем использовать профессиональные серии принтеров с драйверами класса Universal Print Driver, которые позволяют полностью отключить любые клиентские уведомления.
Если настройка прямой печати с сервера вызывает непреодолимые трудности (например, из-за политик безопасности домена), рассмотрим альтернативный и более стабильный вариант. Мы можем сохранять документы в формате PDF в определенную папку, а специальная утилита на стороне клиента будет отправлять их на принтер.
Посмотрим на пример кода сохранения в PDF:
ПутьКФайлу = "\\Server\Exchange\PrintQueue\Doc_001.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Этот метод исключает зависимость от драйверов печати на самом сервере 1С и позволяет избежать проблем с очередью печати Windows (Print Spooler), которая на серверных ОС часто ведет себя нестабильно при работе из-под сервисов.
Подводя итог, проанализируем последовательность действий для успешной реализации групповой печати:
1C:Enterprise Server имеет права доступа к этому ресурсу.ИмяПринтера.Напечатать() строго в режиме без диалога.Соблюдение этих правил позволит вам создать надежную систему автоматической печати, которая будет работать стабильно вне зависимости от активности пользователей в системе.