В качестве примера рассматривается печать в Word из заказа клиента.
Шаблон в формате *.doc хранится как двоичные данные в макете, при этом внутри шаблона необходимые для заполнения поля указывается в знак решетки: #Организация#, #Контрагент# и т.п. Это сделано и в основном теле документа, и в колонтитулах.
В сведениях о внешней обработке указывается, что это "ВызовКлиентскогоМетода":
строкаКоманды = тзКоманд.Добавить();
строкаКоманды.Идентификатор = Идентификатор;
строкаКоманды.Представление = Наименование;
строкаКоманды.ПоказыватьОповещение = Истина;
строкаКоманды.Использование = "ВызовКлиентскогоМетода";
строкаКоманды.ПоказыватьОповещение = "Истина";
Далее, непосредственно в модуле формы в процедуре Печать получаем макет (на клиенте), и обращаемся к нему:
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
Для Каждого ОбъектНазначения Из ОбъектыНазначения Цикл
MSWord = ПолучитьИзВременногоХранилища(МакетСервер("ЗаказКлиентаМакет"));
ИмяВрем = ПолучитьИмяВременногоФайла(".doc");
MSWord.Записать(ИмяВрем);
// выводим данные
Попытка
//получаем объект - документ. Это OLE объект, с ним можно работать используя все методы, которые существуют в VBA
//Документ = ПолучитьCOMОбъект(ИмяВрем);
COMОбъект = Новый COMОбъект("Word.Application");
//COMОбъект.Documents.Add();
COMОбъект.WordBasic.DisableAutoMacros(1);
COMОбъект.Documents.Open(ИмяВрем);
Документ = COMОбъект.ActiveDocument;
......
Все заполнение документа происходит на клиенте (предварительно необходимо получить нужные данные).
Ну и отдельно, заполнение колонтитулов:
&НаКлиенте
Процедура ВыполнитьЗаменуКолонтитула(СтруктураДанных, Документ, ЭтоВерхнийКолонититул = Ложь)
Для Каждого КлючЗначение Из СтруктураДанных Цикл
ТекстЧтоЗаменять = "#" + КлючЗначение.Ключ + "#";
ТекстНаЧтоЗаменять = КлючЗначение.Значение;
Если ЭтоВерхнийКолонититул ТОгда
Документ.Sections(1).Headers(1).Range.Find.Execute(ТекстЧтоЗаменять, Ложь, Истина, Ложь, , , Истина, , Ложь, ТекстНаЧтоЗаменять, 2);
Иначе
Документ.Sections(1).Footers(1).Range.Find.Execute(ТекстЧтоЗаменять, Ложь, Истина, Ложь, , , Истина, , Ложь, ТекстНаЧтоЗаменять, 2);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
и вставка подложки:
&НаКлиенте
Процедура ВставитьРисунокКакПодложку(COMОбъект,АдресВхранилищеРисунок, Расширение)
ИмяФайла = ПолучитьИмяВременногоФайла(Расширение);
ПолучитьФайл(АдресВхранилищеРисунок, ИмяФайла, Ложь);
Документ = COMОбъект.ActiveDocument;
Рис = Документ.Sections(1).Headers(1).Shapes.AddPicture(ИмяФайла,Ложь,Истина);
Рис.PictureFormat.Brightness = 0.85; //уменьшаем яркость и контрастность
Рис.PictureFormat.Contrast = 0.25;
Рис.WrapFormat.AllowOverlap = True;
Рис.WrapFormat.Type = 3;
Рис.LockAspectRatio = True;
Рис.Left = -999995;
Рис.RelativeHorizontalPosition = 1;
Рис.RelativeVerticalPosition = 1;
Рис.Top = -999995;
Рис.Rotation = 315; //поворачиваем под углом
КонецПроцедуры
В примере выводится в качестве подложки логотип организации, под углом 45 градусов, с уменьшенной яркостью. Эта подложка будет выводиться на всех листах документа.
Тестировалось на платформе 8.3.13.1690 на УТ 11.4.7.114 и ERP 2.4.7.141