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

Публикация № 21019

Разработка - Практика программирования

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

На данный момент существует 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) с исходником программы.

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

Наименование Файл Версия Размер
-

.1247138214 23,86Kb
25.09.09
92
.1247138214 23,86Kb 92 Скачать

Специальные предложения

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

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



5. Tatitutu 3839 09.07.09 16:06 Сейчас в теме
Песенка не новая , но зато своя (с) И главное работает. +
7. Dimasik2007 415 09.07.09 16:09 Сейчас в теме
(5) Раз разработчики 1С не могут добавить, сделаем сами :)
8. akkvamarin 117 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 415 22.07.09 19:51 Сейчас в теме
(8) Спасибо, записал в копилку :). Тем более что сам запрос можно подрезать (вместо * написать только нужные поля, например name и как-там-называется-поле-дефолтного-принтера).
10. CheBurator 3426 21.09.09 23:16 Сейчас в теме
ну и неплохо бы получать для каждого принтера хотя бы статус готов/неготов
12. Dimasik2007 415 23.09.09 21:05 Сейчас в теме
(10) После тестов (будет ли замедление работы) добавлю. Спасибо!
14. CheBurator 3426 23.09.09 21:32 Сейчас в теме
(12) ждемс!!!
если есть возможность обойтись без ВК - то делаем без ВК.
11. CheBurator 3426 21.09.09 23:16 Сейчас в теме
ну и ясен пень - определять (первым в списке ставить?) дефолтный принтер
13. Noy 1066 23.09.09 21:17 Сейчас в теме
для 7.7 можно использовать формекс - там есть "шустрый" метод получитьсписокпринтеров()...
15. oiter 13.12.11 12:46 Сейчас в теме
очень не плохой алгоритм. Проблема была лишь на 64-разрядном сервере предприятия. Не знаю почему, но иногда ругался на создание Com-объекта, в следствии чего программа вываливалась. Победить ошибку так и не удалось. Сом сервис не регистрируется на 64х разрядном сервере
17. kostik_love 294 21.03.17 16:36 Сейчас в теме
&НаКлиенте
Функция ПолучитьМассивПринтеров()
	
	МассивПринтеров = Новый Массив;

	Попытка
		objWMIService = ПолучитьCOMОбъект("winmgmts:\\.\root\CIMV2"); 
	Исключение
		ТекстСообщения = НСтр("ru = 'Список принтеров не доступен!'");
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
		Возврат МассивПринтеров;
	КонецПопытки;
	
	Выборка = objWMIService.ExecQuery("SEL ECT * FR OM Win32_Printer",,48);	
	
	Для Каждого objItem Из Выборка Цикл  
		МассивПринтеров.Добавить(objItem.Caption);
	КонецЦикла;
	
	Возврат МассивПринтеров;
КонецФункции
Показать
Оставьте свое сообщение

См. также

daСклонение: склонение ФИО, должностей, чисел, прилагательных, существительных на языке 1С + ТестЦентр Промо

Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

14.02.2015    103232    98    daMaster    90    

Сравнение реального дохода со средним доходом из API.HH.RU

Зарплата Управленческие v8 v8::СПР ЗУП3.x УУ Абонемент ($m)

Внешняя обработка на управляемой форме для 1С:Предприятие 8.3 по интеграции с HH.RU используя HH REST API. Ключевые функции: получение списка вакансий по должностям (Ключ для работы не нужен); расчет среднего дохода; Тестирование проводилось на платформе 1С:Предприятие 8.3 (8.3.13.1513) Зарплата и управление персоналом, редакция 3.1 (3.1.11.68) совместно с API.HH.RU.

1 стартмани

11.11.2019    4108    5    solaru    2    

Конфигурация для рекламного агентства

Управление услугами и сервисом Управление взаимоотношениями с клиентами (СRM) Производство готовой продукции (работ, услуг) Управление взаимоотношениями с клиентами (СRM) Производство готовой продукции (работ, услуг) v8 Реклама, PR и маркетинг УУ Абонемент ($m)

Данная конфигурация выполнена для решения тестового задания: Цель задания: 1) Понять, на каком из клиентов сколько мы заработали;  2) Понять, по какому виду СМИ сколько мы заработали;  3) Проследить по каждой услуге: у кого за сколько купили и кому за сколько продали, с возможностью перейти в соответствующий документ. Реализовано с помощью: 1. Справочники - контрагенты, номенклатура 2. Документы - Поступление услуг, реализация услуг 3. Отчеты - отчет по контрагентам, номенклатуре и движений.

1 стартмани

21.05.2019    4900    0    solaru    0    

Загрузка номенклатуры в УТ 10.3 из Excel файла с генерацией штрихкодов

Загрузка и выгрузка в Excel Обработка справочников Оптовая торговля Розничная торговля Учет ТМЦ Оптовая торговля Розничная торговля Учет ТМЦ v8 УТ10 Россия Абонемент ($m)

Обработка позволяет генерировать новые номенклатурные позиции на основе данных из файла Excel с последующей генерацией штрихкодов (ШК). Может быть полезна при больших поступлениях товаров на склад, где ручное создание и присваивание штрихкода  (ШК) может занимать много времени.

1 стартмани

24.03.2017    7992    7    solaru    0    

Под капотом управляемых форм

Практика программирования v8 1cv8.cf Бесплатно (free)

Управляемые формы уже давно и плотно вошли в жизнь 1С-разработчика. Однако, судя по недавним публикациям на Инфостарте, многие до сих пор мало знакомы с ними. Предлагаю разобраться с тем, что же это такое.

26.08.2013    267661    Evil Beaver    271    

[NotaBene] Универсальный отчет по таблице значений

Практика программирования v7.7 1cv7.md Россия Абонемент ($m)

1C v.7.7 Готовое решение. Не требует настройки. Не требует допрограммирования. Данная обработка решает часто встречающуюся задачу вывода в "красивом" виде таблицы значений (полученной, например, из запроса). Поддерживается произвольное группирование данных, отключение/включение группировок, в т.ч и создание "шахматок" (типа "продажи понедельно"). Обработка может использоваться как и в отладочных целях (для нормального просмотра ТЗ), так и в составе вполне рабочих отчетов. По крайней мере, я неоднократно клиентам данную обработку ставил вместо того, чтобы каждый раз писать замороченные выводы данных. И клиенты довольны, и мне - проще...

2 стартмани

07.05.2007    29149    3    CheBurator    63