Довольно распространенная задача, но так как пока не реализованная в типовых, поэтому и пишу.
Итак, к примеру, необходимо формировать некоторый типовой текст на основе имеющегося в организации шаблона в формате docx — MS Word. Обычно это договора (с контрагентами, сотрудниками), а также всевозможные приказы и т.д. Формат Word позволяет подготовить красиво оформленный документ, однако некоторые данные необходимо подставить из базы (ФИО и проч).
Данную задачу в данной статье буду реализовывать через расширение на примере печати договора с контрагентом. Конфигурация 1С:Бухгалтерия — типовая на поддержке 3.0.121.31, релиз платформы — 8.3.22.1704).
Для реализации задачи будем использовать подсистему БСП «Работа с печатью», с помощью которой можем быстро добавлять на формы списков и элементов команды Печати и формировать документы из шаблона Word.
Забегая вперед, добавлю, что при формировании документа MS Word использована серверная процедура формирования документа без создания COM-объекта. Однако, для формирования PDF документа — пришлось создавать COM-объект Word.Application, соответственно, это действие рекомендуется делать исключительно на клиенте, поэтому я задействовал клиентскую процедуру.
Сами шаблоны договоров оказания услуг — мои рабочие — можете брать и использовать или для образца (Скачать с Инфостарта https://infostart.ru/public/1753205/). Все переменные типа ФИО, должностей, ИНН и т.д. — беру из данных базы.
В общем, если нужно быстро сделать печать из шаблона MS Word — это вам подойдет как пример. Можно использовать и как готовый вариант текста договора оказания услуг по 1С, но это на ваше усмотрение.
Итак
- Создаем новое расширение, снимаем галку безопасный режим
2. Создаем файл-шаблон MS Word. Формат файла MS Word должен соответствовать формату БСП.
- Файл должен состоять из набора именованных областей. Каждая область начинается тэгом {v8 Область.ИмяОбласти1} {/v8 Область.ИмяОбласти1}.
- Внутри области могут использоваться параметры, в которые мы впоследствии передадим нужные нам значения (типа ФИО). Параметры маркируются как {v8 Параметр1}.
- Можно создавать даже таблицы для вывода табличных частей (например спецификация по договору), но в данном примере мы это не используем. Вот подробная статья про формат шаблона infostart.ru/1c/articles/1052233/.
- Даже проще понять на примере, см скрины ниже
3. Далее Переходим к нужному объекту метаданных, в нашем случае — к справочнику Договоры. Далее макеты, добавить-двоичные данные-выбираем нужный файл Ворд
4. Добавим команды печати в справочник «Договоры контрагентов». Для этого в модуле менеджера объекта (справочника Договоры) находим процедуру «ДобавитьКомандыПечати» и добавляем ее в наше расширение с директивой &После. И добавляем команды
&После("ДобавитьКомандыПечати")
Процедура пп_ДобавитьКомандыПечати(КомандыПечати)
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ДоговорОказанияУслуг";
КомандаПечати.Представление = "Договор оказания услуг (PDF)";
КомандаПечати.Обработчик = "пп_ПечатьКлиент.ПечатьДоговораОказанияУслуг";
КомандаПечати.Картинка = БиблиотекаКартинок.ФорматPDF;
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ДоговорОказанияУслугWord";
КомандаПечати.Представление = "Договор оказания услуг (Word)";
КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord;
КонецПроцедуры
Обратите внимание, что для выполнения команды печати PDF используется обработчик с процедурой пп_ПечатьКлиент.ПечатьДоговораОказанияУслуг. Модуль пп_ПечатьКлиент — сделаем клиентский, для работы с Com-объектом на клиенте (так рекомендуется стандартами 1С). Почему так — распишу поподробнее ниже.
Далее в модуле менеджера добавляем предопределенную процедуру «Печать». Если таковая уже есть в основной конфигурации — тогда размещаем ее с другим именем и директивой &После(«Печать»). В нашем примере этого не нужно. Если не указана другая процедура-обработчик — по умолчанию вызывается именно серверная процедура «Печать». Задействуем ее для формирования документа в Word.
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ИмяМакета = "ДоговорОказанияУслуг";
ИмяМакетаWord = "ДоговорОказанияУслугWord";
НаименованиеДокумента = "Договор оказания услуг";
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, ИмяМакетаWord) Тогда
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, ИмяМакетаWord);
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ОфисныеДокументы = СформироватьДокументыWord(МассивОбъектов, ИмяМакета, НаименованиеДокумента);
ПечатнаяФорма.СинонимМакета = НаименованиеДокумента;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Тут используется типовая технология формирования офисных документов. Основная функция тут СформироватьДокументWord(Ссылка, ИмяМакета), которая использует несколько функций БСП.
- УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(МакетДоговора, Неопределено) — инициализация структуры с нужными параметрами
- УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, «Основная», «Общая») — формирует структуру с описанием, необходимым далее при формировании макета
- УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Неопределено, Макет) — инициализирует макет
- УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей[«Основная»]) — формирование макета с параметрами
- УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ПолучитьДанныеДоговора(Ссылка)) — окончательно формирует макет документа с переданными параметрами
- Адрес = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма) — кладет готовый макет в Хранилище значений и отдает ссылку с адресом
Функция СформироватьДокументыWord(МассивОбъектов, ИмяМакета, НаименованиеДокумента)
Шаблон = НаименованиеДокумента + " %1 от %2";
ОфисныеДокументы = Новый Соответствие;
Для каждого Ссылка Из МассивОбъектов Цикл
Адрес = СформироватьДокументWord(Ссылка, ИмяМакета);
ИмяДокумента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, Ссылка.Номер, Формат(Ссылка.Дата,"ДФ=dd.MM.yyyy"));
ОфисныеДокументы.Вставить(Адрес, ИмяДокумента);
КонецЦикла;
Возврат ОфисныеДокументы;
КонецФункции
Функция СформироватьДокументWord(Ссылка, ИмяМакета)
УстановитьПривилегированныйРежим(Истина);
МакетДоговора = УправлениеПечатью.МакетПечатнойФормы("Справочник.ДоговорыКонтрагентов." + ИмяМакета);
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(МакетДоговора, Неопределено);
ОписаниеОбластей = Новый Структура;
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Основная", "Общая");
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Неопределено, Макет);
Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["Основная"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ПолучитьДанныеДоговора(Ссылка));
Адрес = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
УстановитьПривилегированныйРежим(Ложь);
Возврат Адрес;
КонецФункции
ПолучитьДанныеДоговора(Ссылка) — структура со значениями переменных, самая рутинная, но самая смысловая в части данных. Только ее вам и нужно написать свою для своего объекта
Функция ПолучитьДанныеДоговора(ДоговорСсылка)
УстановитьПривилегированныйРежим(Истина);
Текст = "ВЫБРАТЬ
| ДоговорыКонтрагентов.Ссылка КАК Договор,
| ДоговорыКонтрагентов.Номер КАК НомерДоговора,
| ДоговорыКонтрагентов.Дата КАК ДатаДоговора,
| ДоговорыКонтрагентов.СрокДействия КАК ДатаОкончанияДействия,
| ДоговорыКонтрагентов.Владелец КАК Контрагент,
| ДоговорыКонтрагентов.Владелец.НаименованиеПолное КАК КонтрагентПолноеНаименование,
| ДоговорыКонтрагентов.Организация КАК Организация,
| ДоговорыКонтрагентов.Организация.НаименованиеПолное КАК ОрганизацияПолноеНаименование,
| ДоговорыКонтрагентов.Организация.ИНН КАК ОрганизацияИНН,
| ДоговорыКонтрагентов.Организация.КПП КАК ОрганизацияКПП,
| ДЕНЬ(ДоговорыКонтрагентов.Дата) КАК ДатаЧисло,
| МЕСЯЦ(ДоговорыКонтрагентов.Дата) КАК ДатаМесяц,
| ГОД(ДоговорыКонтрагентов.Дата) КАК ДатаГод,
| ДоговорыКонтрагентов.Организация.ОсновнойБанковскийСчет КАК БанковскийСчет,
| ДоговорыКонтрагентов.Владелец.ОсновнойБанковскийСчет КАК БанковскийСчетКонтрагента
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.Ссылка = &ДоговорСсылка";
Запрос = Новый Запрос(Текст);
Запрос.УстановитьПараметр("ДоговорСсылка", ДоговорСсылка);
РезЗапроса = Запрос.Выполнить();
Если РезЗапроса.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
ДанныеЗапроса = РезЗапроса.Выгрузить()[0];
ДанныеШапки = Новый Структура("СтавкаСДополнением, НомерДоговора, КонтрагентПолноеНаименование");
ЗаполнитьЗначенияСвойств(ДанныеШапки, ДанныеЗапроса);
ДанныеШапки.Вставить("ДатаДоговора", Формат(ДанныеЗапроса.ДатаДоговора, "ДФ='d MMMM yyyy ''г.'''"));
ДанныеШапки.Вставить("ДоговорПредставление", ДанныеЗапроса.НомерДоговора + " от "
+ Формат(ДанныеЗапроса.ДатаДоговора, "ДФ=dd.MM.yyyy"));
КонтрагентПодписант = ДанныеЗапроса.Контрагент.ОсновноеКонтактноеЛицо;
КонтрагентПодписантФИО = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 %2 %3",
КонтрагентПодписант.Фамилия, КонтрагентПодписант.Имя, КонтрагентПодписант.Отчество);
ПодписантДолжность = ДанныеЗапроса.Контрагент.ОсновноеКонтактноеЛицо.Должность;
СтавкаВЧас = УправлениеСвойствами.ЗначениеСвойства(ДоговорСсылка, "ДоговорСтавкаВЧас");
Если СтавкаВЧас <> Неопределено Тогда
ДанныеШапки.Вставить("СтавкаСДополнением", РаботаСКурсамиВалют.СформироватьСуммуПрописью(СтавкаВЧас,
Константы.ВалютаРегламентированногоУчета.Получить(), Истина) +"(НДС не облагается)");
КонецЕсли;
КонтрагентПодписант_Инициалы = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 %2.%3.",
КонтрагентПодписант.Фамилия, Сред(КонтрагентПодписант.Имя, 1, 1), Сред(КонтрагентПодписант.Отчество, 1, 1));
ДанныеШапки.Вставить("КонтрагентПодписант_Инициалы", КонтрагентПодписант_Инициалы);
ДанныеШапки.Вставить("КонтрагентПодписантРП", СклонениеПредставленийОбъектов.ПросклонятьФИО(КонтрагентПодписантФИО, 2,,1));
ДанныеШапки.Вставить("КонтрагентПодписантДолжностьРП", СклонениеПредставленийОбъектов.ПросклонятьПредставление(Строка(ПодписантДолжность), 2, КонтрагентПодписант));
ДанныеШапки.Вставить("КонтрагентПодписантДолжность", ПодписантДолжность);
ДанныеШапки.Вставить("КонтрагентНаОсновании", "Устава");
ОтветственныеЛица = ОтветственныеЛицаБППереопределяемый.ОтветственныеЛица(ДанныеЗапроса.Организация,ТекущаяДатаСеанса(),);
ДанныеОрганизации = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(
ДанныеЗапроса.Организация, ДанныеЗапроса.ДатаДоговора,ДанныеЗапроса.БанковскийСчет,,);
ПредставлениеОрганизации = ОбщегоНазначенияБПВызовСервера.ОписаниеОрганизации(ДанныеОрганизации,
"НаименованиеДляПечатныхФорм,ИНН,ЮридическийАдрес,Телефоны,НомерСчета,Банк,БИК,КоррСчет");
ОрганизацияДоп = РегламентированнаяОтчетностьВызовСервера.ПолучитьСведенияОбОрганизации(
ДанныеЗапроса.Организация, ТекущаяДатаСеанса(), "ОргСубъект");
СведенияОКонтрагенте = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(
ДанныеЗапроса.Контрагент,ДанныеЗапроса.ДатаДоговора,,,);
ПредставлениеКонтрагента= ОбщегоНазначенияБПВызовСервера.ОписаниеОрганизации(СведенияОКонтрагенте,
"НаименованиеДляПечатныхФорм,ИНН,ЮридическийАдрес,Телефоны,НомерСчета,Банк,БИК,КоррСчет");
РуководительДолжностьПредставление = ОтветственныеЛица.РуководительДолжностьПредставление;
ОрганизацияПодписантДолжностьРП = СклонениеПредставленийОбъектов.ПросклонятьПредставление(
РуководительДолжностьПредставление, 2,);
ОрганизацияПодписант = ОтветственныеЛица.Руководитель;
ОрганизацияПодписантРП = СклонениеПредставленийОбъектов.ПросклонятьФИО(ОрганизацияПодписант.ФИО,
2, ОрганизацияПодписант, 1);
ДанныеШапки.Вставить("ОрганизацияПодписантРП", ОрганизацияПодписантРП);
ДанныеШапки.Вставить("ОрганизацияПодписантДолжностьРП", ОрганизацияПодписантДолжностьРП);
ШаблонВЛицеНаОсновании = "%1%2%3, действующ%4 на основании %5, именуем%6";
ШаблонОГРН = "свидетельства о регистрации ОГРНИП №";
Если Справочники.Организации.КодыСтатистики(ДанныеЗапроса.Организация).КодОКОПФ = "50102" Тогда
ОрганизацияВЛицеНаОсновании = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонВЛицеНаОсновании,
"","","","ий",
ШаблонОГРН + ДанныеОрганизации.ОГРН,
"ый");
ЕстьКПП = Ложь;
Иначе
ОрганизацияВЛицеНаОсновании = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонВЛицеНаОсновании,
" в лице ", ОрганизацияПодписантДолжностьРП + " ", ОрганизацияПодписантРП,"его",
"Устава",
"ое");
ЕстьКПП = Истина;
КонецЕсли;
ДанныеШапки.Вставить("ОрганизацияВЛицеНаОсновании", ОрганизацияВЛицеНаОсновании);
Если СведенияОКонтрагенте.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо Тогда
КонтрагентВЛицеНаОсновании = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонВЛицеНаОсновании,
"", "", "", "ий",
ШаблонОГРН + СведенияОКонтрагенте.ОГРН,
"ый");
ЕстьКППКонтрагента = Ложь;
Иначе
КонтрагентВЛицеНаОсновании = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонВЛицеНаОсновании,
" в лице ", ДанныеШапки.КонтрагентПодписантДолжностьРП + " ", ДанныеШапки.КонтрагентПодписантРП, "его",
"Устава",
"ое");
ЕстьКППКонтрагента = Истина;
КонецЕсли;
ДанныеШапки.Вставить("КонтрагентВЛицеНаОсновании", КонтрагентВЛицеНаОсновании);
ИНН_КПП_Строкой = "ИНН" + "%1" + " " + ДанныеОрганизации.ИНН + "%2";
ИНН_КПП_Строкой = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИНН_КПП_Строкой,
?(ЕстьКПП, "/КПП", ""), ?(ЕстьКПП, "/" + ДанныеОрганизации.КПП, ""));
ДанныеШапки.Вставить("Город", ОрганизацияДоп.ОргСубъект);
ДанныеШапки.Вставить("ОрганизацияПодписантДолжность", РуководительДолжностьПредставление);
ДанныеШапки.Вставить("ОрганизацияПодписантДолжностьРП", СклонениеПредставленийОбъектов.ПросклонятьПредставление(РуководительДолжностьПредставление, 2, ОрганизацияПодписант));
ДанныеШапки.Вставить("ОрганизацияПодписант_Инициалы", ОтветственныеЛица.РуководительПредставление);
ДанныеШапки.Вставить("ОрганизацияПолноеНаименование", ДанныеОрганизации.ПолноеНаименование);
ДатаОкончанияДействия = ?(ЗначениеЗаполнено(ДанныеЗапроса.ДатаОкончанияДействия), ДанныеЗапроса.ДатаОкончанияДействия,
КонецГода(ТекущаяДатаСеанса()));
СрокОкончанияДоговора = Формат(ДатаОкончанияДействия, "ДФ='d MMMM yyyy ''г.'''");
ДанныеШапки.Вставить("СрокОкончанияДоговора", СрокОкончанияДоговора);
РеквизитыСтрокой = "%1: %2
|%3
|ОГРН %4
|Банковские реквизиты:
|р/с %5
|В банке %6
|БИК %7
|e-mail: %8";
ДанныеБанкСчета = Справочники.БанковскиеСчета.РеквизитыСчета(ДанныеЗапроса.БанковскийСчет);
ОрганизацияРеквизитыСтрокой = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(РеквизитыСтрокой,
ДанныеОрганизации.НаименованиеДляПечатныхФорм,
ДанныеОрганизации.ЮридическийАдрес,
ИНН_КПП_Строкой,
ДанныеОрганизации.ОГРН,
ДанныеБанкСчета.НомерСчета,
ДанныеБанкСчета.НаименованиеБанка,
ДанныеБанкСчета.БИКБанка,
ДанныеОрганизации.Email);
АдрЮР = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ДанныеЗапроса.Контрагент,
Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента, ТекущаяДатаСеанса(), Истина);
ДанныеБанкСчетаКонтрагента = Справочники.БанковскиеСчета.РеквизитыСчета(ДанныеЗапроса.БанковскийСчетКонтрагента);
EmailКонтрагента = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ДанныеЗапроса.Контрагент,
Справочники.ВидыКонтактнойИнформации.EmailКонтрагенты, ТекущаяДатаСеанса(), Истина);
Если ДанныеБанкСчетаКонтрагента = Неопределено Тогда
ДанныеБанкСчетаКонтрагента = Новый Структура("НомерСчета, НаименованиеБанка, БИКБанка");
КонецЕсли;
ИНН_КПП_Строкой = "ИНН" + "%1" + " " + СведенияОКонтрагенте.ИНН + "%2";
ИНН_КПП_Строкой = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИНН_КПП_Строкой,
?(ЕстьКППКонтрагента, "/КПП", ""), ?(ЕстьКППКонтрагента, "/" + СведенияОКонтрагенте.КПП, ""));
КонтрагентРеквизитыСтрокой = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(РеквизитыСтрокой,
СведенияОКонтрагенте.НаименованиеДляПечатныхФорм,
АдрЮР,
ИНН_КПП_Строкой,
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДанныеЗапроса.Контрагент, "РегистрационныйНомер"),
ДанныеБанкСчетаКонтрагента.НомерСчета,
ДанныеБанкСчетаКонтрагента.НаименованиеБанка,
ДанныеБанкСчетаКонтрагента.БИКБанка,
EmailКонтрагента);
ДанныеШапки.Вставить("ОрганизацияРеквизитыСтрокой", ОрганизацияРеквизитыСтрокой);
ДанныеШапки.Вставить("КонтрагентРеквизитыСтрокой", КонтрагентРеквизитыСтрокой);
ДанныеШапки.Вставить("ОрганизацияРеквизитыСтрокойВАкте", ПредставлениеОрганизации);
ДанныеШапки.Вставить("КонтрагентРеквизитыСтрокойВАкте", ПредставлениеКонтрагента);
УстановитьПривилегированныйРежим(Ложь);
Возврат ДанныеШапки;
КонецФункции
С серверной частью все. Переходим к клиентской. Во первых почему нужен клиентский вызов. Потому что MS Word умеет сохранять документы в PDF, вот такой процедурой: WordDocument.SaveAs(FilePDF, 17). Причем умеет только из приложения, то есть нужно создавать COM-объект Word.Application. А вот COM-объект на сервере — это не только регистрация ком-объекта, но и проблемы с зависанием сессий и затем полная остановка данной функции. Поэтому 1С и сообщество не рекомендует, нужно делать на клиенте.
В клиентском модуле добавляем две процедуры. Собственно наш обработчик ПечатьДоговораОказанияУслуг и собственно процедуру открытия СформироватьWordИОткрытьPDF.
Функция ПечатьДоговораОказанияУслуг(Парам) Экспорт
МассивОбъектов = Парам.ОбъектыПечати;
ИмяМакета = Парам.Идентификатор;
МакетИДанныеОбъекта = УправлениеПечатьюВызовСервера.МакетыИДанныеОбъектовДляПечати(Парам.МенеджерПечати, ИмяМакета, МассивОбъектов);
СформироватьWordИОткрытьPDF(МассивОбъектов, МакетИДанныеОбъекта, ИмяМакета);
Возврат Истина;
КонецФункции
Процедура СформироватьWordИОткрытьPDF(МассивОбъектов, МакетИДанныеОбъекта, ИмяМакета)
ТипМакета = МакетИДанныеОбъекта.Макеты.ТипыМакетов[ИмяМакета];
ДвоичныеДанныеМакетов = МакетИДанныеОбъекта.Макеты.ДвоичныеДанныеМакетов;
Области = МакетИДанныеОбъекта.Макеты.ОписаниеОбластей;
Макет = УправлениеПечатьюКлиент.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакетов[ИмяМакета], ТипМакета, ИмяМакета);
Если Макет = Неопределено Тогда
Возврат;
КонецЕсли;
ЗакрытьОкноПечатнойФормы = Ложь;
Попытка
ПечатнаяФорма = УправлениеПечатьюКлиент.ИнициализироватьПечатнуюФорму(ТипМакета, Макет.НастройкиСтраницыМакета, Макет);
Если ПечатнаяФорма = Неопределено Тогда
УправлениеПечатьюКлиент.ОчиститьСсылки(Макет);
Возврат;
КонецЕсли;
Для каждого ДокументСсылка Из МассивОбъектов Цикл
ДанныеОбъекта = МакетИДанныеОбъекта.Данные[ДокументСсылка][ИмяМакета];
Область = УправлениеПечатьюКлиент.ОбластьМакета(Макет, Области[ИмяМакета]["Основная"]);
УправлениеПечатьюКлиент.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь);
КонецЦикла;
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ЗакрытьОкноПечатнойФормы = Истина;
Возврат;
КонецПопытки;
FilePDF = ПолучитьИмяВременногоФайла("pdf");
FileDOC = ПолучитьИмяВременногоФайла("docx");
MSWordApp = ПечатнаяФорма.COMСоединение;
MSWordApp.Application.Selection.Collapse();
// Восстановить вид просмотра документа.
Если ПечатнаяФорма.Свойство("ViewType") Тогда
MSWordApp.Application.ActiveWindow.View.Type = ПечатнаяФорма.ViewType;
КонецЕсли;
MSWordApp.Application.Visible = Истина;
MSWordApp.Activate();
WordDocument = MSWordApp.Application.Documents(1);
WordDocument.SaveAs(FilePDF, 17);
WordDocument.Close(0);
MSWordApp.Application.Quit();
УдалитьФайлы(FileDOC);
УправлениеПечатьюКлиент.ОчиститьСсылки(ПечатнаяФорма, ЗакрытьОкноПечатнойФормы);
УправлениеПечатьюКлиент.ОчиститьСсылки(Макет);
ОписаниеОповещения = Новый ОписаниеОповещения();
НачатьЗапускПриложения(ОписаниеОповещения, FilePDF,);
КонецПроцедуры
Ну и вуаля — все готово.
Вообще весь код в статье, он мой рабочий, шаблон ворда — изготовите сами на 5 мин, ну а если нужно готовое — качайте готовое с Инфостарта https://infostart.ru/public/1753205/ (если есть стартмани конечно)