На данный момент существует 2 решения проблемы:
1. Получение списка через WMI.
ВыборПринтеров.Очистить(); // список значений
принтеры = Новый COMОбъект ("WScript.Network");
prn = принтеры.EnumPrinterConnections();
i = 0;
Пока i < prn.Count()-1 Цикл
ВыборПринтеров.Добавить(prn.Item(i+1));
i = i + 2;
КонецЦикла;
ЭтаФорма.ЭлементыФормы.Принтеры1.СписокВыбора = ВыборПринтеров; // загоняем в комбобокс
Ссылки по теме:
- v8: Отправка документов напрямую на принтер
- v8: Как получить список ИМЕН принтеров, которые доступны на компе?
- v7: Управляем принтерами из 1С интерактивно/программно без ВК...
- v7: Как получить список имен принтеров, установленных на компьютере?
Столкнулся с такой проблемой, что при получении данных таким способом заметно "подтормаживание", особенно если ряд принтеров (например, сетевых) отключен. Поэтому я предлагаю следующий вариант.
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) с исходником программы.