Опишу, как реализовано у меня.
1. Создаем справочник примерно следующего содержания:
реквизит ХранилищеШаблон имеет тип ХранилищеЗначений, в него будем сохранять макет, созданный пользователями.
2. Форма справочника
на форме я добавил две странички и на первой разместил элемент "ТабличныйДокумент", на второй вывели реквизиты по настройке печати.
3. Модуль формы справочника:
процедура при открытии элемента справочника будет получать из хранилища значений макет табличного документа и вставлять в элемент формы, а при записи сохранять макет в реквизит элемента справочника.
Процедура ПередЗаписью(Отказ)
ТабДокумент=НОвый ТабличныйДокумент;
ТабДокумент.Вывести(ЭтаФОрма.ЭлементыФормы.тхтШаблон);
ХранилищеШаблон=НОвый ХранилищеЗначения(ТабДокумент);
КонецПроцедуры
Процедура ПриОткрытии()
Попытка
ТабДок=ХранилищеШаблон.Получить();
Если Не ЭтоНовый() Тогда
ЭтаФорма.ЭлементыФормы.тхтШаблон.Вывести(ТабДок);
ИНаче
ПолеСлева=5;
ПолеСправа=5;
ПолеСверху=5;
ПолеСнизу=5;
АвтоМасштаб=Истина;
Ориентация=Перечисления.ОриентацияСтраницы.Портрет;
КонецЕсли;
ИСключение
сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Процедура ОбновлениеОтображения()
Автомасштаб=(МасштабПечати=0);
КонецПроцедуры
4. Создаем документ
Для удобства указываем ввод на основании, у меня вводится на основании справочника "пациенты"
В табличной части документа добавим реквизит с типом справочника макета печатных форм
5. Модуль формы документа
По кнопке печать происходит перебор табличной части документа, для каждого элемента табличной части создается свой табличный документ, в который выводится макет с замененными параметрами. Заменяемые параметры в макете имеют вид [ИмяПараметра].
Процедура ОсновныеДействияФормыПечать(Кнопка)
ДЛя каждого Стр Из СпискиФорм Цикл //Переберем ТЧ документа
ТабДокумент=Новый ТабличныйДОкумент;
Макет=Стр.СсылкаНаМакет.ХранилищеШаблон.Получить(); //получим макет каждой строки
ПреобразоватьПараметры(Макет); //заменим параметры реальными данными
ТабДокумент.Вывести(Макет);
ПрименитьНастройкиПечати(Стр.СсылкаНаМакет,ТабДокумент);//настройка печати
ТабДокумент.Показать();
КонецЦикла;
КонецПроцедуры
Процедура ПрименитьНастройкиПечати(СсылкаСпр,ТабДокумент)
ТаБДокумент.МасштабПечати=СсылкаСпр.МасштабПечати;
ТаБДокумент.АвтоМасштаб=СсылкаСпр.АвтоМасштаб;
ТаБДокумент.ПолеСверху=СсылкаСпр.ПолеСверху;
ТаБДокумент.ПолеСлева=СсылкаСпр.ПолеСлева;
ТаБДокумент.ПолеСнизу=СсылкаСпр.ПолеСнизу;
ТаБДокумент.ПолеСправа=СсылкаСпр.ПолеСправа;
ТаБДокумент.ОриентацияСтраницы=?(СсылкаСпр.Ориентация=Перечисления.ОриентацияСтраницы.Ландшавт,ОриентацияСтраницы.Ландшафт,ОриентацияСтраницы.Портрет);
КонецПроцедуры
Процедура ПреобразоватьПараметры(Макет)
Соответствия=ПодготовимСоответствие(); //Заполним соответствие с параметрами замены
ДЛя каждого СтрСоот Из Соответствия ЦИкл
ЯчейкаТекст=Макет.НАйтиТекст(СтрСоот.Ключ);
Если ЯчейкаТекст<>Неопределено ТОгда
ЯчейкаТекст.Текст=СтрЗАменить(ЯчейкаТекст.Текст,СтрСоот.Ключ,СтрСоот.Значение);
КонецЕсли;
КонецЦИкла;
КонецПроцедуры
Функция ПодготовимСоответствие()
Соответствие=НОвый Соответствие();
Соответствие.Вставить("[ФИОПолностью]",""+Пациент.Фамилия+" "+Пациент.Имя+" "+Пациент.Отчество);
Соответствие.Вставить("[ДатаРождения]",ФОРмат(ПАциент.ДатаРождения,"ДФ=dd.MM.yyyy"));
СтруктураПаспорта=ПолучимПАспорт();
Соответствие.Вставить("[ПаспортНомер]",СтруктураПаспорта.НомерПаспорт);
Соответствие.Вставить("[ПаспортСерия]",СтруктураПаспорта.СерияПаспорт);
Соответствие.Вставить("[ПаспортКемВыдан]",СтруктураПаспорта.КемВыданПаспорт);
Соответствие.Вставить("[ПаспортДатаВыдачи]",СтруктураПаспорта.ДатаВыдачиПаспорт);
Соответствие.Вставить("[ПаспортПредставление]",СтруктураПаспорта.ПредставлениеПаспорт);
Соответствие.Вставить("[Адрес]",киПолучитьПредставлениеКИ(Пациент,Справочники.ВидыКонтактнойИнформации.АдресФактический,ложь) );
ФИОКратко=СтрЗаменить(Соответствие.Получить("[ФИОПолностью]")," ",Символы.ПС);
Если СтрЧислоСтрок(ФИОКратко)>2 ТОгда
ФиоКратко=СтрПолучитьСтроку(ФИоКРатко,1)+" "+ЛЕв(СтрПолучитьСтроку(ФИоКРатко,2),1)+"."+ЛЕв(СтрПолучитьСтроку(ФИоКРатко,3),1)+"."
КонецЕсли;
Соответствие.Вставить("[ФИОКратко]",ФИОКРатко );
ВОзврат Соответствие;
КонецФункции
ФУнкция ПолучимПАспорт()
Структура=Новый СТруктура;
Структура.Вставить("СерияПаспорт","");
Структура.Вставить("НомерПаспорт","");
Структура.Вставить("КемВыданПаспорт","");
Структура.Вставить("ДатаВыдачиПаспорт","");
Структура.Вставить("ПредставлениеПаспорт","");
ЗАпрос=НОвый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
| ПодтверждающиеДокументы.Серия,
| ПодтверждающиеДокументы.Номер,
| ПодтверждающиеДокументы.ДатаВыдачи,
| ПодтверждающиеДокументы.КемВыдан,
| ПодтверждающиеДокументы.Представление
|ИЗ
| Справочник.ПодтверждающиеДокументы КАК ПодтверждающиеДокументы
|ГДЕ
| ПодтверждающиеДокументы.Владелец = &Владелец
| И ПодтверждающиеДокументы.ВидПодтверждающегоДокумента = ЗНАЧЕНИЕ(Справочник.ВидыПОдтверждающихДокументов.Паспорт)
| И ПодтверждающиеДокументы.Текущий
| И НЕ ПодтверждающиеДокументы.ПометкаУдаления");
Запрос.УстановитьПараметр("Владелец",Пациент);
Результат=Запрос.Выполнить().Выбрать();
Пока РЕзультат.Следующий() ЦИкл
Структура.Вставить("СерияПаспорт",Результат.Серия);
Структура.Вставить("НомерПаспорт",Результат.Номер);
Структура.Вставить("КемВыданПаспорт",Результат.КемВыдан);
Структура.Вставить("ДатаВыдачиПаспорт",Формат(Результат.ДатаВыдачи,"ДФ=dd.MM.yyyy"));
Структура.Вставить("ПредставлениеПаспорт",Результат.Представление);
КонецЦИкла;
Возврат Структура;
КОнецФункции
6. Как это выглядит у пользователя: