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

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

Вопрос организации автоматической печати документов, особенно когда речь идет о регламентных заданиях, является одной из классических задач при автоматизации бизнес-процессов. Часто разработчики сталкиваются с ситуацией, когда код, успешно работающий в интерактивном режиме под управлением пользователя, напрочь отказывается функционировать в фоновом задании. Разберем подробно, почему это происходит и как правильно реализовать процедуру печати на стороне сервера.

Понимание архитектуры: Клиент против Сервера

Прежде всего, проанализируем ситуацию, описанную в сообщениях форума. Автор упоминает использование «обычных форм», что часто вводит в заблуждение начинающих разработчиков. Важно понимать: вне зависимости от того, используете ли вы Толстый клиент (обычные формы) или Тонкий клиент, регламентное задание всегда выполняется на стороне сервера в неинтерактивном сеансе.

Рассмотрим основной нюанс: сервер 1С:Предприятия ничего не знает о вашем локальном компьютере, ваших подключенных принтерах или сессии Windows, в которой вы работаете. Когда запускается регламентное задание, оно выполняется от имени системной учетной записи (обычно это usr1cv8). Следовательно, сервер может «увидеть» только те принтеры, которые установлены непосредственно на нем или доступны ему по сети.

Настройка прав доступа и сетевого окружения

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

  1. Идентификация учетной записи: Необходимо точно знать, под каким пользователем запущена служба Агент сервера 1С:Предприятия. По умолчанию это usr1cv8 или LocalSystem.
  2. Доступ к сетевому принтеру: Если принтер сетевой, он должен быть «расшарен» (открыт общий доступ). В коде 1С мы должны использовать полный UNC-путь. Например: \\PrintServer\HP_LaserJet_400.
  3. Права на печать: Учетная запись сервера 1С должна иметь права «Печать» в настройках безопасности этого принтера.

Для диагностики доступности принтера со стороны сервера мы рекомендуем запустить консоль PowerShell от имени пользователя 1С на сервере и выполнить команду Get-Printer. Если в списке нет нужного устройства, 1С не сможет отправить на него документ.

Программная реализация печати в 1С

Теперь перейдем к коду. Для печати мы используем объект ТабличныйДокумент. Рассмотрим пример того, как правильно передать управление принтером в фоновом задании. Нам необходимо использовать свойство ИмяПринтера и метод Напечатать() с определенными параметрами.

Разберем пример кода:


// Создаем табличный документ (например, из макета)
ТабДок = Новый ТабличныйДокумент;
// ... здесь идет заполнение документа данными ...

// Указываем сетевое имя принтера, доступное серверу
ТабДок.ИмяПринтера = "\\Workstation01\Samsung_ML2160";

// Важный момент: печать должна быть без вывода диалога
// Так как в регламентном задании некому нажать "ОК"
ТабДок.Напечатать(РежимИспользованияПринтера.ПечатьБезДиалога);

Важно: Метод Напечатать(РежимИспользованияПринтера.ПечатьБезДиалога) является обязательным для серверного кода. Если вызвать метод с параметром ПечатьСДиалогом, регламентное задание зависнет навсегда, ожидая реакции пользователя в невидимом окне, или завершится с критической ошибкой.

Особенности работы на Linux-серверах

Если ваш сервер 1С работает под управлением ОС Linux, ситуация меняется. В этом случае подсистема печати Windows не используется. Посмотрим, как это работает там. В Linux за печать отвечает служба CUPS. Чтобы 1С могла печатать, принтер должен быть добавлен в очередь печати CUPS на самом сервере. В коде 1С в свойстве ИмяПринтера нужно будет указать ровно то имя, которое задано принтеру в конфигурации CUPS.

Решение проблемы интерактивных окон драйверов

Иногда даже при правильном коде печать не идет. Проанализируем ситуацию: некоторые драйверы принтеров (особенно бытовых моделей) при получении задания на печать выбрасывают информационные окна (например, «Заканчивается тонер» или «Выберите тип бумаги»).

Поскольку регламентное задание работает в «нулевой сессии», эти окна никто не видит. Это приводит к тому, что поток печати блокируется. Чтобы избежать этого, мы рекомендуем использовать профессиональные серии принтеров с драйверами класса Universal Print Driver, которые позволяют полностью отключить любые клиентские уведомления.

Альтернативный подход: Печать через PDF

Если настройка прямой печати с сервера вызывает непреодолимые трудности (например, из-за политик безопасности домена), рассмотрим альтернативный и более стабильный вариант. Мы можем сохранять документы в формате PDF в определенную папку, а специальная утилита на стороне клиента будет отправлять их на принтер.

Посмотрим на пример кода сохранения в PDF:


ПутьКФайлу = "\\Server\Exchange\PrintQueue\Doc_001.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);

Этот метод исключает зависимость от драйверов печати на самом сервере 1С и позволяет избежать проблем с очередью печати Windows (Print Spooler), которая на серверных ОС часто ведет себя нестабильно при работе из-под сервисов.

Резюме по внедрению

Подводя итог, проанализируем последовательность действий для успешной реализации групповой печати:

  1. Убеждаемся, что принтер сетевой и доступен по UNC-пути.
  2. Проверяем, что служба 1C:Enterprise Server имеет права доступа к этому ресурсу.
  3. В коде жестко задаем ИмяПринтера.
  4. Используем метод Напечатать() строго в режиме без диалога.
  5. В случае проблем с драйверами — переходим на схему с промежуточным сохранением в PDF.

Соблюдение этих правил позволит вам создать надежную систему автоматической печати, которая будет работать стабильно вне зависимости от активности пользователей в системе.

← На главную