1С: Еще раз о создании файла DOCX по шаблону без Word на сервере
Подобная статья уже была где-то на сайте, но вот еще одна, но решил актуализировать.
Итак, задача: при нажатии кнопки «В Word», сформировать на сервере файл по шаблону, сохранить его на клиент и открыть любым зарегистрированным приложением. Работать должно кроссплатформенно Linux/Windows
Создадим docx файл вида:
Решение:
{v8 Область.Тушка}
какойто текст, текст, текст. Бла-бла-бла..
{v8 АрбитражныйСудНаименование}
{/v8 Область.Тушка}
Загрузим его в макет как бинарные данные.
Далее код кнопки:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)	 	ПоказатьОповещениеПользователя("Формирую документ", "", "Формируем документ. Это может занять некоторое время", БиблиотекаКартинок.БизнесПроцесс);	 	Для Каждого ДокументСсылка Из ПараметрКоманды Цикл 		БинарныеДанные = СформироватьДокументНаСервере(ДокументСсылка); 		врмф = ПолучитьИмяВременногоФайла(".docx"); 		БинарныеДанные.Записать(врмф); 		Оповещение = Новый ОписаниеОповещения("ЗапускПриложения", ЭтотОбъект); 		НачатьЗапускПриложения(Оповещение, врмф, , Ложь); 	 	ПоказатьОповещениеПользователя("Документ сформирован", "", "Дождитесь открытия приложения для работы с документом", БиблиотекаКартинок.БизнесПроцесс); 	КонецЦикла;		 КонецПроцедуры &НаКлиенте Процедура ЗапускПриложения(КодВозврата, ДополнительныйПараметр) Экспорт КонецПроцедуры &НаСервере Функция СформироватьДокументНаСервере(ДокументСсылка); 	Возврат Документы.СК_КалькуляторИндексации.СгенерироватьДокумент(ДокументСсылка,"ЗаявлениеОбИндексации"); КонецФункции | 
Код формирования файла на сервере:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | Процедура ДобавитьОписаниеОбласти(НаборОбластей, знач ИмяОбласти, знач ТипОбласти) Экспорт 	НоваяОбласть = Новый Структура;	 	НоваяОбласть.Вставить("ИмяОбласти", ИмяОбласти); 	НоваяОбласть.Вставить("ТипОбласти", ТипОбласти);	 	НаборОбластей.Вставить(ИмяОбласти, НоваяОбласть);	 КонецПроцедуры Функция ПолучениеОписанияОбластей() Экспорт 	ОписаниеОбластей = Новый Структура;	 	ДобавитьОписаниеОбласти(ОписаниеОбластей, "Тушка", "Общая"); 	ДобавитьОписаниеОбласти(ОписаниеОбластей, "Подвал", "Общая"); 	ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийКолонтитул", "ВерхнийКолонтитул"); 	ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийКолонтитул", "НижнийКолонтитул"); 	ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийТитульныйКолонтитул", "НижнийТитульныйКолонтитул");		 	Возврат ОписаниеОбластей;		 КонецФункции		 функция ПолучитьДанныеМакета(Знач ИмяМакета) 	ОписаниеОбластей = Новый Соответствие; 	ДвоичныеДанныеМакетов = Новый Соответствие; 	ТипыМакетов = Новый Соответствие; 	 	ДвоичныеДанныеМакетов.Вставить(ИмяМакета, ПолучитьМакет(ИмяМакета)); 	 	ОписаниеОбластей.Вставить(ИмяМакета, ПолучениеОписанияОбластей()); 	Макет = Новый Структура; 	Макет.Вставить("ОписаниеОбластей", ОписаниеОбластей); 	Макет.Вставить("ДвоичныеДанныеМакетов", ДвоичныеДанныеМакетов); 	Макет.Вставить("ТипыМакетов", ТипыМакетов); 	Макет.Вставить("ЛокальныйКаталогФайловПечати", Неопределено);  	Если НЕ Макет.Свойство("ТипыМакетов") Тогда 		Макет.Макеты.Вставить("ТипыМакетов", Новый Соответствие);  	КонецЕсли; 	Возврат Макет;                                Конецфункции                     Функция СгенерироватьДокумент(ДокументСсылка,ИмяМакета) Экспорт 	ДанныеОбъекта = Новый Структура; 	ДанныеОбъекта.Вставить("АрбитражныйСуд", "Самый гуманный суд в мире!"); 	ДанныеМакетов = ПолучитьДанныеМакета(ИмяМакета);	 	ТипМакета = ДанныеМакетов.ТипыМакетов[ИмяМакета]; 	ДвоичныеДанныеМакета = ДанныеМакетов.ДвоичныеДанныеМакетов; 	Области = ДанныеМакетов.ОписаниеОбластей; 	Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета[ИмяМакета],ТипМакета,ИмяМакета); 	Если Макет = Неопределено Тогда 		Возврат ""; 	КонецЕсли; 	ЗакрытьОкноПечатнойформы = Ложь;	 	ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(ТипМакета, Макет.НастройкиСтраницыМакета,Макет); 	АдресХранилищаПечатнойФормы = ""; 	Если ПечатнаяФорма = Неопределено Тогда 		УправлениеПечатью.ОчиститьСсылки(Макет); 		Возврат ""; 	КонецЕсли;	 	Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Тушка"]); 	УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта); 	АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма); 	УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма, ЗакрытьОкноПечатнойФормы); 	УправлениеПечатью.ОчиститьСсылки(Макет); 	докбин = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресХранилищаПечатнойФормы)); 	док = докбин.Получить(); 	Возврат док; КонецФункции	 |