Добрый день. Подскажите, как при печати основной печатной формы распечатать еще присоедененный файл?
Печать файла в формате PDF (Пример №1) из 1С 8.3:
Процедура Печать_PDF_Файлов_1С(PDF_File) Экспорт
// Простая печать средствами 1С, программно распечатать файл в формате PDF из 1С
// PDF_File - полный путь к файлу ПДФ (например: D:\Temp1C_PDF\INPUT.pdf)
// Должен быть зарегистрирован предварительный просмотр в системе
AppShell = Новый COMОбъект("Shell.Application");
AppShell.ShellExecute(PDF_File, "", "", "print", 0);
КонецПроцедуры
Печать файла в формате PDF (Пример №2) из 1С 8.3:
Процедура Печать_PDF_Файла_Фоновая(МассивФайловPDF, ИмяУстройства = "") Экспорт
// Процедура печатает pdf-файлы (из списка) в фоновом режиме (без участия пользователя)
// Параметры процедуры:
// МассивФайловPDF - массив элементов типа "Файл" или массив структур с ключами "ПолноеИмя" и "Имя"
// ИмяУстройства - имя МФУ или принтера в системе
WScriptShell = Новый COMОбъект("WScript.Shell");
Путь_AdobeReader = WScriptShell .RegRead("HKCR\Software\Adobe\Acrobat\Exe\");
Если Не ЗначениеЗаполнено(Путь_AdobeReader) Тогда
Сообщить("Печать pdf-файлов невозможна! Не найдена программа Adobe Reader!", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
WbemScripting = Новый COMОбъект("WbemScripting.SWbemLocator");
ConnectServer = WbemScripting.ConnectServer("", "", "", ""); //Задания от всех пользователей
ConnectServer.Security_.impersonationlevel = 3; // Получение нужных прав
ConnectServer.Security_.Privileges.AddAsString("SeLoadDriverPrivilege");
Для Каждого ФайлPDF Из МассивФайловPDF Цикл
WScriptShell .Run(Путь_AdobeReader + " /N /T " + ФайлPDF.ПолноеИмя + ?(ЗначениеЗаполнено(ИмяУстройства), " " + ИмяУстройства, ""), 0);
ДобавленоЗадание = Ложь;
ТекущееВремя = ТекущаяДата();
// 40 секунд на добавление задания см.ОбработкаПрерыванияПользователя
Пока Не ДобавленоЗадание И ТекущаяДата() < ТекущееВремя + 40 Цикл
ОбработкаПрерыванияПользователя();
Для Каждого PrintJob Из ConnectServer.InstancesOf("Win32_PrintJob") Цикл
ОбработкаПрерыванияПользователя();
ДобавленоЗадание = PrintJob.Document = ФайлPDF.Имя;
КонецЦикла;
КонецЦикла;
Если Не ДобавленоЗадание Тогда
Сообщить("Не удалось распечатать файл '" + ФайлPDF.Имя + "'!", СтатусСообщения.Важное);
КонецЕсли;
КонецЦикла;
// Ожидание завершения печати
Пока ConnectServer.InstancesOf("Win32_PrintJob").Count > 0 Цикл
КонецЦикла;
// Получение имени процесса
НомерСимвола = Найти(Путь_AdobeReader, "\");
Пока НомерСимвола > 0 Цикл
Путь_AdobeReader = Сред(Путь_AdobeReader, НомерСимвола + 1);
НомерСимвола = Найти(Путь_AdobeReader, "\");
КонецЦикла;
// Удаление процесса
WScriptShell.Run("taskkill /f /im " + Путь_AdobeReader, 0);
КонецПроцедуры
Печать файла в формате PDF (Пример №3) из 1С 8.3:
Процедура Печать_PDF_Файла_Acrobat(PDF_File, ИмяУстройства, ОтправитьСразуНаПринтер) Экспорт
//Параметры процедуры для программной распечатати файла в формате PDF из 1С 8.3 :
// PDF_File - полный путь к файлу ПДФ (например: D:\Temp1C_PDF\INPUT.pdf)
// ИмяУстройства - имя МФУ или принтера в системе
// ОтправитьСразуНаПринтер - булево (истина-на принтер, ложь-открыть для просмотра)
AdobeAR = Новый Файл("C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe");
Если AdobeAR.Существует() Тогда
Если ОтправитьСразуНаПринтер = Истина Тогда
// Параметры командной строки Acrobat Reader:
// /o - не открывать диалоговое окно приложения
// /h - открыть приложение и свернуть на панели задач
// /p - открыть файл в приложении и сразу перейти к диалоговому окну печати
// /t [ [ []]] - распечатать файл на указанном принтере
ЗапуститьПриложение("""" + AdobeAR.ПолноеИмя + """ /o /t """ + PDF_File + """ """ + ИмяУстройства + """");
// <директория приложения> /o /t <имя файла> <имя принтера>
Иначе
ЗапуститьПриложение(PDF_File);//открываем на просмотр средствами ОС
КонецЕсли;
Иначе
Сообщить("Не установлен Acrobat Reader DC! Печать невозможна!");
ЗапуститьПриложение(PDF_File);//открываем на просмотр средствами ОС
КонецЕсли;
КонецПроцедуры
Печать файла в формате PDF (Пример №4) из 1С 8.3:
Процедура Печать_PDF_Файла_AcroPDF(PDF_File) Экспорт
// PDF_File - полный путь к файлу ПДФ (например: D:\Temp1C_PDF\INPUT.pdf)
AdobeAR = Новый COMОбъект("AcroPDF.PDF.1");
AdobeAR.Visible = false;
AdobeAR.LoadFile(PDF_File);
AdobeAR.printAll();
//или AdobeAR.printWithDialog();
AdobeAR.CloseAllDocs();
AdobeAR.Exit();
КонецПроцедуры
Печать файла в формате PDF (Пример №5) из 1С 8.3:
Процедура Пакетная_печать_PDF_Файлов_из_папки(PDF_Folder) Экспорт
// PDF_Folder - путь к папке с файлами ПДФ (например: D:\Temp1C_PDF)
Shell = Новый COMОбъект("Shell.Application");
Folder = Shell.Namespace(PDF_Folder);
Folders = Folder.Items;
Для Каждого Folder0 Из Folders Цикл
Folder0.InvokeVerbEx("Print");
КонецЦикла;
КонецПроцедуры
Печать файла в формате PDF (Пример №6) из 1С 8.3:
Процедура Печать_PDF_Файла_Bullzip(Табл, PDF_File)
// PDF_File - полный путь к файлу ПДФ (например: D:\Temp1C_PDF\INPUT.pdf)
// Используется сторонняя программа:
// https://www.bullzip.com/products/pdf/info.php
ИмяУстройства = Новый ComObject("Bullzip.PDFPrinterSettings");
ИмяУстройства.SetValue("output", PDF_File);
ИмяУстройства.SetValue("ShowSaveAS", "never");
ИмяУстройства.SetValue("ShowProgress", "no");
ИмяУстройства.SetValue("ShowProgressFinished", "no");
ИмяУстройства.SetValue("ShowSettings", "never");
ИмяУстройства.SetValue("ShowPDF", "no");
ИмяУстройства.SetValue("ConfirmOverwrite","no");
ИмяУстройства.SetValue("OwnerPassword","Pass4PDF");
ИмяУстройства.SetValue("Permissions",61636);
ИмяУстройства.WriteSettings();
Табл.Автомасштаб=Истина;
Табл.Имяпринтера="Bullzip PDF Printer";
PDFФайл = Новый Файл(PDF_File);
Если НЕ PDFФайл.Существует() Тогда
Табл.Напечатать(Истина);
Пока НЕ PDFФайл.Существует() Цикл
ОбработкаПрерыванияПользователя();
//ТаймерЗадержки;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Печать(Команда)
// Получаем путь файла
ПутьКФайлу = "D:\test.pdf";
// Получаем список доступных принтеров
СписокПринтеров = ПолучитьСписокПринтеров();
// выбираем нужный принтер
ЗначениеВыбора = СписокПринтеров.ВыбратьЭлемент("Выберите принтер",СписокПринтеров[0]);
Если ЗначениеВыбора = Неопределено Тогда
Возврат;
КонецЕсли;
// Печать
ПечатьPDFФайлов("D:\test.pdf",ЗначениеВыбора.Значение);
КонецПроцедуры
&НаКлиенте
Процедура ПечатьPDFФайлов(ПутьКФайлу, ИмяПринтера = "") Экспорт
WshShell = Новый COMОбъект("WScript.Shell");
ПутьAdobeReader = WshShell.RegRead("HKCR\Software\Adobe\Acrobat\Exe");
Если Не ЗначениеЗаполнено(ПутьAdobeReader) Тогда
Сообщить("Не найдена программа Adobe Reader! Печать pdf-файлов невозможна.", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
oLocator = Новый COMОбъект("WbemScripting.SWbemLocator");
oService = oLocator.ConnectServer("", "", "", ""); //Задания от всех пользователей
oService.Security_.impersonationlevel = 3; //получаем необходимые права
oService.Security_.Privileges.AddAsString("SeLoadDriverPrivilege");
НаименованиеПринтера = "";
Если ЗначениеЗаполнено(ИмяПринтера) Тогда
НаименованиеПринтера = """"+ ИмяПринтера + """";
КонецЕсли;
WshShell.Run(ПутьAdobeReader + " /N /T " + ПутьКФайлу + " " + НаименованиеПринтера, 0);
ЗаданиеДобавлено = Ложь;
ТекущееВремя = ТекущаяДата();
Пока Не ЗаданиеДобавлено И ТекущаяДата() < ТекущееВремя + 30 Цикл // 30 секунд на добавление задания
ОбработкаПрерыванияПользователя();
Для каждого ЗаданиеПечати Из oService.InstancesOf("Win32_PrintJob") Цикл
ОбработкаПрерыванияПользователя();
ЗаданиеДобавлено = ЗаданиеПечати.Document = ПутьКФайлу;
КонецЦикла;
КонецЦикла;
Если Не ЗаданиеДобавлено Тогда
Сообщить("Не удалось отправить на печать файл '" + ПутьКФайлу + "'.", СтатусСообщения.Важное);
КонецЕсли;
// Ожидаем завершения печати
Пока oService.InstancesOf("Win32_PrintJob").Count > 0 Цикл КонецЦикла;
// Получаем имя процесса
НомерСимвола = Найти(ПутьAdobeReader, "");
Пока НомерСимвола > 0 Цикл
ПутьAdobeReader = Сред(ПутьAdobeReader, НомерСимвола + 1);
НомерСимвола = Найти(ПутьAdobeReader, "");
КонецЦикла;
// Убиваем процесс
WshShell.Run("taskkill /f /im " + ПутьAdobeReader, 0);
КонецПроцедуры
&НаКлиенте
Функция ПолучитьСписокПринтеров()
Список = Новый СписокЗначений;
#Если Клиент Тогда
Попытка
КОМОбъект = Новый COMОбъект ("WScript.Network");
//возвращает массив, в котором на принтер идет два элемента - порт и локальное имя.
Принтеры = КОМОбъект.EnumPrinterConnections();
Сч = 0;
// соответственно нам нужен каждый второй элемент массива
Пока Сч < Принтеры.Count()-1 Цикл
Список.Добавить(Принтеры.Item(Сч+1), Принтеры.Item(Сч+1));
Сч = Сч + 2;
КонецЦикла;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
#КонецЕсли
Возврат Список;
КонецФункции
Если с печатью pdf такие проблемы, есть еще вариант поместить на печатну форму рисунок в формате jpg. Если есть такая возможность, подскажите как это реализовать?
Вывод картинки (изображения) на печать, в макет (табличный документ)
Код 1C v 8.х
// 1-й вариант
//Как вывести картинку в табличный документ?
ТабДок = Новый ТабличныйДокумент;
Макет = ОбработкаОбъект.ПолучитьМакет("Макет");
ОбластьКартинки = Макет.ПолучитьОбласть("ОбластьСКартинкой");
Картинка = Новый Картинка(ПутьККартинке);
// Элемент управления "Логотип" входит в коллекцию картинок области.
ОбластьКартинки.Рисунки.Логотип.Картинка = Картинка;
ТабДок.Вывести(ОбластьКартинки);
ТабДок.Показать();
// 2-й вариант
//Как вывести картинку в табличный документ без изменения макета?
Область = Макет.ПолучитьОбласть("Шапка");
Рисунок = Область.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Верх = 5;
Рисунок.Высота = 10;
Рисунок.Ширина = 10;
Рисунок.Лево = 5;
Рисунок.Картинка = Новый Картинка(ПутьККартинке);
Рисунок.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
ТабДок.Вывести(Область);
//3-й вариант
//ПечатьОрганизации , добавляем в макет картинку с именем Картинка1 в самую нижнюю
//область с именем ОбластьПечатьОрганизации
ОбластьПечатьОрганизации = Макет.ПолучитьОбласть("ПечатьОрганизации");
Картинка= Новый Картинка("C:\files\img\печатьОрганизации.gif");
ОбластьПечатьОрганизации.Рисунки.Картинка1.Картинка = картинка;
ТабДок.Вывести(ОбластьПечатьОрганизации);
// 4-й вариант динамически
ОбластьПечатьОрганизации = Макет.ПолучитьОбласть("ПечатьОрганизации");
КартинкаПечатьОрганизации = ОбластьПечатьОрганизации.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
КартинкаПечатьОрганизации.Картинка = БиблиотекаКартинок.ОбщаяКартинка1;
КартинкаПечатьОрганизации.Верх = 0;
КартинкаПечатьОрганизации.Высота = 80;
КартинкаПечатьОрганизации.Ширина = 80;
КартинкаПечатьОрганизации.Лево = 50;
КартинкаПечатьОрганизации.ГраницаСверху = Ложь;
КартинкаПечатьОрганизации.ГраницаСлева = Ложь;
КартинкаПечатьОрганизации.ГраницаСправа = Ложь;
КартинкаПечатьОрганизации.ГраницаСнизу = Ложь;
КартинкаПечатьОрганизации.РазмерКартинки = РазмерКартинки.АвтоРазмер;
ТабДок.Вывести(ОбластьПечатьОрганизации);
//5-й вариант получение картинки из хранилища значений
// Выборка.Изображение - выборка из запроса, Изображение реквизит -хранил. значений
Попытка
Путь = КаталогВременныхФайлов()+ "\1С_Картинка_"+Формат(ТекущаяДата(),"ДФ=yyyyMMddЧЧммсс")+".bmp";
КартинкаВПамяти = Выборка.Изображение.Получить();
КартинкаВПамяти.Записать(Путь);
ОбластьСостав.Рисунки.D1.Картинка = Новый Картинка(Путь);
Исключение
ОбластьСостав.Рисунки.D1.Картинка = Новый Картинка;
КонецПопытки;
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua