Печать готового файла MS Word и PDF из шаблона в формате MS Word. Разбор реализации и кода

Довольно распространенная задача, но так как пока не реализованная в типовых, поэтому и пишу.

Итак, к примеру, необходимо формировать некоторый типовой текст на основе имеющегося в организации шаблона в формате 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С, но это на ваше усмотрение.

Итак

  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/ (если есть стартмани конечно)

Вам также может понравиться

About the Author: Павел Пчелинцев