Как программно отправить внешнюю печатную форму сразу на принтер в 1С 8.3

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

При автоматизации складского учета или документооборота в 1С:Управление торговлей 11.5 часто возникает задача отправить печатную форму (особенно внешнюю) напрямую на принтер, минуя окно предварительного просмотра и диалог выбора принтера. Это значительно ускоряет работу операторов, позволяя печатать накладные или этикетки "в один клик". Для автоматизации пакетной печати в этой конфигурации можно использовать расширение для печати связанных документов заказа клиента.

В этой статье мы подробно разберем, как реализовать механизм прямой печати, используя возможности подсистемы «Печать» Библиотеки стандартных подсистем (БСП), на которой построена конфигурация УТ 11.5.

Метод 1. Использование стандартной процедуры БСП ВыполнитьКомандуПечатиНаПринтер

Если печатная форма уже зарегистрирована в системе и доступна для объекта (например, документа реализации), наиболее корректным способом будет использование общего модуля УправлениеПечатьюКлиент. Рассмотрим пример вызова печати для внешней печатной формы «Накладная». Для дополнительной доработки готовых макетов можно использовать инструмент для постобработки печатных форм БСП.

Для реализации этого метода проанализируем следующий программный код, который можно разместить в обработчике команды на форме или в расширении:


// Определим параметры печати
ИмяМенеджераПечати = "Документ.РеализацияТоваровУслуг"; // Менеджер объекта, к которому привязана форма
ИменаМакетов = "Накладная"; // Идентификатор печатной формы (команда печати)
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент); // Ссылка на конкретный документ

// Вызываем процедуру прямой печати
УправлениеПечатьюКлиент.ВыполнитьКомандуПечатиНаПринтер(ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов);

Разберем подробнее параметры этой процедуры:

  1. ИмяМенеджераПечати: Строка, указывающая на объект метаданных. В случае с внешними формами БСП часто требует указывать именно тот объект, в котором эта форма зарегистрирована.
  2. ИменаМакетов: Идентификатор команды печати. Обратите внимание, что это не всегда имя файла макета, а именно строковый идентификатор, заданный при регистрации внешней обработки.
  3. МассивОбъектов: Ссылки на документы, которые нужно вывести на печать. Процедура поддерживает пакетную печать, поэтому мы передаем массив.

Метод 2. Прямая печать через Табличный Документ

В ситуациях, когда вам нужно более тонко управлять процессом или когда печатная форма формируется «на лету» без жесткой привязки к командам БСП, целесообразно использовать метод Напечатать() объекта ТабличныйДокумент.

Проанализируем ситуацию: нам нужно отправить документ на печать, полностью подавив все диалоговые окна. Для этого используется параметр РежимИспользованияДиалогаПечати.Неиспользовать.


// Предположим, что ТабличныйДокумент уже сформирован функцией печати
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РЕАЛИЗАЦИЯ";
ТабличныйДокумент.АвтоМасштаб = Истина;

// Отправка на принтер по умолчанию без вопросов пользователю
ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.Неиспользовать);

Важный момент: если вы используете этот метод, убедитесь, что в ТабличныйДокумент корректно заданы параметры страницы (ориентация, поля, масштаб), иначе результат на бумаге может отличаться от ожидаемого.

Настройка конкретного принтера программно

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

Рассмотрим, как передать имя принтера через структуру параметров в процедуру БСП:


ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ИмяПринтера", "HP LaserJet Pro M402dn");
ПараметрыПечати.Вставить("КоличествоЭкземпляров", 1);

УправлениеПечатьюКлиент.ВыполнитьКомандуПечатиНаПринтер(ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов, ПараметрыПечати);

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

Посмотрим на пример кода для получения точных имен принтеров из системы:


Локатор = Новый COMОбъект("WbemScripting.SWbemLocator");
СлужбаWMI = Локатор.ConnectServer(".");
СписокПринтеров = СлужбаWMI.ExecQuery("Select * from Win32_Printer");

Для Каждого Принтер Из СписокПринтеров Цикл
    Сообщить("Доступен принтер: " + Принтер.Name);
КонецЦикла;

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

Особенности работы в Веб-клиенте

Нужно учитывать, что метод ВыполнитьКомандуПечатиНаПринтер и прямая печать без диалога практически никогда не работают в веб-клиенте. Это связано с ограничениями безопасности современных браузеров, которые запрещают веб-страницам (которыми по сути является 1С в браузере) отправлять задания на печать без подтверждения пользователем.

Если ваша автоматизация должна работать через браузер, рассмотрите следующие альтернативы:

Рекомендации по надежной реализации

При реализации фоновой или прямой печати придерживайтесь следующих правил:

  1. Проверка параметров страницы: Перед вызовом метода Напечатать() всегда устанавливайте ТабличныйДокумент.АвтоМасштаб = Истина;. Это предотвратит "обрезание" документа, если он не помещается по ширине.
  2. Имя параметров печати: Используйте свойство ИмяПараметровПечати. Это позволит системе запомнить настройки (поля, ориентацию) для конкретного типа документа в разрезе пользователя.
  3. Обработка ошибок: Оборачивайте вызов печати в блок Попытка...Исключение, так как принтер может быть выключен, бумага может отсутствовать, или драйвер может выдать критическую ошибку.

Таким образом, мы проанализировали основные способы программного взаимодействия с принтером в 1С. Использование штатных процедур БСП является наиболее предпочтительным, так как это сохраняет логику типовой конфигурации и упрощает дальнейшее обновление системы.

← На главную