Как обеспечить последовательную печать документов из 1С на сетевой принтер?

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

Многие пользователи сталкиваются с проблемой, когда при отправке комплекта документов на печать из 1С на выходе получается «каша». Документы перемешиваются, страницы разных отчетов могут идти не по порядку или вклиниваться в задания других сотрудников. Это происходит потому, что Windows-диспетчер очереди печати (Spooler) оптимизирует процесс, отдавая приоритет заданиям, которые готовы к печати быстрее, что приводит к «обгону» одних документов другими.

Метод 1: Программное ожидание завершения очереди через WMI

Если нет возможности менять архитектуру печати, мы можем заставить 1С «ждать» освобождения очереди печати перед отправкой следующего задания. Для этого воспользуемся возможностями WMI (Windows Management Instrumentation).

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


Процедура ЖдатьОчередьПечати() Экспорт
    Locator = Новый COMОбъект("WbemScripting.SWbemLocator");
    Скрипт = Новый COMОбъект("WScript.Network");
    ИмяПользователя = Скрипт.UserName;
    ТочкаПодключения = "root\cimv2";
    objWMIService = Locator.ConnectServer(".", ТочкаПодключения);
    
    МассивЗаданий = objWMIService.ExecQuery("Select * from Win32_PrintJob where Owner='" + ИмяПользователя + "'");
    ЗаданийВОчереди = МассивЗаданий.Count;
    
    Пока ЗаданийВОчереди > 0 Цикл
        // Задержка для снижения нагрузки на систему
        scr = Новый COMОбъект("WScript.Shell");
        scr.Run("ping 127.0.0.1 -n 2", 0, 1);
        
        МассивЗаданий = objWMIService.ExecQuery("Select * from Win32_PrintJob where Owner='" + ИмяПользователя + "'");
        ЗаданийВОчереди = МассивЗаданий.Count;
    КонецЦикла;
КонецПроцедуры

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

Метод 2: Создание «Робота печати» и сборка PDF-пакетов

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

  1. Подготовка макетов: В 1С создается обработка, которая сохраняет нужные документы (ТОРГ-12, СФ, ТТН) в PDF-файлы во временную папку.
  2. Формирование комплектов: Скрипт или специальный модуль в 1С создает файл-команду (например, .cmd), который содержит инструкции по порядку склейки PDF-файлов в единый документ.
  3. Робот печати: Запускается фоновый процесс (в 1С или внешним скриптом), который отслеживает появление файлов в каталоге. Как только комплект готов, робот отправляет один объединенный PDF на печать.

Преимущества этого подхода:

Метод 3: Использование единого табличного документа

Если конфигурация позволяет, мы можем попробовать собрать все печатные формы в один объект ТабличныйДокумент с помощью метода Присоединить(). Это гарантирует, что Windows воспримет пакет документов как одно задание.

Разберем основные шаги реализации:

  1. Приводим все используемые макеты к единой ориентации (желательно «ландшафт», чтобы избежать конфликтов при печати).
  2. В процедуре печати последовательно выводим каждый документ в общий ТабличныйДокумент, разделяя их разрывом страницы.
  3. Устанавливаем общие параметры страницы для всего сформированного пакета.
  4. Отправляем получившийся документ на печать одной командой Напечатать().

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

Практические советы

При выборе решения рекомендуем проанализировать вашу ситуацию:

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

← На главную