Имя: Пароль:
1C
 
Нужно распечатать pdf или html файлы из 1С пакетом на определенный принтер
0 rotting
 
09.05.18
12:58
Собственно какие можно придумать решения, желательно без сторонних решений, средствами 1С?
1 d4rkmesa
 
09.05.18
20:40
Без сторонних решений будут костыли.

Печатать pdf можно так (при средней интенсивности печати, желательно, чтобы в системе не было неработающих принтеров с заполненной очередью печати):

// Процедура выполняет попытку напечатать 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);
        
        ЗаданиеДобавлено = Ложь;
        ТекущееВремя = ТекущаяДата();
        Пока Не ЗаданиеДобавлено И ТекущаяДата() < ТекущееВремя + 15 Цикл // 15 секунд на добавление задания
            ОбработкаПрерыванияПользователя();
            Для каждого ЗаданиеПечати Из oService.InstancesOf("Win32_PrintJob") Цикл
                ОбработкаПрерыванияПользователя();
                ЗаданиеДобавлено = ЗаданиеПечати.Document = Файл.Имя;
            КонецЦикла;    
        КонецЦикла;
        
        Если Не ЗаданиеДобавлено Тогда
            Сообщить("Не удалось отправить на печать файл '" + Файл.Имя + "'.", СтатусСообщения.Важное);
        КонецЕсли;
    КонецЦикла;
    
    // Ожидаем завершения печати
    ТекущееВремя = ТекущаяДата();
    Пока (oService.InstancesOf("Win32_PrintJob").Count > 0)И(ТекущаяДата() < ТекущееВремя + 15) Цикл
    КонецЦикла;
    
    // Получаем имя процесса
    НомерСимвола = Найти(ПутьAdobeReader, "\");
    Пока НомерСимвола > 0 Цикл
        ПутьAdobeReader = Сред(ПутьAdobeReader, НомерСимвола + 1);
        НомерСимвола = Найти(ПутьAdobeReader, "\");
    КонецЦикла;
    // Убиваем процесс
    WshShell.Run("taskkill /f /im " + ПутьAdobeReader, 0);
    
КонецПроцедуры    //ФоноваяПечатьPDFФайлов(МассивФайлов, ИмяПринтера = "") Экспорт
2 rotting
 
10.05.18
08:29
(1) А зачем 15 сек. на добавление задания, это происходит так долго?
3 Azverin
 
10.05.18
08:57
(0) я перед печатью "склеиваю" pdf-файлы в один многострочный файл (Acrobat более 50 файлов за раз не открывает) и печатаю. подойдёт?
4 rotting
 
10.05.18
09:07
(3) подойдет, подскажи как
5 Azverin
 
10.05.18
09:14
(4) посмотрел код - используется внешняя программка pdftk.exe. подойдёт?
6 rotting
 
10.05.18
09:16
(5) да все варианты хочу видеть
7 Azverin
 
10.05.18
09:30
(6)  Необходимо получить в строку пути всех файлов через пробел:
ВсеПутиКФайлам = ВсеПутиКФайлам + ИмяВнешнегоФайла + " ";

ВсеПутиКФайлам = "C:\Users\ххх\AppData\Local\Temp\23\2(57).pdf C:\Users\ххх\AppData\Local\Temp\23\3(2).pdf C:\Users\ххх\AppData\Local\Temp\23\3(8).pdf и т.д."

Объединенный pdf-файл открывается, печатается пользователем, после удаляется.

    ПутьДоФайла = ПолучитьПутьТомаХранения()+"PDF";
        
        ФайлОбъединения = ПутьДоФайла+"\"+СсылкаНаОбъект.Номер+"_all.pdf";
        
        Скрипт = Новый COMОбъект("WScript.Shell");
        Скрипт.Run("C:\Progra~2\PDFtk\bin\pdftk.exe "+ВсеПутиКФайлам+"output "+ФайлОбъединения,0,1);        
        //ЗапуститьПриложение("C:\Progra~2\PDFtk\bin\pdftk.exe "+ВсеПутиКФайлам+"output "+ФайлОбъединения);
        
        КодВозврата = 0;
        ЗапуститьПриложение(ФайлОбъединения,,Истина,КодВозврата);
        
        МаскаУдаления = "*.pdf";
        МассивФайлов = НайтиФайлы(ПутьДоФайла,МаскаУдаления);
        Для каждого ФайлМ из МассивФайлов Цикл
            Если ФайлМ.ПолучитьТолькоЧтение() Тогда
                ФайлМ.УстановитьТолькоЧтение(Ложь);
            КонецЕсли;    
            Попытка
                УдалитьФайлы(ФайлМ.ПолноеИмя);
            Исключение
                Сообщить("Ошибка удаления временного файла: " + ОписаниеОшибки(), СтатусСообщения.Обычное);
            КонецПопытки;
        КонецЦикла;

8 rotting
 
10.05.18
09:40
(7) спасибо
2 + 2 = 3.9999999999999999999999999999999...