Как напечатать документ на определенном принтере из сеанса RDP (Терминал) В 1С есть возможность обратиться к принтеру по имени перед печатью, однако при работе через терминал к названию принтера добавляется (перенаправлено N), где N постоянно меняется. Решение следующее:
Код 1C v 8.2 УП
&НаКлиенте
Функция ИмяПринтераRDP(ИмяПринтера)
Shell = Новый COMОбъект( "Wscript.Shell" ) ;
Task = Shell. Exec( "query session" ) ;
РезультатЗапроса = Task. StdOut. ReadAll( ) ;
РезультатЗапроса = Декодер( РезультатЗапроса, "windows-1251" , "cp866" ) ;
Task. Terminate( ) ;
Shell = Неопределено ;
Network = Новый COMОбъект( "WScript.Network" ) ;
ПользовательОС = Network. UserName( ) ;
Network = Неопределено ;
НомерСеанса = RegExpGetFirstMatch( "rdp-tcp\S+\s+" + ПользовательОС + "\s+(\d+)" , РезультатЗапроса) ;
Возврат ИмяПринтера + " (перенаправлено " + НомерСеанса + ")" ;
КонецФункции
Функция Декодер(Стр, Вход, Выход)
Stream = Новый COMОбъект( "Adodb.Stream" ) ;
Stream. Type = 2 ;
Stream. Mode = 3 ;
Stream. Charset = Вход;
Stream. Open( ) ;
Stream. WriteText( Стр) ;
Stream. Position = 0 ;
Stream. Charset = Выход;
Результат = Stream. ReadText( - 1 ) ;
Stream. Close( ) ;
Возврат Результат;
КонецФункции
Функция RegExpGetFirstMatch(Маска, Строка, МногострочныйРежим = Истина, ГлобальныйПоиск = Истина, БезУчетаРегистра = Истина)
RegExp = Новый COMОбъект( "VBScript.RegExp" ) ;
RegExp. Multiline = МногострочныйРежим;
RegExp. Global = ГлобальныйПоиск;
RegExp. IgnoreCase = БезУчетаРегистра;
RegExp. Pattern = Маска;
Matches = RegExp. Execute( Строка) ;
Если Matches. Count = 1 тогда
Возврат Matches. Item( 0 ) . SubMatches. Item( 0 ) ;
Иначе
Возврат Неопределено ;
КонецЕсли ;
КонецФункции
Категория:
Полезные, Универсальные Функции