Имя: Пароль:
1C
 
Проверить доступность\работоспособность принтера перед ТабДок.Напечатать()
,
0 zelenprog
 
18.03.24
13:05
Здравствуйте!

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

ТабДок.ИмяПринтера = "ПринтерХХХ";
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.Неиспользовать);

Если принтер "ПринтерХХХ" включен и доступен, то все без проблем.
Однако, если он не доступен, то тут могут произойти всякие непредсказуемые неожиданности.

Как проверить, что принтер доступен и готов к печати?
Подскажите плиз.
1 Волшебник
 
18.03.24
13:09
2 Злопчинский
 
18.03.24
21:26
Возможно, для твоих целей подойдет методы из Formex
Сервис.ПолучитьСписокПринтеров();
Сервис.ГотовностПринтера(ИмяПринтера);
3 Злопчинский
 
18.03.24
21:29
а какова специфика задачи?
я сколько не сталкивался всего два варианта:
- если неготовность принтера некритичная - то и пофиг, пользователь сам разберется
- если неготовность принтера критичная - то принтер всегда должен быть в активном состоянии, не засыпать по таймауту (усбшные любят, надо спецатльно настраивать) итд чтобы было все хорошо...
4 Волшебник
 
18.03.24
21:30
(2) Плохой совет
5 rphosts
 
19.03.24
04:57
(2) разве ветка про клюшки? И да, не на каждых клюшках стоит формекс. В общем решение для частного случая небольшой доли ИБ.
6 victuan1
 
19.03.24
06:01
Можно просто формексом ловить факт того, прошла ли успешно печать на принтере.
Подойдет глобальная процедура ПриПечатиТаблицы(Таб,ФлагПредпросмотра,Заголовок,ИмяПринтера)от формекса.
7 Злопчинский
 
19.03.24
07:52
(6) и какое отношение это имеет к успешности печати на принтере или готовности принтера?
8 zelenprog
 
19.03.24
08:37
Ребята, мне нужно для 8-ки.

(3) >> а какова специфика задачи? ...
>> - если неготовность принтера критичная - то ...

Как нам кажется - критичная.
Данный табличный документ имеет некоторые особенности и предназначен для печати на конкретном принтере.

Суть команды "ТабДок.Напечатать" в том, что если "целевой" принтер, на который отправляется табличный документ, является недоступным, то ситуация становится неуправляемой. Куда уйдет это задание печати - для пользователя останется загадкой и неизвестностью, до тех пор пока бумага не вылезет на каком-нибудь другом принтере.

Вот такая "неуправляемость" очень нежелательна. И ее надо минимизировать.
Логичный подход: проверить перед печатью доступность принтера. И в случае недоступности предупредить пользователя. А если уж задание отправлено на конкретный принтер, то оно должно быть отпечатано именно на этом принтере. А если на этом принтере отпечатать это задание невозможно - то надо выдать ошибку, а не посылать его ...  куда-то еще.
9 YFedor
 
19.03.24
08:40
(8) Так если у вас известно на какой принтер нужно печатать - указывайте его в параметрах печати - на него и уйдет
10 zelenprog
 
19.03.24
08:52
(9) Выбор принтера осуществляется сразу на форме обработки, а не в параметрах печати.
И отправка табличного документа на принтер выполняется командами:

ТабДок.ИмяПринтера = Форма.Элементы.ПолеВыбранныйПринтер;
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.Неиспользовать);
11 zelenprog
 
19.03.24
08:54
ТабличныйДокумент (SpreadsheetDocument)
ИмяПринтера (PrinterName)
Использование:
Чтение и запись.
Описание:
Тип: Строка.
Содержит имя принтера, известного в системе, на который будет выводиться табличный документ при печати.
12 H A D G E H O G s
 
19.03.24
10:31
Примерно так
13 ProxyInspector
 
19.03.24
10:35
Как то так
        Принтеры = Новый СписокЗначений;
        Состояние("Составляется список принтеров. Подождите.");
        Попытка
            Locator = Новый COMОбъект("WbemScripting.SWbemLocator");
            Сервисы = Locator.ConnectServer(".");
            Объекты = Сервисы.InstancesOf("Win32_Printer");
            // Теперь переберем все принтеры системы
            Для Каждого Принтер из Объекты Цикл
                ТекИмяПринтера = Принтер.Name;
                Default = Принтер.Default;
                
                Пока Найти(ТекИмяПринтера,"\") > 0 Цикл
                    ТекИмяПринтера = Сред(ТекИмяПринтера, Найти(ТекИмяПринтера,"\")+1);
                КонецЦикла;
                ТекИмяПринтера = СокрЛП(ТекИмяПринтера);
                
                //Если Принтер.Name=ИмяПринтера Тогда
                Если Default Тогда    
                    ИмяПринтераПоУмолчанию = ТекИмяПринтера;
                КонецЕСли;
                
                Принтеры.Добавить(Принтер.Name,ТекИмяПринтера,(Принтер.Name=ИмяПринтера));
            КонецЦикла;
        Исключение
        КонецПопытки;
14 ProxyInspector
 
19.03.24
10:36
Здесь наверно можно и состояние принтера получить
15 zelenprog
 
19.03.24
11:00
(13),(14) >> Здесь наверно можно и состояние принтера получить

Вот это и интересно как тут состояние получить.
16 H A D G E H O G s
 
19.03.24
12:33
(15) Можно
17 Ёпрст
 
19.03.24
13:55
(0)

Ком = ПолучитьCOMОбъект("winmgmts:\\.\root\cimv2");
КоллекцияПринтёров = Ком.ExecQuery("Select * from Win32_Printer");
Для Каждого Принтёр из КоллекцияПринтёров Цикл
	Сообщить("name:"+Принтёр.Name+" status:"+Принтёр.Status);
КонецЦикла;


Остальной хлам смотри тут, например:
https://wutils.com/wmi/root/cimv2/win32_printer/#statusinfo_properties
18 Ёпрст
 
19.03.24
14:01
DetectedErrorState, например, глянуть..
19 Ёпрст
 
19.03.24
14:01
Занимайся
20 Garykom
 
гуру
19.03.24
14:37
(0) К сожалению принтеры это платформо-операционко зависимая хрень
Так что универсально и легко никак
Только дикие костыли
21 Garykom
 
гуру
19.03.24
14:39
(20)+ У тебя windows (какая версия?), linux или может android или даже macos?
x86/x64 или экзотический arm?
22 Garykom
 
гуру
19.03.24
14:42
(8) Поставить виртуальный принтер в операционке
Из 1С всегда использовать его
Статус виртуального принтера обычно можно получить
Куда будет отправлять виртуальный настраивается отдельно
23 zelenprog
 
19.03.24
16:01
(21) На клиентах Windows
24 Garykom
 
гуру
19.03.24
16:11
(23) https://v8.1c.ru/platforma/mnogoplatformennost/
Обрати внимание на строчку
"ARM – ОС Android, Windows"
:)