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

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

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

В данной статье мы разберем наиболее эффективные стратегии решения этой задачи: от классического мониторинга папок до современных методов с использованием веб-сервисов и протоколов обмена сообщениями.

Метод 1. Конвертация в PDF и «тихая» печать сторонними утилитами

Это один из самых стабильных и рекомендуемых способов. Вместо того чтобы пытаться пробросить объект ТабличныйДокумент (MXL) на сторону клиента, мы преобразуем его в универсальный формат PDF прямо на сервере. Формат PDF гарантирует сохранение разметки и шрифтов независимо от настроек конкретной машины.

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

  1. На сервере в регламентном задании формируем отчет.
  2. Сохраняем его в PDF.
  3. Передаем файл на клиентскую машину (через общую папку, FTP или веб-сервис).
  4. На клиентской машине запускаем консольную утилиту для печати без открытия окна приложения.

Пример кода на стороне сервера для сохранения файла:


ТабДок = Новый ТабличныйДокумент;
// ... Заполнение документа данными ...
ПутьКФайлу = "\\Server\Exchange\Store001\print_task.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);

Для реализации «тихой» печати на стороне магазина отлично подходят утилиты SumatraPDF или Adobe Reader с ключами командной строки. Например, команда для SumatraPDF выглядит так:

sumatrapdf.exe -print-to-default -silent print_task.pdf

Метод 2. Использование веб-сервисов для инициации печати

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

Разберем архитектуру с использованием HTTP-сервисов:

  1. В магазине запущено небольшое приложение (написанное на Python, C# или даже упрощенная база 1С), которое периодически опрашивает центральный сервер через HTTP-запрос: «Есть ли для меня задания на печать?».
  2. Если на сервере 1С в специальном регистре сведений появилась запись для этого магазина, сервер отдает двоичные данные файла в ответе на запрос.
  3. Локальное приложение получает данные, сохраняет их во временный каталог и отправляет на печать.

Такой подход позволяет избежать проблем с правами доступа к сетевым папкам и работает даже через интернет без VPN, если настроена публикация HTTP-сервиса.

Метод 3. Интеграция через Сервер взаимодействия

Если ваша инфраструктура поддерживает Сервер взаимодействия (1С:Collaboration System), это открывает наиболее «нативный» путь. Сервер взаимодействия позволяет серверному коду отправить сообщение конкретному пользователю или в канал.

Как мы можем это использовать:

Метод 4. Печать по протоколу RAW (порт 9100)

Выясним причину, по которой многие системные администраторы избегают установки драйверов на сервер. Это риск падения спулера печати. Однако, если принтеры в магазинах сетевые, мы можем отправлять данные напрямую на их IP-адрес по порту 9100.

Этот метод требует предварительной подготовки данных в формате, который понимает принтер (PCL или PostScript). Рассмотрим схему работы:

  1. Сервер 1С формирует файл печати.
  2. Используя объект НТТРЗапрос или специализированные внешние компоненты для работы с сокетами, данные пересылаются на IP принтера.
  3. Принтер начинает печать немедленно, так как он получает готовые команды управления печатающей головкой.

Метод 5. Использование PowerShell Remoting

В современных Windows-инфраструктурах вместо устаревших утилит типа PsExec рекомендуется использовать PowerShell. Это позволяет серверу «командовать» клиентской машиной удаленно.

Проанализируем пример скрипта, который может быть запущен из 1С через КомандаСистемы:


Invoke-Command -ComputerName "StorePC01" -ScriptBlock {
    Start-Process -FilePath "C:\Path\To\SumatraPDF.exe" -ArgumentList "-print-to-default -silent C:\Temp\file.pdf"
}

Для работы этого метода на клиентских машинах должен быть разрешен WinRM (Windows Remote Management), а сервер должен иметь соответствующие административные права в домене.

Сравнение и выбор решения

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

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

← На главную