Имя: Пароль:
1C
1С v8
ДО 2.1. Конвертация в PDF документа с ЭП.
0 DmitriySsssss
 
19.08.24
16:20
Добрый день!
Задача реализовать в 1С:ДО 2.1 следующий алгоритм:
1. Подписанту приходит документ (в моем случае служебная записка) задачей на подписание.
2. Подписант подписывает файл с СЗ, вложенный в документ, с помощью простой электронной подписи.
3. Подписан нажимает на кнопку в задаче "Подписать", тем самым завершая задачу.
4. Файлы, где ПодписанЭП = Истина переводятся в pdf и прикрепляются к документу.

Алгоритм мной реализован, но есть проблема - после подписания ЭП файл получает реквизит ПодписанЭП = Истина, а также проставляется штамп ЭП только после того, как файл мной открыт вручную. То есть чтобы алгоритм корректно перевел в pdf подписанные ЭП файлы, отобразив штампы, требуется подписать файл ЭП, а затем вручную подписанту открыть его, и только после этого завершать задачу, по исполнению которой осуществляется перевод в pdf. В теории можно перед переводом документа в pdf автоматически открывать файл, но прошу подсказать, как это реализовать...
1 DmitriySsssss
 
19.08.24
16:23
Процедура КонвертацияВПДФ(ВнутреннийДокумент)    

Если ВнутреннийДокумент.ВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка (Тест)") тогда
Документоо = ВнутреннийДокумент;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Файлы.Ссылка КАК Файл
        |ИЗ
        |    Справочник.Файлы КАК Файлы
        |ГДЕ
        |    Файлы.ВладелецФайла = &ВладелецФайла
        |    И НЕ Файлы.ПометкаУдаления";

    Запрос.УстановитьПараметр("ВладелецФайла", Документоо.Ссылка);
  
    РезультатЗапроса = Запрос.Выполнить();
    Если НЕ РезультатЗапроса.Пустой() Тогда
              
        Выборка = Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
            Если  Выборка.Файл.Описание = "Визуализация ЭП" и Выборка.Файл.ПометкаУдаления = Ложь Тогда
            
                //Фа = Выборка.Файл;
                Выборка.Файл.Прочитать();
                Выборка.Файл.Показать();
                ДанныеФайла = РаботаСФайламиВызовСервера.ДанныеФайлаДляСохранения(Выборка.Файл);
                Если НЕ (ДанныеФайла.Расширение = "doc" ИЛИ ДанныеФайла.Расширение = "docx" ИЛИ ДанныеФайла.Расширение = "odt" ) Тогда
                    Продолжить;
                КонецЕсли;
                
                FileDOC = ПолучитьИмяВременногоФайла(ДанныеФайла.Расширение);
                FilePDF = ПолучитьИмяВременногоФайла("pdf");
                
                 Если Данныефайла.ТипХраненияФайла=Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда
                    ДвоичныеДанныеDOC = РаботаСФайламиВызовСервера.ПолучитьХранилищеФайлаИзИнформационнойБазы(ДанныеФайла.ТекущаяВерсия).Получить();
                Иначе
                    ДвоичныеДанныеDOC = РаботаСФайламиВызовСервера.ПолучитьДвоичныеДанныеФайла(Выборка.Файл);
                КонецЕсли;

                ДвоичныеДанныеDOC.Записать(FileDOC);
                
                MSWordApp = Новый COMОбъект("Word.Application");
                MSWordApp.Visible = False;                    
                MSWordApp.Documents.Open(FileDOC);
                
                WordDocument = MSWordApp.Application.Documents(1);
                WordDocument.Activate();
                WordDocument.SaveAs(FilePDF, 17);
                
                MSWordApp.Application.Quit();
                
                СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией", Новый Файл(FilePDF));
                СведенияОФайле.ИмяБезРасширения              = Документоо.Наименование;
                СведенияОФайле.Автор                         = ДанныеФайла.АвторТекущейВерсии;
                СведенияОФайле.НоваяВерсияАвтор              = ДанныеФайла.АвторТекущейВерсии;
                СведенияОФайле.АдресВременногоХранилищаФайла = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(FilePDF));
                
                НовыйФайлPDF = РаботаСФайламиВызовСервера.СоздатьФайлСВерсией(ДанныеФайла.Владелец, СведенияОФайле);
            КонецЕсли;
        КонецЦикла;
        
    КонецЕсли;
КонецЕсли;
КонецПроцедуры
2 Garykom
 
19.08.24
17:57
(0) 1. Вместо Новый COMОбъект("Word.Application") лучше использовать https://gotenberg.dev/
Поднять его на виртуалке в докере

2. После перевода файла офиса (настройки не забыть какие расширения файлов обрабатывать) в PDF штамп можно накладывать самому
В ДО есть функции/процедуры для разбора PDF на картинки PNG через ImageMagick/Ghostscript и обратно PNG в PDF
И да не проблема через ImageMagick на одну картинку наложить поверх другую картинку с нужной прозрачностью
Можно даже настройки сделать где и как накладывать (координаты штампа, поворот, прозрачность, размер и т.д.)
3 Momus
 
20.08.24
09:44
Я проблему с визуализацией решил таким образом, написав код ниже в дополнительные обработчики бизнес-событий:
    Пока Выборка.Следующий() Цикл
        ФайлСсылкаЭП = РаботаСФайламиВызовСервера.ПолучитьФайлВизуализации(Выборка.Владелец,,);
        Если ФайлСсылкаЭП <> Неопределено Тогда
            
            ДанныеФайла = РаботаСФайламиВызовСервера.ДанныеФайла(ФайлСсылкаЭП);
            
            дд = РаботаСФайламиВызовСервера.ПолучитьДвоичныеДанныеФайла(ФайлСсылкаЭП);    
            
            СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией");
            СведенияОФайле.ИмяБезРасширения = ДанныеФайла.ПолноеНаименованиеВерсии;
            СведенияОФайле.РасширениеБезТочки = ДанныеФайла.Расширение;
            СведенияОФайле.Комментарий = НСтр("ru = 'Визуализация ЭП'");
            
            СведенияОФайле.АдресВременногоХранилищаФайла = ПоместитьВоВременноеХранилище(дд);
            СведенияОФайле.ВремяИзменения = ТекущаяДатаСеанса();
            СведенияОФайле.ВремяИзмененияУниверсальное = ТекущаяДатаСеанса();
            СведенияОФайле.Размер = дд.Размер();
            
            ВерсияСсылка = РаботаСФайламиВызовСервера.СоздатьВерсию(Выборка.Владелец, СведенияОФайле);
            
            УстановитьПривилегированныйРежим(Истина);
            РаботаСФайламиВызовСервера.ОбновитьВерсиюВФайле(Выборка.Владелец, ВерсияСсылка, СведенияОФайле.АдресВременногоХранилищаТекста);                
            
        КонецЕсли;                
        
    КонецЦикла;
4 Волшебник
 
20.08.24
09:46
(3) Лучше так:

Пока Выборка.Следующий() Цикл
    ФайлСсылкаЭП = РаботаСФайламиВызовСервера.ПолучитьФайлВизуализации(Выборка.Владелец,,);
    Если ФайлСсылкаЭП = Неопределено Тогда
        Продолжить;
    КонецЕсли;
            
    // здесь ваш код               
        
КонецЦикла;