1С: Еще раз о создании файла DOCX по шаблону без Word на сервере

Подобная статья уже была где-то на сайте, но вот еще одна, но решил актуализировать.

Итак, задача: при нажатии кнопки «В Word», сформировать на сервере файл по шаблону, сохранить его на клиент и открыть любым зарегистрированным приложением. Работать должно кроссплатформенно Linux/Windows

Создадим docx файл вида:

Решение:

{v8 Область.Тушка}

какойто текст, текст, текст. Бла-бла-бла..

{v8 АрбитражныйСудНаименование}

{/v8 Область.Тушка}

Загрузим его в макет как бинарные данные.

Далее код кнопки:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)	
	ПоказатьОповещениеПользователя("Формирую документ", "", "Формируем документ. Это может занять некоторое время", БиблиотекаКартинок.БизнесПроцесс);	
	Для Каждого ДокументСсылка Из ПараметрКоманды Цикл
		БинарныеДанные = СформироватьДокументНаСервере(ДокументСсылка);
		врмф = ПолучитьИмяВременногоФайла(".docx");
		БинарныеДанные.Записать(врмф);
		
		Оповещение = Новый ОписаниеОповещения("ЗапускПриложения", ЭтотОбъект);
		НачатьЗапускПриложения(Оповещение, врмф, , Ложь);
	 	ПоказатьОповещениеПользователя("Документ сформирован", "", "Дождитесь открытия приложения для работы с документом", БиблиотекаКартинок.БизнесПроцесс);
	КонецЦикла;		
КонецПроцедуры

&НаКлиенте
Процедура ЗапускПриложения(КодВозврата, ДополнительныйПараметр) Экспорт

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



&НаСервере
Функция СформироватьДокументНаСервере(ДокументСсылка);
	Возврат Документы.СК_КалькуляторИндексации.СгенерироватьДокумент(ДокументСсылка,"ЗаявлениеОбИндексации");
КонецФункции

Код формирования файла на сервере:

Процедура ДобавитьОписаниеОбласти(НаборОбластей, знач ИмяОбласти, знач ТипОбласти) Экспорт
	НоваяОбласть = Новый Структура;	
	НоваяОбласть.Вставить("ИмяОбласти", ИмяОбласти);
	НоваяОбласть.Вставить("ТипОбласти", ТипОбласти);	
	НаборОбластей.Вставить(ИмяОбласти, НоваяОбласть);	
КонецПроцедуры

Функция ПолучениеОписанияОбластей() Экспорт
	ОписаниеОбластей = Новый Структура;	
	ДобавитьОписаниеОбласти(ОписаниеОбластей, "Тушка", "Общая");
	ДобавитьОписаниеОбласти(ОписаниеОбластей, "Подвал", "Общая");
	ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийКолонтитул", "ВерхнийКолонтитул");
	ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийКолонтитул", "НижнийКолонтитул");
	ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийТитульныйКолонтитул", "НижнийТитульныйКолонтитул");		
	Возврат ОписаниеОбластей;		
КонецФункции		


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

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

	ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(ТипМакета, Макет.НастройкиСтраницыМакета,Макет);
	АдресХранилищаПечатнойФормы = "";
		
	Если ПечатнаяФорма = Неопределено Тогда
		УправлениеПечатью.ОчиститьСсылки(Макет);
		Возврат "";
	КонецЕсли;	
	
	Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Тушка"]);
	УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта);
		
	АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
			
	УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма, ЗакрытьОкноПечатнойФормы);
	УправлениеПечатью.ОчиститьСсылки(Макет);
	
	докбин = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресХранилищаПечатнойФормы));
	док = докбин.Получить();
	Возврат док;

		
КонецФункции	

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.