Печать из серверных процессов — одна из классических задач при разработке на платформе 1С:Предприятие. Основная сложность заключается в том, что сервер 1С чаще всего работает как системная служба, не имеющая доступа к интерактивному рабочему столу пользователя и принтерам, установленным в пользовательской сессии. Давайте разберем, как грамотно подойти к этой задаче и какие методы являются наиболее надежными.
Когда вы вызываете метод ТабличныйДокумент.Напечатать() на сервере, платформа пытается обратиться к драйверу принтера, который, скорее всего, недоступен под учетной записью службы сервера 1С. В большинстве случаев система просто не увидит «принтер по умолчанию» или столкнется с ошибкой доступа. Кроме того, серверные процессы должны быть потокобезопасными и независимыми, поэтому любые попытки вывести диалоговое окно или выполнить интерактивную команду приведут к «зависанию» процесса.
Самым надежным способом на сегодняшний день считается промежуточная запись документа в файл. Вместо того чтобы пытаться «заставить» сервер печатать напрямую, мы сохраняем результат в файл формата PDF, а затем передаем этот файл внешней утилите, которая выполнит отправку на принтер через командную строку.
Рассмотрим алгоритм действий:
ТабличныйДокумент на сервере.ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF).SumatraPDF или штатные средства ОС) для отправки файла на печать через КомандаСистемы.
// Пример формирования и сохранения на сервере
ТабДокумент = Новый ТабличныйДокумент;
// ... (заполнение документа данными)
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.PDF);
// Отправка на печать через командную строку
Команда = "SumatraPDF.exe -print-to-default " + ИмяВременногоФайла;
ЗапуститьПриложение(Команда);
Для высоконагруженных систем лучше использовать асинхронный подход. Создайте РегистрСведений «ОчередьПечати», куда серверный процесс будет записывать данные для печати (или ссылку на сформированный PDF-файл).
В чем преимущества этого подхода:
ОбработчикОжидания.Если инфраструктура предприятия позволяет, можно настроить «горячую папку» (Hot Folder). Сервер 1С сохраняет PDF-файл в расшаренную сетевую директорию, доступную принт-серверу (например, на базе CUPS в Linux или выделенному Windows Print Server). Специальный скрипт на стороне сервера печати автоматически подхватывает новые файлы и отправляет их в очередь.
Иногда возникает необходимость печати XLS или XLSX файлов. Хотя использование COM-объекта (Excel.Application) технически возможно, мы настоятельно рекомендуем избегать его на сервере. Запуск тяжелых офисных приложений в серверной среде ведет к утечкам памяти и непредсказуемому поведению при появлении диалоговых окон Excel.
Если вам все же нужно распечатать такой файл, лучше предварительно конвертировать его в PDF, как описано в первом методе, и отправлять на печать уже стандартизированный PDF-документ.
Проанализируем ситуацию: если ваша задача — обеспечить разовую печать без критических требований к скорости, используйте метод с PDF. Если же вы строите систему с высокой нагрузкой (печать сотен документов в час), лучшим решением будет создание очереди заданий и их обработка на стороне выделенного рабочего места или принт-сервера. Это позволит вам избежать проблем с правами доступа службы 1С и обеспечит легкое масштабирование системы печати.
Помните: сервер должен только готовить данные, а не заниматься их физическим выводом на бумагу — это золотое правило архитектуры корпоративных систем!