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

09.07.09

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

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

Скачать исходный код

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

На данный момент существует 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    3947    3    1    

4

Тернистый путь к физической клавиатуре для программиста 1С

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

Долгое время я активно пользовался различными хоткеерами, шаблонами текста, специальными раскладками клавиатуры. Я из тех, кто очень долго верил в Снегопат... Так сложилось, что на моем текущем месте работы довольно строгая политика информационной безопасности, а потому со всем привычным софтом, который делал жизнь проще, мне пришлось расстаться. И даже шаблоны кода при каждом терминальном подключении требуется настраивать в конфигураторе заново. Как известно, если какую-то задачу нельзя решить на стороне софта, то стоит поискать железное решение.

1 стартмани

15.04.2024    3828    madonov    35    

26

[История разработки] Управляем промышленным принтером EBS-1500 из 1С

Периферийные устройства Платформа 1С v8.3 Бесплатно (free)

«У нас было два контроллера Huidu, семьдесят две китайские монохромные панели на светоизлучающих диодах, они же LED, четыре мегабайта flash памяти, 1С и целое море поддерживаемых форматов вывода информации - текстов, картинок, анимаций, а так же литр промывочной жидкости, литр разбавителя, ящик черных чернил, и 12 патч-кордов и различных удлинителей. Не то, чтобы всё это было категорически необходимо в маркировке, но если уж начал собирать маркиратор на 1С, то к делу надо подходить серьёзно.» - Страх и ненависть в Маркировке, 2019 г.

01.04.2024    1234    Interrupted    14    

34

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

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

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

20.03.2024    395    1    AndSem    1    

4

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

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

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

1 стартмани

19.02.2024    621    5    realslavyan    0    

5

HotKeys на Python для 1С

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

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

20.12.2023    5348    John_d    26    

74

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

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

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

1 стартмани

07.11.2023    1305    2    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    1544    GeraltSnow    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 309 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 309 01.11.22 10:20 Сейчас в теме
20. babys 90 01.11.22 12:37 Сейчас в теме
21. Date 8 24.11.23 07:40 Сейчас в теме
(18) скорее всего не зарегистрирована компонента "MSScriptControl.ScriptControl".
Оставьте свое сообщение