Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 ноя 2024, 12:44

WMI CurrentPaperType

Автор AIFrame, 20 июн 2018, 20:29

0 Пользователей и 1 гость просматривают эту тему.

AIFrame

Не могу подружить ТабличныйДокумент и PaperType из принтера этикеток.
Проблема в том, что ТабДок.РазмерСтраницы = "" принимает только предопределенный список значений (A4, letter и т.д.).

Что я делаю.
Беру принтер
Процедура ИмяПринтераНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;

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

СписокПринтеров = Новый СписокЗначений;
Для Каждого Принтер Из ПринтерыВСистеме Цикл
СписокПринтеров.Добавить(Принтер.Name);
КонецЦикла;

Оповещение = Новый ОписаниеОповещения("ПослеВыбораПринтера", ЭтаФорма);
СписокПринтеров.ПоказатьВыборЭлемента(Оповещение, "Выберите принтер", Элемент);
КонецПроцедуры

Процедура ПослеВыбораПринтера(ВыбранныйЭлемент, СписокПараметров) Экспорт
    Если ВыбранныйЭлемент <> Неопределено Тогда
        ИмяПринтера = ВыбранныйЭлемент.Значение;
УстановитьПринтерЭтикеток();
    КонецЕсли;
КонецПроцедуры

Беру список PaperNames из него
Процедура ИмяОбразцаПечатиНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;

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

СписокОбразцов = Новый СписокЗначений;
Если ИмяПринтера <> "" Тогда
Для Каждого Принтер Из ПринтерыВСистеме Цикл
Индекс = Найти(Принтер.Name, ИмяПринтера);
Если Индекс > 0 Тогда
ПринтерЭтикеток = Принтер.Name;

ОбразцыПечати = Принтер.PrinterPaperNames;
ОбразецНайден = Ложь;
Если ИмяОбразцаПечати <> "" Тогда
Для каждого ОбразецПечати ИЗ ОбразцыПечати Цикл
СписокОбразцов.Добавить(ОбразецПечати);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;

Оповещение = Новый ОписаниеОповещения("ПослеВыбораОбразца", ЭтаФорма);
СписокОбразцов.ПоказатьВыборЭлемента(Оповещение, "Выберите образец печати", Элемент);
КонецПроцедуры

Процедура ПослеВыбораОбразца(ВыбранныйЭлемент, СписокПараметров) Экспорт
    Если ВыбранныйЭлемент <> Неопределено Тогда
        ИмяОбразцаПечати = ВыбранныйЭлемент.Значение;
УстановитьПринтерЭтикеток();
    КонецЕсли;
КонецПроцедуры



Выставляю
Процедура УстановитьПринтерЭтикеток()
мПринтерЭтикеток = неопределено;
мОбразецПечати = неопределено;

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

Если ИмяПринтера <> "" Тогда
Для Каждого Принтер Из ПринтерыВСистеме Цикл
Индекс = Найти(Принтер.Name, ИмяПринтера);
Если Индекс > 0 Тогда
мПринтерЭтикеток = Принтер.Name;

ОбразцыПечати = Принтер.PrinterPaperNames;
ОбразецНайден = Ложь;
Если ИмяОбразцаПечати <> "" Тогда
Для каждого ОбразецПечати ИЗ ОбразцыПечати Цикл
Если ОбразецПечати = ИмяОбразцаПечати Тогда
Принтер.CurrentPaperType = ОбразецПечати;
ОбразецНайден = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ОбразецНайден Тогда
мОбразецПечати = ИмяОбразцаПечати;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;

Если мПринтерЭтикеток = неопределено Тогда
Предупреждение("Принтер этикеток с именем '" + ИмяПринтера + "' не обнаружен!");
ЭлементыФормы.ИмяПринтера.ЦветФонаПоля = WebЦвета.Лосось;
Иначе
ЭлементыФормы.ДокументРезультат.ИмяПринтера = мПринтерЭтикеток;
ЭлементыФормы.ИмяПринтера.ЦветФонаПоля = WebЦвета.НейтральноЗеленый;
КонецЕсли;

Если мОбразецПечати = неопределено Тогда
Предупреждение("Образец с именем '" + ИмяОбразцаПечати + "' не найден в настройках принтера!");
ЭлементыФормы.ИмяОбразцаПечати.ЦветФонаПоля = WebЦвета.Лосось;
Иначе
ЭлементыФормы.ИмяОбразцаПечати.ЦветФонаПоля = WebЦвета.НейтральноЗеленый;
КонецЕсли;
КонецПроцедуры

По отладке 'Принтер.CurrentPaperType' принимает нужно значение.
Но ТабДок все равно продолжает использовать ранее выбранный тип.
При попытке установить в РазмерСтраницы что-то типа 'label' (текущее имя настройки PaperType из принтера) естественно валится ошибкой, что такое значение присвоить не может. Тем не менее, в параметрах страницы можно выбрать Размер страницы из параметров принтера и они будут применены к принтеру, но повторить это действие кодом не могу.
Получается, что я применяю установки для принтера как-то в стороне от ТабДок, и ТабДок оверрайдит или вообще игнорирует эту настройку, применяя свою из памяти.

AIFrame

Либо я как-то неправильно делаю присвоение.
С WMI почти не знаком.

AIFrame

Короче, я так и не нашел решения (Задать макет из параметров принтера в 1С).
В принципе, если табдок присутствует как элемент формы, этого достаточно, ибо настройки юзера хранят используемый макет и принтер. Мне этого хватает.

Теги:
Рейтинг@Mail.ru

Поиск