Версия для печати темы (https://pro1c.org.ua/index.php?s=01432f367533609eb60d1c73d747336d&showtopic=67368)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Как при печати основной печатной формы распечатать еще присоедененный файл?

Автор: kostya77 30.10.23, 11:41

Добрый день. Подскажите, как при печати основной печатной формы распечатать еще присоедененный файл?

Автор: denis84 30.10.23, 16:09

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;
            КонецЦикла;
        Исключение
            Сообщить(ОписаниеОшибки());
        КонецПопытки;
    #КонецЕсли
    Возврат Список;
    
КонецФункции

Автор: kostya77 31.10.23, 10:14

Если с печатью pdf такие проблемы, есть еще вариант поместить на печатну форму рисунок в формате jpg. Если есть такая возможность, подскажите как это реализовать?

Автор: denis84 31.10.23, 10:49

kostya77 @ Сегодня, 10:14 * ,

Вывод картинки (изображения) на печать, в макет (табличный документ)
Код 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.Картинка = Новый Картинка;
КонецПопытки;


Это просто картинку вывести в макет.

А вот нашел на инфостарте https://pro1c.org.ua/redirect.php?https://infostart.ru/1c/articles/1573726/

Автор: kostya77 31.10.23, 11:07

denis84 @ Сегодня, 10:49 * ,
Спасибо. Буду пробовать

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua