Вопрос Выбор принтера для быстрой непосредственной печати — как организовать в 1С:Предприятии. COM-соединение со службой WMI
Ответ Обычно в 1С:Предприятии последовательность действий при печати документов бывает в двух вариантах:
Вариант 1 – жмем на кнопку «печать», и на принтере сразу «вылезает» лист с распечатанным текстом.
Вариант 2 – жмем на кнопку «печать», на экране компьютера появляется форма предпросмотра, идем в меню «Файл – Печать», открывается стандартное диалоговое окно Windows выбора принтера, выбираем принтер (и при желании его настройки), жмем на кнопку «Печать» и после этого уже на принтере «вылезает» лист с распечатанным текстом.
Ниже будет показано, как реализовать еще один вариант печати:
Вариант 3 — жмем на кнопку «печать», открывается наше собственное окошко выбора принтера, выбираем принтер (или предпросмотр) – жмем «ОК», документ либо сразу печатается, либо открывается окно предпросмотра.
Т.е. в этом нашем третьем варианте пользователь сам «на лету» решает, хочет ли он посмотреть этот конкретный экземпляр перед печатью.
Для реализации воспользуемся СОМ-соединением со службой WMI. (Краткая справка: WMI — Windows Management Instrumentarium – это служба Microsoft, позволяющая писать скрипты, управляющие непосредственно самой операционной системой, системными устройствами, реестром, файловой системой и т.п.*)
Отметим, что на само по себе СОМ-соединение со службой WMI уходит несколько секунд, поэтому этот метод все же не так уж удобен для торопливых пользователей.
ТабДокумент = Новый ТабличныйДокумент; // определяем содержимое печатной формы: //... // открываем СОМ-соединение с WMI: Локатор = Новый COMОбъект("WbemScripting.SWbemLocator"); // собственно метод ConnectServer() позволяет подключиться к службе WMI: СлужбаWMI = Локатор.ConnectServer(); // Переменная для списка принтеров в системе (метод InstancesOf предназначен для получения коллекции экземпляров указанного в скобках класса): ПринтерыВСистеме = СлужбаWMI.InstancesOf("Win32_Printer"); // список принтеров будем помещать в список значений: СписокПринтеров = Новый СписокЗначений; // заполним список принтеров, перебирая в цикле полученную коллекцию: Для Каждого Принтер Из ПринтерыВСистеме Цикл СписокПринтеров.Добавить(Принтер.Name); Если Принтер.Default Тогда // принтер, установленный на данном компьютере «по умолчанию», запомним сразу: ТекСтрока = СписокПринтеров[СписокПринтеров.Количество()-1]; КонецЕсли; КонецЦикла; // добавим в полученный список принтеров вариант предварительного просмотра на экране: СписокПринтеров.Добавить("На экран (Предварительный просмотр)"); // побуждаем пользователя выбрать принтер: ИмяПринтера = СписокПринтеров.ВыбратьЭлемент("Принетр для Печати",ТекСтрока); // в зависмости от выбранного значения, либо выполним непосредственную печать, либо на экран: Если НЕ ИмяПринтера = Неопределено Тогда Если ИмяПринтера.Значение = "На экран (Предварительный просмотр)" Тогда ТабДокумент.ИмяПринтера = ТекСтрока.Значение; // предварительный просмотр - значит принтер по умолчанию ТабДокумент.Показать("Печатная форма"); Иначе ТабДокумент.ИмяПринтера = ИмяПринтера.Значение; // не предварительный просмотр, значит, принтер выбрали какой-то ТабДокумент.Напечатать(Истина); КонецЕсли; КонецЕсли;
*Справочная табличка объектов библиотеки службы WMI:
Объект | Описание |
SWbemLocator | Используется для установления связи с пространством имен WMI на локальном или удаленном компьютере. В языке 1C v8 – создается с помощью метода Новый COMОбъект(), VBScript с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта WScript. |
SWbemServices | Позволяет выполнять действия над классами и объектами в пространстве имен WMI (создание, получение доступа, изменение и удаление классов или экземпляров классов). В языках VBScript и JScript создается с помощью функции GetObject, в WSH — с помощью метода GetObject объекта WScript |
SWbemObjectSet | Коллекция объектов SWbemObject, которая может быть получена путем вызова методов других объектов библиотеки поддержки сценариев WMI (например, методов ExecQuery или InstancesOf объекта SWbemservices) |
SWbemObject | Представляет либо экземпляр управляемого ресурса WMI, либо определение класса WMI. В языках VBScript и JScript создается с помощью функции GetObject, в WSH — с помощью метода GetObject объекта Wscript |
SWbemMethodSet | Коллекция объектов SWbemMethod. Хранится в свойстве Methods_ соответствующего объекта SWbemObject, не может быть создана в сценарии напрямую с помощью CreateObject или GetObject |
SWbemMethod | Позволяет получить описание метода объекта WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject |
SWbemPropertySet | Коллекция объектов SWbemProperty. Хранится в свойстве Properties_ соответствующего объекта SWbemObject, не может быть создана в сценарии напрямую с помощью CreateObject или GetObject |
SWbemProperty | Представляет одно свойство управляемого объекта WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject |
SWbemQualifierSet | Коллекция объектов SWbemQualifier. Хранится в свойстве Qualifiers_ соответствующего объекта SWbemObject, SWbemProperty или SWbemMethod. Эта коллекция не может быть создана в сценарии напрямую с помощью CreateObject или GetObject |
SWbemQualifier | Представляет либо квалификатор класса или экземпляра класса WMI, либо квалификатор свойства или метода объекта WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject |
SWbemObjectPath | Позволяет построить и проверить путь к объекту WMI. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта WScript |
SWbemNamedValueSet | Коллекция объектов SWbemNamedValue. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта Wscript |
SWbemNamedValue | Используется для передачи дополнительной информации при некоторых вызовах WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject |
SWbemLastError | Содержит расширенную информацию о произошедшей ошибке WMI. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта Wscript |
SWbemSecurity | Позволяет читать или записывать информацию об установках безопасности для определенного объекта WMI. Хранится в свойстве Security_ объектов SWbemLocator, SWbemServices, SWbemObjectSet, SWbemObject, SWbemObjectPath, SWbemLastError, SWbemEventSource |
SWbemPrivilegeSet | Коллекция объектов SWbemPrivilege. Хранится в свойстве Privileges объекта WbemSecurity |
SWbemPrivilege | Позволяет установить или удалить привилегию, необходимую для доступа к объекту WMI. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject |
SWbemEventSource | Соответствует событию WMI, которое задается с помощью метода ExecNotificationQuery объекта SWbemServices. Этот объект не может быть создан в сценарии напрямую с помощью CreateObject или GetObject |
SWbemSink | Используется для получения результатов выполнения асинхронных методов. В языке VBScript создается с помощью функции CreateObject, в JScript — с помощью конструкции new ActiveXObject, в WSH — с помощью метода CreateObject объекта Wscript |
Побольше бы таких статей! Большое спасибо — хороший материал.
Спасибо! Очень приятно.
Будем стараться.
Хорошая статья, очень помогло. Спасибо!