kostya77 @ Сегодня, 11:41
,
Печать файла в формате 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Файл.Существует() Цикл
ОбработкаПрерыванияПользователя();
//ТаймерЗадержки;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Вроде как пишут, что 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;
КонецЦикла;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
#КонецЕсли
Возврат Список;
КонецФункции