В распределенных системах «1С:Предприятие» часто возникает задача, когда серверное регламентное задание формирует печатную форму (например, заказ на склад или ценники), которую необходимо немедленно распечатать на конкретном принтере в удаленном магазине. Основная сложность заключается в том, что серверный процесс не имеет прямого доступа к локальным принтерам пользователя, а установка сотен принтеров непосредственно на сервер приводит к деградации производительности службы печати Windows и путанице в очередях.
В данной статье мы разберем наиболее эффективные стратегии решения этой задачи: от классического мониторинга папок до современных методов с использованием веб-сервисов и протоколов обмена сообщениями.
Это один из самых стабильных и рекомендуемых способов. Вместо того чтобы пытаться пробросить объект ТабличныйДокумент (MXL) на сторону клиента, мы преобразуем его в универсальный формат PDF прямо на сервере. Формат PDF гарантирует сохранение разметки и шрифтов независимо от настроек конкретной машины.
Рассмотрим пошагово, как реализовать этот процесс:
Пример кода на стороне сервера для сохранения файла:
ТабДок = Новый ТабличныйДокумент;
// ... Заполнение документа данными ...
ПутьКФайлу = "\\Server\Exchange\Store001\print_task.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Для реализации «тихой» печати на стороне магазина отлично подходят утилиты SumatraPDF или Adobe Reader с ключами командной строки. Например, команда для SumatraPDF выглядит так:
sumatrapdf.exe -print-to-default -silent print_task.pdf
Проанализируем ситуацию, когда мы не хотим использовать файловый обмен. В этом случае магазин может выступать в роли небольшого веб-сервера или использовать постоянное HTTP-соединение с центральным сервером.
Разберем архитектуру с использованием HTTP-сервисов:
Такой подход позволяет избежать проблем с правами доступа к сетевым папкам и работает даже через интернет без VPN, если настроена публикация HTTP-сервиса.
Если ваша инфраструктура поддерживает Сервер взаимодействия (1С:Collaboration System), это открывает наиболее «нативный» путь. Сервер взаимодействия позволяет серверному коду отправить сообщение конкретному пользователю или в канал.
Как мы можем это использовать:
ТабличныйДокумент.Напечатать().Выясним причину, по которой многие системные администраторы избегают установки драйверов на сервер. Это риск падения спулера печати. Однако, если принтеры в магазинах сетевые, мы можем отправлять данные напрямую на их IP-адрес по порту 9100.
Этот метод требует предварительной подготовки данных в формате, который понимает принтер (PCL или PostScript). Рассмотрим схему работы:
НТТРЗапрос или специализированные внешние компоненты для работы с сокетами, данные пересылаются на IP принтера.В современных 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С со статусами «Сформировано», «Отправлено» и «Распечатано».