gifts2017

Печать с использованием шаблонов Word при помощи модуля из БСП

Опубликовал Антон Гладков (Gladkov_Anton) в раздел Программирование - Практика программирования

Вывод на печать документов с использованием шаблонов Word.

Задача: Вывод на печать документов с использованием шаблонов Word. Методика вывода на печать должна быть максимально близкой к методике вывода в табличный документ.

Шаблон: В качестве шаблона может использоваться любой документ Word (doc, docx, dot и т.д.)

Область: Для определения областей документа используется конструкция вида:

{v8 Область.Наименование} 
{/v8 Область.Наименование}

Вложенность областей НЕ поддерживается. Горизонтальное присоединение областей НЕ поддерживается.
Параметры: для описания параметров используется конструкция {v8 НаименованиеПараметра} 

 

Ограничения применения:

 

  1. Алгоритмы рассчитаны на использование только MSWord (без OO Writer).
  2. В работе НЕ использовался более универсальный модуль УправлениеПечатьюКлиент для того что бы можно было использовать вывод в MS-Word из старых конфигураций (построенных без использования БСП) с переносом в них минимального количества модулей БСП
  3. Во время формирования документа используется буфер обмена. Т.е. во время вывода на печать:
    1. Будет затерта информация пользователя в буфере обмена.
    2. Нельзя использовать буфер обмена.


Вывод документа:
На вход процедуры подаются:
ДвоичныеДанныеМакета - макет типа двоичные данные, содержащий файл-шаблон.
ДанныеДляПечати - структура или другой тип данных, поддерживаемый процедурой ЗаполнитьЗначенияСвойств

 

Процедура Печать_MS_Word(ДвоичныеДанныеМакета, ДанныеДляПечати) Экспорт
	Макет = УправлениеПечатьюMSWordКлиент.ПолучитьМакетMSWord(ДвоичныеДанныеМакета, ПолучитьИмяВременногоФайла("docx"));
	Документ = УправлениеПечатьюMSWordКлиент.ИнициализироватьПечатнуюФормуMSWord(Макет);
	
	ПрисоединитьОбласть_MS_Word(Макет, Документ, "Документ", ДанныеДляПечати);
	
	УправлениеПечатьюMSWordКлиент.ПоказатьДокументMSWord(Документ);
	УправлениеПечатьюMSWordКлиент.ЗакрытьСоединение(Макет, Истина);

КонецПроцедуры

Присоединение области:

Процедура ПрисоединитьОбласть_MS_Word(Макет, Документ, ИмяОбласти, ДанныеДляПечати, ВывестиСтрокуТаблицы = Ложь) Экспорт
	Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьМакетаMSWord(Макет, ИмяОбласти);
	Если Область = Неопределено тогда
		Сообщить("При выводе на печать не найдена область """ + ИмяОбласти + """");
		Возврат;
	КонецЕсли;
	
	Область_ = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(Документ, Область, , ВывестиСтрокуТаблицы); 
	Параметры = ПараметрыОбласти_MS_Word(Область_);
	ЗаполнитьЗначенияСвойств(Параметры, ДанныеДляПечати);
	УправлениеПечатьюMSWordКлиент.ЗаполнитьПараметры(Область_, Параметры);
КонецПроцедуры

В БСП заполнение параметров области может производиться только из структуры. При этом получить структуру, содержащую перечень параметров, невозможно. Для этих целей можно использовать  следующую процедуру:

Функция ПараметрыОбласти_MS_Word(Область)
	Параметры = Новый Структура;
	
	Текст = Область.Document.Content.Text;
	Пока Найти(Текст, "{v8 ") > 0 И  Найти(Текст, "}") > 0 цикл
		Начало = Найти(Текст, "{v8 ") + 4;
		Конец = Найти(Текст, "}");
		ИмяПараметра = Сред(Текст, Начало, Конец-Начало);
		Текст = СтрЗаменить(Текст, "{v8 " + ИмяПараметра + "}", "");
		
		Параметры.Вставить(ИмяПараметра, Неопределено);
	КонецЦикла;
	Возврат Параметры;
КонецФункции

Для работы процедур необходимы модули СтроковыеФункцииКлиентСервер и УправлениеПечатьюMSWordКлиентиз БСП. В случае необходимости модули могут быть скопированы в отдельное решение с удалением из них строк, связанных с регистрированием исключений в журнале ошибок.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Сергей Ожерельев (Поручик) 17.05.15 12:13
(0) Корретно использовать не модуль УправлениеПечатьюMSWordКлиент, а "полиморфные" процедуры из УправлениеПечатьюКлиент.
cool.vlad4; +1 Ответить
2. Gladkov@bprog.by (Gladkov_Anton) 17.05.15 20:08
Дело в том, что задача была поставлена использовать шаблоны в формате MS Word.
В случае использования модуля УправлениеПечатьюКлиент потребуется:
1. Написать процедуру ПараметрыОбласти_MS_Word так что бы она могла работать с OO Writer.
2. Провести существенную переработку кода БСП так что бы можно было использовать шаблоны в "старых" конфигурациях.

В результате был выбран этот вариант, как более удобный к переносу в разные конфигурации.
3. Ийон Тихий (cool.vlad4) 20.05.15 01:21
(2) Gladkov@bprog.by, зачем? там помоему как раз без проблем делается . просто указывается ТипМакета = "Doc";
дальше УправлениеПечатьюКлиент.ИнициализироватьМакет и т.п.
но есть некоторые баги
1. надо иметь ввиду что делается все через выделения. т.е. если параллельно пользователь будет открывать word и копировать данные, будет лажа
2. Вот этот кусок Пока Найти(Текст,"{v8 ")> 0 цикл в некоторых ситуациях может стать Infinite loop
3. таблицы довольно долго делаются. непонятно почему не сделали вставку таблиц через ПФ_ActiveDocument.Tables.Add . так на порядок быстрее
4. Сергей Ожерельев (Поручик) 20.05.15 08:44
(3) Чел не до конца изучил матчасть.
5. Gladkov@bprog.by (Gladkov_Anton) 20.05.15 10:19
(3) cool.vlad4, 1. Указал в ограничениях. 2 и 3 исправил в коде.
Спасибо за замечания.
6. Gladkov@bprog.by (Gladkov_Anton) 20.05.15 10:21
(4) Поручик, по правилам "хорошего тона" следует критиковать публикацию и предлагать улучшения, а НЕ тыкать пальчиком автора.
7. Сергей Ожерельев (Поручик) 20.05.15 10:55
(6) В первом посте я сказал, как правильно делать. Изучите демо БСП в части генерации документов Word и OpenOffice