Как напечатать документ на определенном принтере из сеанса 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 ) ;
Иначе
Возврат Неопределено ;
КонецЕсли ;
КонецФункции
Категория:
Полезные, Универсальные Функции Печать в PDF Столкнулся с вопросом печати счета на оплату сразу в pdf.
Решение: установка виртуального принтера
bioPDF скачать можно тут. И прописывание в 1с следующего кода:
Код 1C v 8.х
Попытка
ПДФ_принтер = Новый COMОбъект("bioPDF.PDFPrinterSettings");
Исключение
#Если Клиент Тогда
Предупреждение("Не удалось подключиться к PDF-принтеру !", 60);
#КонецЕсли
Возврат;
КонецПопытки;
ПДФ_принтер_имя = ПДФ_принтер.GetPrinterName();
ИмяФайла = Константы.КаталогФайловПДФ.Получить() +"" + Заголовок + ".pdf";
ПДФ_принтер.SetValue("output", ИмяФайла);
ПДФ_принтер.SetValue("ConfirmOverwrite", "yes");
ПДФ_принтер.SetValue("ShowSaveAS", "never");
ПДФ_принтер.SetValue("ShowSettings", "never");
ПДФ_принтер.SetValue("ShowPDF", "no");
ПДФ_принтер.SetValue("Target", "printer");
ПДФ_принтер.SetValue("Subject", "Report generated at " + ТекущаяДата());
ПДФ_принтер.SetValue("UseThumbs", "yes");
ПДФ_принтер.SetValue("Zoom", "100");
ПДФ_принтер.SetValue("WatermarkFontSize", "10");
ПДФ_принтер.SetValue("WatermarkTransparency", "50");
ПДФ_принтер.SetValue("WatermarkVerticalPosition", "bottom");
ПДФ_принтер.SetValue("WatermarkHorizontalPosition", "right");
ПДФ_принтер.SetValue("WatermarkVerticalAdjustment", "3");
ПДФ_принтер.SetValue("WatermarkHorizontalAdjustment", "1");
ПДФ_принтер.SetValue("WatermarkRotation", "90");
ПДФ_принтер.SetValue("WatermarkColor", "#ff0000");
ПДФ_принтер.SetValue("WatermarkOutlineWidth", "1");
ПДФ_принтер.WriteSettings(True);
ПечатныйДокумент.ИмяПринтера = ПДФ_принтер_имя;
ПечатныйДокумент.АвтоМасштаб = Истина;
ПечатныйДокумент.Напечатать();
Как выяснилось во время печати в pdf есть проблема с передачей прозрачности картинки. Если вставлять прозрачную печать в счет поверх подписи, то в pdf-документе печать будет непрозрачной и затрет все собой. У меня был частный случай, когда печать находилась на одном и том же месте документа и за ней постоянно было одно и то же. Решением в данном случае стала генерация картинки печати с фоном, на котором она должна быть и вставка её в макет.
Так же решением может быть печать не в pdf а xps документ. Там с прозрачностью все нормально.
Автор:
Андрей Данилюк
Экспорт печатных форм и любых данных из 1С в BMP, JPEG, PCX, PDF, PNG и TIFF. Категория:
COM-объекты, WMI, WSH