gifts2017

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

Опубликовал Dmitry Dmitry (Dimasik2007) в раздел Программирование - Практика программирования

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

На данный момент существует 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
89
.1247138214 23,86Kb 89 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Dmitry Dmitry (Dimasik2007) 09.07.09 15:19
Примечание. Не самое изящное решение, но вполне работоспособное :)
2. Епрст (Ёпрст) 09.07.09 15:48
а кто будет обновлять текстовый файлик потом ? При добавлении новых/удалении старых/изменения статуса по-умолчанию и т.д и т.п ?
3. Епрст (Ёпрст) 09.07.09 15:49
>>>(я поставил в автозагрузку

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



4. Dmitry Dmitry (Dimasik2007) 09.07.09 16:03
(2) (3) Так поставьте в процедуру при загрузке 1С, или еще куда-нибудь. Не в этом суть. Прога отрабатывает меньше 1 секунды, так что помещать можно куда угодно.
5. Юрий Тимофеев (Tatitutu) 09.07.09 16:06
Песенка не новая , но зато своя (с) И главное работает. +
6. Dmitry Dmitry (Dimasik2007) 09.07.09 16:06
(4) Имеется в виду вызов программки.
7. Dmitry Dmitry (Dimasik2007) 09.07.09 16:09
(5) Раз разработчики 1С не могут добавить, сделаем сами :)
8. Кирилл Коновалов (akkvamarin) 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 Ответить 1
9. Dmitry Dmitry (Dimasik2007) 22.07.09 19:51
(8) Спасибо, записал в копилку :). Тем более что сам запрос можно подрезать (вместо * написать только нужные поля, например name и как-там-называется-поле-дефолтного-принтера).
10. Сергей (Che) Коцюра (CheBurator) 21.09.09 23:16
ну и неплохо бы получать для каждого принтера хотя бы статус готов/неготов
11. Сергей (Che) Коцюра (CheBurator) 21.09.09 23:16
ну и ясен пень - определять (первым в списке ставить?) дефолтный принтер
12. Dmitry Dmitry (Dimasik2007) 23.09.09 21:05
(10) После тестов (будет ли замедление работы) добавлю. Спасибо!
13. Алексей Плутенко (Noy) 23.09.09 21:17
для 7.7 можно использовать формекс - там есть "шустрый" метод получитьсписокпринтеров()...
14. Сергей (Che) Коцюра (CheBurator) 23.09.09 21:32
(12) ждемс!!!
если есть возможность обойтись без ВК - то делаем без ВК.
15. Дмитрий Сосенков (oiter) 13.12.11 12:46
очень не плохой алгоритм. Проблема была лишь на 64-разрядном сервере предприятия. Не знаю почему, но иногда ругался на создание Com-объекта, в следствии чего программа вываливалась. Победить ошибку так и не удалось. Сом сервис не регистрируется на 64х разрядном сервере
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа