Обработчик после регистрации нужного вида документа выполняет конвертацию файлов, прикрепленных к внутреннему документу формата doc/docx, в формат PDF и добавляет эти файлы к документу.
Обработчик вешается на подписку при выполнении задачи. Обязательно наличие установленного офиса на сервере 1С, т.к. конвертация осуществляется средствами Winword.
Для корректной работы необходимо выполнить настройки на сервере 1С //infostart.ru/1c/articles/325873/
Корпорация Microsoft на сегодняшний день не рекомендует производить и не поддерживает автоматизацию программ из пакета Microsoft Office с помощью автоматических, неинтерактивных клиентских приложений или компонентов (включая ASP, DCOM и службы NT), поскольку при запуске в этом окружении программы пакета Office могут работать нестабильно или зависать. Источник https://support.microsoft.com/kb/257757
Для избежания зависания процесса winword написал скрипт, который убивает зависшие сеансы на сервере
Код скрипта приложен в архиве. Файл скрипта необходимо поместить на сервере 1С в папку C:\Windows\Tasks и добавить его запуск в планировщик заданий Windows
Совместимо с 1С:Документооборот 2.1 (версии КОРП, ПРОФ, ДГУ), платформа 1С:Предприятие 8.3.
Тестировал на версии Документооборот 8 КОРП, редакция 2.1 (2.1.28.14).
Код обработчика:
// Поиск объекта
Задача = Событие.Источник;
СоздаватьPDF = Ложь;
Если ТипЗнч(Задача.БизнесПроцесс) = Тип("БизнесПроцессСсылка.Утверждение")
И Задача.ТочкаМаршрута = БизнесПроцессы.Утверждение.ТочкиМаршрута.Утвердить
И Задача.БизнесПроцесс.РезультатУтверждения = Перечисления.РезультатыУтверждения.Утверждено Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Предметы.РольПредмета,
| Предметы.Предмет КАК Предмет
|ИЗ
| Задача.ЗадачаИсполнителя.Предметы КАК Предметы
|ГДЕ
| Предметы.Ссылка = &ЗадачаСсылка";
Запрос.УстановитьПараметр("ЗадачаСсылка", Задача);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Предмет.ПолучитьОбъект();
Если ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.ВнутренниеДокументы") Тогда
НаименованиеВидаДокумента = СокрЛП(Объект.ВидДокумента.Наименование);
СоздаватьPDF=(ВидДокумента= /// Нужный ВидДокумента);
/// СоздаватьPDF=(НаименованиеВидаДокумента = "Договор услуг");
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
////////////////////////////////////
// СОЗДАНИЕ PDF ВЕРСИЙ DOC ФАЙЛОВ //
////////////////////////////////////
Если СоздаватьPDF Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Файлы.Ссылка КАК Файл
|ИЗ
| Справочник.Файлы КАК Файлы
|ГДЕ
| Файлы.ВладелецФайла = &ВладелецФайла
| И НЕ Файлы.ПометкаУдаления";
Запрос.УстановитьПараметр("ВладелецФайла", Объект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ДанныеФайла = РаботаСФайламиВызовСервера.ДанныеФайлаДляСохранения(Выборка.Файл);
Если НЕ (ДанныеФайла.Расширение = "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));
СведенияОФайле.ИмяБезРасширения = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(
Объект.Получатели[0].Получатель.НаименованиеКороткое,"");
СведенияОФайле.Автор = ДанныеФайла.АвторТекущейВерсии;
СведенияОФайле.НоваяВерсияАвтор = ДанныеФайла.АвторТекущейВерсии;
СведенияОФайле.АдресВременногоХранилищаФайла = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(FilePDF));
НовыйФайлPDF = РаботаСФайламиВызовСервера.СоздатьФайлСВерсией(ДанныеФайла.Владелец, СведенияОФайле);
КонецЦикла;
КонецЕсли;
КонецЕсли;