Многие пользователи сталкиваются с проблемой, когда при отправке комплекта документов на печать из 1С на выходе получается «каша». Документы перемешиваются, страницы разных отчетов могут идти не по порядку или вклиниваться в задания других сотрудников. Это происходит потому, что Windows-диспетчер очереди печати (Spooler) оптимизирует процесс, отдавая приоритет заданиям, которые готовы к печати быстрее, что приводит к «обгону» одних документов другими.
Если нет возможности менять архитектуру печати, мы можем заставить 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;
КонецЦикла;
КонецПроцедуры
Этот метод полезен тем, что он требует минимальных изменений в коде. Однако учтите, что он работает на уровне сессии пользователя и может не учитывать нагрузку от других сотрудников, работающих в терминале.
Это самый надежный метод для больших объемов печати (сотни комплектов в день). Суть подхода заключается в том, чтобы исключить прямую отправку из 1С на принтер. Вместо этого мы формируем «задания» в файловой системе.
PDF-файлы во временную папку..cmd), который содержит инструкции по порядку склейки PDF-файлов в единый документ.Преимущества этого подхода:
Если конфигурация позволяет, мы можем попробовать собрать все печатные формы в один объект ТабличныйДокумент с помощью метода Присоединить(). Это гарантирует, что Windows воспримет пакет документов как одно задание.
Разберем основные шаги реализации:
ТабличныйДокумент, разделяя их разрывом страницы.Напечатать().Этот метод сложнее в реализации из-за необходимости переделки множества внешних печатных форм, но он дает наиболее предсказуемый результат при работе с сетевыми принтерами, так как для сервера печати все это является одним заданием.
При выборе решения рекомендуем проанализировать вашу ситуацию:
Помните, что автоматизация печати в сложных сетевых инфраструктурах всегда требует компромисса между «красивым кодом» и «физической реальностью» оборудования. Начинайте с малого — попробуйте добавить небольшие паузы или оптимизировать драйверы, и только при неэффективности переходите к сложным интеграционным решениям.