HelpF.pro

Как напечатать документ на определенном принтере из сеанса 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);

	Иначе
		Возврат Неопределено;
			
	КонецЕсли;
		
КонецФункции

   

Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/1528.html