Получение списка принтеров

09.07.09

Интеграция - Периферийные устройства

Часто требуется получить список принтеров...

Скачать файлы

Наименование Файл Версия Размер
-
.1247138214 23,86Kb
93
.1247138214 23,86Kb 93 Скачать

На данный момент существует 2 решения проблемы:

1. Получение списка через WMI. 

ВыборПринтеров.Очистить(); // список значений 
принтеры = Новый COMОбъект ("WScript.Network"); 
prn = принтеры.EnumPrinterConnections(); 
i = 0; 
Пока i < prn.Count()-1 Цикл 
    ВыборПринтеров.Добавить(prn.Item(i+1)); 
    i = i + 2; 
КонецЦикла; 
ЭтаФорма.ЭлементыФормы.Принтеры1.СписокВыбора = ВыборПринтеров; // загоняем в комбобокс

Ссылки по теме:

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

2. Получение списка принтеров во внешнем приложении, сохранение в файл, и чтение файла в нужном месте в 1С. 

Например, на Visual Studio (мне так проще) можно написать такой простенький код:

string path = @"c:\MyGetPrinters.txt";
    if (!File.Exists(path))
    {
       // Create a file to write to.
       using (StreamWriter sw = File.CreateText(path))
       {
          PrintDocument pd = new PrintDocument();
          for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++)
          {
              string t = PrinterSettings.InstalledPrinters[i];
              sw.WriteLine(t);
              pd.PrinterSettings.PrinterName = t;
              sw.WriteLine(pd.PrinterSettings.IsDefaultPrinter);
          } 
       }
    }

Код получает наименование всех принтеров в системе, в т.ч. сетевых, а также анализирует, установлен ли принтер по умолчанию, и записывает его в файлик, в таком формате:

\\sam\HP LaserJet 2420 PCL 6
False
Microsoft Office Document Image Writer
True

Далее, где нужно - вызываем программульку (я поставил в автозагрузку, т.к. редко принтеры добавляем) и в коде пишем примерно следующее: 

ВыборПринтеров.Очистить(); // список значений
сч = 0; активный = 0;
Файл=Новый Файл("c:\printers.txt");
Если Файл.Существует() Тогда
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать("c:\printers.txt", КодировкаТекста.ANSI);
    н = 1;
    Пока н < Текст.КоличествоСтрок() Цикл
        стр = Текст.ПолучитьСтроку(н);
        стр2 = Текст.ПолучитьСтроку(н+1);
        н = н + 2; ВыборПринтеров.Добавить(стр);
        Если СОКРЛП(стр2) = "True" Тогда
            ТекПринт = стр;
            активный = сч;
        КонецЕсли; 
        сч = сч + 1;
    КонецЦикла;
КонецЕсли;
ЭлементыФормы.пвПринтер.СписокВыбора = ВыборПринтеров;
ЭлементыФормы.пвПринтер.ВыделенныйТекст = ВыборПринтеров[активный].Значение;

Ну а в нужном месте, например, ТабДок.ИмяПринтера = ЭлементыФормы.пвПринтер.ВыделенныйТекст...

В файле проект под Visual Studio 2005(8) с исходником программы.

См. также

Распознавание номеров автомашин с ip - камер, видео, фото

Распознавание документов и образов Периферийные устройства Автомобили, автосервисы Россия Платные (руб)

Программа считывает кадры с ip-камер (http - запрос к камере), видео, фото (источники кадров (нет ограничения на их количество) настраивается в конфигурационном файле), находит и распознает номера автомашин и сохраняет в базу db, с сохранением фото номера и автомашины, а также времени детекции.

20400 руб.

31.05.2023    3800    2    1    

3

Получение изображения с веб-камеры с возможностью его кадрирования по произвольной области

Инструментарий разработчика Периферийные устройства Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Внешняя обработка получения изображения с веб-камеры с возможностью его кадрирования по произвольно выделенной области. Использует собственную внешнюю компоненту на основе библиотеки AForge. Содержит примеры интерактивного взаимодействия с полем HTML.

20.03.2024    320    1    AndSem    1    

3

Прямая печать на принтерах TSC из 1С

Периферийные устройства Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Прямая печать на принтерах TSC из 1С при вызове с сервера позволяет печатать из тонкого клиента, мобильного клиента и веб-клиента. Потребуется установка драйвера и библиотеки для отправки команд на этот драйвер.

1 стартмани

19.02.2024    532    3    realslavyan    0    

5

HotKeys на Python для 1С

Периферийные устройства Конфигурации 1cv8 Бесплатно (free)

Недавно прочитал статью на Инфостарте о KeyPad и вначале захотел себе такой, но через какое-то время я понял, что дополнительная даже маленькая клавиатура занимает место, и нужно все время держать ее под рукой. Это все создает дополнительные неудобства.

20.12.2023    4920    John_d    25    

70

Очистка очереди печати конкретного принтера

Периферийные устройства Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Очистка очереди печати выбранного принтера, перезапуск службы печати, вывод списка системных принтеров, открытие свойств принтера из 1С.

1 стартмани

07.11.2023    1257    1    vsnazarov    1    

26

Печать этикеток на DYMO LabelManager 280 через DYMO Connect Web Service

Периферийные устройства WEB-интеграция Этикетки, ценники Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

На сайте производителя принтера DYMO LabelManager 280 вместе с драйвером поставляется пакет DYMO Connect, который предлагает функционал вёрстки этикеток в фирменном формате и отправки их напрямую на принтер. Так же в этом пакете есть веб-сервис для взаимодействия с принтером через HTTP-запросы, о котором и пойдет речь в этой статье.

29.08.2023    1458    GeraltSnow    0    

3

Второй монитор в качестве дисплея покупателя

Розничная торговля Периферийные устройства Платформа 1С v8.3 1С:Управление торговлей 11 Абонемент ($m)

Использование второго монитора в качестве дисплея покупателя. Выполнено в качестве расширения.

1 стартмани

02.02.2023    3188    25    windsurf    4    

5
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Dimasik2007 430 09.07.09 15:19 Сейчас в теме
Примечание. Не самое изящное решение, но вполне работоспособное :)
2. Ёпрст 1063 09.07.09 15:48 Сейчас в теме
а кто будет обновлять текстовый файлик потом ? При добавлении новых/удалении старых/изменения статуса по-умолчанию и т.д и т.п ?
4. Dimasik2007 430 09.07.09 16:03 Сейчас в теме
(2) (3) Так поставьте в процедуру при загрузке 1С, или еще куда-нибудь. Не в этом суть. Прога отрабатывает меньше 1 секунды, так что помещать можно куда угодно.
6. Dimasik2007 430 09.07.09 16:06 Сейчас в теме
(4) Имеется в виду вызов программки.
3. Ёпрст 1063 09.07.09 15:49 Сейчас в теме
>>>(я поставил в автозагрузку

это вообще не катит.. принтёр могут установить в течении дня.
В большой конторе это очень частое явление.



5. Tatitutu 3855 09.07.09 16:06 Сейчас в теме
Песенка не новая , но зато своя (с) И главное работает. +
7. Dimasik2007 430 09.07.09 16:09 Сейчас в теме
(5) Раз разработчики 1С не могут добавить, сделаем сами :)
8. akkvamarin 120 17.07.09 17:31 Сейчас в теме
<Столкнулся с такой проблемой, что при получение данных таким способом заметно "подтормаживание">

Да, так действительно, тормозит, я заметил это давно. Для куска кода вашего пункта 1 ни в коем случае нельзя указывать "Пока i < prn.Count()-1 Цикл" лучше заранее определить общее количество принтеров и использовать эту переменную для цикла "Пока i < ОбщКолВоПринтеров - 1 Цикл", поскольку каждый прогон по циклу система делает запрос на размер коллекции принтеров, что сильно увеличивает время исполнения кода.
Я, например, получаю их в 1С другим способом. Срабатывает моментом:
Сервис = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\" +ИмяКомпьютера() + "\root\cimv2");
ПринтерыВсе = Сервис.ExecQuery("Sel ect * from Win32_Printer");
Для Каждого Принтер из ПринтерыВсе Цикл
Сообщить(Принтер.Name);
КонецЦикла;


anig99; ABudnikov; m.ershov.ru@gmail.com; Lisena_Xitrena; Восьмой; Hadgehogs; xpym-xpym; +7 Ответить
9. Dimasik2007 430 22.07.09 19:51 Сейчас в теме
(8) Спасибо, записал в копилку :). Тем более что сам запрос можно подрезать (вместо * написать только нужные поля, например name и как-там-называется-поле-дефолтного-принтера).
10. CheBurator 3119 21.09.09 23:16 Сейчас в теме
ну и неплохо бы получать для каждого принтера хотя бы статус готов/неготов
12. Dimasik2007 430 23.09.09 21:05 Сейчас в теме
(10) После тестов (будет ли замедление работы) добавлю. Спасибо!
14. CheBurator 3119 23.09.09 21:32 Сейчас в теме
(12) ждемс!!!
если есть возможность обойтись без ВК - то делаем без ВК.
11. CheBurator 3119 21.09.09 23:16 Сейчас в теме
ну и ясен пень - определять (первым в списке ставить?) дефолтный принтер
13. Noy 1076 23.09.09 21:17 Сейчас в теме
для 7.7 можно использовать формекс - там есть "шустрый" метод получитьсписокпринтеров()...
15. oiter 13.12.11 12:46 Сейчас в теме
очень не плохой алгоритм. Проблема была лишь на 64-разрядном сервере предприятия. Не знаю почему, но иногда ругался на создание Com-объекта, в следствии чего программа вываливалась. Победить ошибку так и не удалось. Сом сервис не регистрируется на 64х разрядном сервере
16. пользователь 12.01.15 13:10
Сообщение было скрыто модератором.
...
17. kostik_love 308 21.03.17 16:36 Сейчас в теме
&НаКлиенте
Функция ПолучитьМассивПринтеров()
	
	МассивПринтеров = Новый Массив;

	Попытка
		objWMIService = ПолучитьCOMОбъект("winmgmts:\\.\root\CIMV2"); 
	Исключение
		ТекстСообщения = НСтр("ru = 'Список принтеров не доступен!'");
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
		Возврат МассивПринтеров;
	КонецПопытки;
	
	Выборка = objWMIService.ExecQuery("SEL ECT * FR OM Win32_Printer",,48);	
	
	Для Каждого objItem Из Выборка Цикл  
		МассивПринтеров.Добавить(objItem.Caption);
	КонецЦикла;
	
	Возврат МассивПринтеров;
КонецФункции
Показать
18. babys 90 26.10.22 11:22 Сейчас в теме
(17) А вот воскрешу-ка я тему
Вопрос на засыпку на строке
Для Каждого objItem Из Выборка Цикл
пишет: "Итератор значения не определен"
Как проверить что в выборке есть данные?
19. kostik_love 308 01.11.22 10:20 Сейчас в теме
20. babys 90 01.11.22 12:37 Сейчас в теме
21. Date 8 24.11.23 07:40 Сейчас в теме
(18) скорее всего не зарегистрирована компонента "MSScriptControl.ScriptControl".
Оставьте свое сообщение