Использование шаблонов Word в 1С
В работе программиста 1С, данный функционал требуется крайне редко, хотя благодаря нему можно решать довольно сложные задачи с динамическими и не постоянными печатными формами. При реализации данной задачи, работа по созданию шаблонов Word и расстановке закладок в шаблоне Word возлагается на пользователей 1C.
В данном примере будет показано, как используя механизмы 1С и документа Word в качестве шаблона, можно создать печатную форму для вывода данных, пользователям программы 1С.
Создадим шаблон на основе документа Word для 1С. Сначала необходимо включить показ закладок для более удобной работы с документом:

Использование шаблонов Word в 1С

Использование шаблонов Word в 1С
Далее необходимо в файл шаблона для 1С, добавить текст и пару закладок. Закладка добавляется через меню «Вставка» — «Закладка». Нужно выделить текст закладки, скопировать его, открыть меню «Вставка — Закладка», вставить скопированный текст закладки и нажать «Добавить»:

Установка закладки, шаблон Word для 1С
Когда файл шаблона Word готов, создаем новую внешнею обработку в 1С, добавляем форму и в модуле формы вставляем следующий код:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЗаполнитьШаблонВорд();
КонецПроцедуры
&НаКлиенте
Функция ЗаполнитьШаблонВорд()
//Попытка создать COM объект
Попытка
ОбъектВорд = Новый COMОбъект("Word.Application");
Исключение
Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат Неопределено;
КонецПопытки;
//Путь к шаблону
ОбъектВорд.Documents.Add("C:\Users\Константин\Desktop\Шаблон.docx");
ШаблонВорд = ОбъектВорд.ActiveDocument;
//Получаем все закладки из шаблона
Для каждого ЗакладкаВорд Из ШаблонВорд.Bookmarks Цикл
Сообщить(ЗакладкаВорд.Name);
КонецЦикла;
//Заменяем закладку1 на текст
ШаблонВорд.Bookmarks("Закладка1").Select();
ШаблонВорд.Application.Selection.TypeText("Текст для закладки №1.");
//Заменяем закладку2 на текст
ШаблонВорд.Bookmarks("Закладка2").Select();
ШаблонВорд.Application.Selection.TypeText("Текст для закладки №2.");
//Заменяем закладку3 на текущую дату
ШаблонВорд.Bookmarks("Закладка3").Select();
ШаблонВорд.Application.Selection.TypeText(ТекущаяДата());
ОбъектВорд.Application.Visible = Истина;
ОбъектВорд.Activate();
//Закрытие документа
//ОбъектВорд.Application.Quit();
КонецФункции
В результат запуска внешней обработки 1С по формированию печатной формы на основе шаблона в виде файла Word, мы получим следующий результат:

Результат использования шаблонов Word в 1С
Информацию по методам COM объекта Word, а так же дополнительные данные можно узнать из MSDN.
Скачать файл обработки 1С и шаблона Word.
Дополнение к заметке Использование шаблонов Word в 1С
Выражаю благодарность, всем тем, кто комментирует запись, благодаря вам, материал дополняется новыми данными и будет полезен более широкому кругу посетителей.
1. А как поменять размер шрифта во вставляемом тексте?
Достаточно изменить размер шрифта закладки, в шаблоне. А вот, если необходимо динамически менять размерность, тогда:
//Заменяем закладку3 на текущую дату
ШаблонВорд.Bookmarks("Закладка3").Select();
ШаблонВорд.Application.Selection.Font.Bold = 1;
ШаблонВорд.Application.Selection.Font.Size = 20;
ШаблонВорд.Application.Selection.TypeText(ТекущаяДата());
2. Картинки есть возможность выгружать в шаблон?
Да, конечно. Примеры для C# и VB описаны по ссылке: https://msdn.microsoft.com/ru-ru/library/ms178792.aspx, а для 1С код будет следующий:
// Вставка изображения
ШаблонВорд.Bookmarks("Закладка3").Select();
ШаблонВорд.Application.Selection.InlineShapes.AddPicture("C:\Users\Константин\Desktop\logo_1c.png");
3. При выполнении кода: ОбъектВорд.Documents.Add(«C:/Шаблон.docx») (туда я поместил Ваш документ) получаю ошибку : «Ошибка при вызове метода контекста (Add)» в чем может быть причина?
Может попробовать изменить путь на: «C:\Шаблон.docx».
4. Подскажите пожалуйста еще почему при сохранении макета типа active document в файл word кодом:
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
Макет = ОбработкаОбъект.ПолучитьМакет("ШаблонПисьмаПросрочка");
ИмяФайла = КаталогВременныхФайлов() + "\"файл.doc";
Макет.Записать(ИмяФайла);
Я получаю вместо нормального документа вот такой http://prntscr.com/eshgjk
Предполагаю, что метод Записать(< ИмяФайла>, < ТипФайлаТаблицы>) по умолчанию, записывает файл в формате MXL. Попробуйте вторым параметром установить значение: ТипФайлаТабличногоДокумента.DOCX, более подробно описано в «Синтакс-помощнике».
5. У меня в документе есть ссылки на файлы которые расположены на сетевом диске. Как в шаблоне сделать гиперссылку на эти файлы?
Интересный вопрос, если попробовать сделать запись макроса и посмотреть результат, то в Visual Basic добавление гиперссылки будет выглядеть следующим образом:
Sub Макрос1()
'
' Макрос1 Макрос
'
'
Selection.MoveLeft Unit:=wdCharacter, Count:=15, Extend:=wdExtend
ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:= _
"C:\Users\Константин\Desktop\Тест.txt", SubAddress:="", ScreenTip:="", _
TextToDisplay:="ТестоваяСсылка"
End Sub
Описание метода добавления в MSDN: https://msdn.microsoft.com/en-us/vba/word-vba/articles/hyperlinks-add-method-word
Соответственно код для 1С следующий:
Функция ЗаполнитьШаблонВорд()
//Попытка создать COM объект
Попытка
ОбъектВорд = Новый COMОбъект("Word.Application");
Исключение
Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат Неопределено;
КонецПопытки;
//Путь к шаблону
ОбъектВорд.Documents.Add("C:\Users\k.blagin\Desktop\Шаблон.docx");
ШаблонВорд = ОбъектВорд.ActiveDocument;
//Получаем все ссылки из шаблона
Для каждого ЗакладкаВорд Из ШаблонВорд.Hyperlinks Цикл
Сообщить(ЗакладкаВорд.Name);
КонецЦикла;
//Меняем адрес уже существующей ссылки
ШаблонВорд.Hyperlinks("Logs.zip").Address = "C:\Users\k.blagin\Desktop\Memory.zip";
//Заменяем закладку на ссылку
ОбъектЗакладка = ШаблонВорд.Bookmarks("Закладка3");
ШаблонВорд.Hyperlinks.Add(ОбъектЗакладка.Range, "C:\Users\k.blagin\Desktop\Шаблон.docx", "", "Шаблон.docx", "C:\Users\k.blagin\Desktop\Шаблон.docx");
ОбъектВорд.Application.Visible = Истина;
ОбъектВорд.Activate();
//Закрытие документа
//ОбъектВорд.Application.Quit();
КонецФункции