![]() |
|
ДО 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) Лучше так:
Пока Выборка.Следующий() Цикл ФайлСсылкаЭП = РаботаСФайламиВызовСервера.ПолучитьФайлВизуализации(Выборка.Владелец,,); Если ФайлСсылкаЭП = Неопределено Тогда Продолжить; КонецЕсли; // здесь ваш код КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |