Макеты печатных форм в руках пользователей (обычные формы)

Печать - Универсальные печатные формы

шаблон макет печатная форма

11
Как частично избавить себя от низкопрофильного труда по правке печатных форм. Для конфигураций на основе БСП, конечно, не актуально, но для нетиповых вполне. Ну и как в помощь начинающим. У меня реализовано для печати различных "согласие на обработку персональных данных","согласие на медицинские вмешательства", различных анкет. Удобно для печатных форм, которые часто по тем или иным причинам меняются. Чтоб не дергать программиста, пусть пользователи рисуют макеты самостоятельно.

Опишу, как реализовано у меня.

1. Создаем справочник примерно следующего содержания:

реквизит ХранилищеШаблон имеет тип ХранилищеЗначений, в него будем сохранять макет, созданный пользователями.

2. Форма справочника

на форме я добавил две странички и на первой разместил элемент "ТабличныйДокумент", на второй вывели реквизиты по настройке печати.

3. Модуль формы справочника:

процедура при открытии элемента справочника будет получать из хранилища значений макет табличного документа и вставлять в элемент формы, а при записи сохранять макет  в реквизит элемента справочника.


Процедура ПередЗаписью(Отказ)
	ТабДокумент=НОвый ТабличныйДокумент;
	ТабДокумент.Вывести(ЭтаФОрма.ЭлементыФормы.тхтШаблон);
	ХранилищеШаблон=НОвый ХранилищеЗначения(ТабДокумент);
	
КонецПроцедуры

Процедура ПриОткрытии()
	Попытка
	ТабДок=ХранилищеШаблон.Получить();
	Если Не ЭтоНовый() Тогда
		ЭтаФорма.ЭлементыФормы.тхтШаблон.Вывести(ТабДок);
	ИНаче
		ПолеСлева=5;
		ПолеСправа=5;
		ПолеСверху=5;
		ПолеСнизу=5;
		АвтоМасштаб=Истина;   
		Ориентация=Перечисления.ОриентацияСтраницы.Портрет;
	КонецЕсли;
	ИСключение
	сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры

Процедура ОбновлениеОтображения()
	Автомасштаб=(МасштабПечати=0);
КонецПроцедуры

4. Создаем документ

Для удобства указываем ввод на основании, у меня вводится на основании справочника "пациенты"

В табличной части документа добавим реквизит с типом справочника макета печатных форм

 

5. Модуль формы документа

По кнопке печать происходит перебор табличной части документа, для каждого элемента табличной части создается свой табличный документ, в который выводится макет с замененными параметрами. Заменяемые параметры в макете имеют вид [ИмяПараметра].


Процедура ОсновныеДействияФормыПечать(Кнопка)
	ДЛя каждого Стр Из СпискиФорм Цикл  						//Переберем ТЧ документа
		ТабДокумент=Новый ТабличныйДОкумент;
		Макет=Стр.СсылкаНаМакет.ХранилищеШаблон.Получить();   	//получим макет каждой строки
		ПреобразоватьПараметры(Макет);							//заменим параметры реальными данными	
		ТабДокумент.Вывести(Макет);
		ПрименитьНастройкиПечати(Стр.СсылкаНаМакет,ТабДокумент);//настройка печати
		ТабДокумент.Показать();
	КонецЦикла;
КонецПроцедуры
Процедура ПрименитьНастройкиПечати(СсылкаСпр,ТабДокумент)
		ТаБДокумент.МасштабПечати=СсылкаСпр.МасштабПечати;
		ТаБДокумент.АвтоМасштаб=СсылкаСпр.АвтоМасштаб;
		ТаБДокумент.ПолеСверху=СсылкаСпр.ПолеСверху;
		ТаБДокумент.ПолеСлева=СсылкаСпр.ПолеСлева;
		ТаБДокумент.ПолеСнизу=СсылкаСпр.ПолеСнизу;
		ТаБДокумент.ПолеСправа=СсылкаСпр.ПолеСправа;
		ТаБДокумент.ОриентацияСтраницы=?(СсылкаСпр.Ориентация=Перечисления.ОриентацияСтраницы.Ландшавт,ОриентацияСтраницы.Ландшафт,ОриентацияСтраницы.Портрет);
КонецПроцедуры

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

6. Как это выглядит у пользователя:

 

11

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. Stim213 346 07.11.18 09:56 Сейчас в теме
Зачем так мучать пользователя в табличном документе? Научите его создавать поля в Ворде и заполняйте ворд при печати
2. fromlion 28 07.11.18 10:11 Сейчас в теме
(1) если брать нашу ситуацию, то работаем в терминальном режиме и ставить офисы на сервер нельзя. Как минимум будут затраты на приобретение лицензий.
jONES1979; +1 Ответить
3. jONES1979 09.11.18 08:51 Сейчас в теме
Вот спасибо, всё расписано! Мне скоро пригодится!
Оставьте свое сообщение