Подобная статья уже была где-то на сайте, но вот еще одна, но решил актуализировать.
Итак, задача: при нажатии кнопки «В Word», сформировать на сервере файл по шаблону, сохранить его на клиент и открыть любым зарегистрированным приложением. Работать должно кроссплатформенно Linux/Windows
Создадим docx файл вида:
Решение:
{v8 Область.Тушка}
какойто текст, текст, текст. Бла-бла-бла..
{v8 АрбитражныйСудНаименование}
{/v8 Область.Тушка}
Загрузим его в макет как бинарные данные.
Далее код кнопки:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ПоказатьОповещениеПользователя("Формирую документ", "", "Формируем документ. Это может занять некоторое время", БиблиотекаКартинок.БизнесПроцесс);
Для Каждого ДокументСсылка Из ПараметрКоманды Цикл
БинарныеДанные = СформироватьДокументНаСервере(ДокументСсылка);
врмф = ПолучитьИмяВременногоФайла(".docx");
БинарныеДанные.Записать(врмф);
Оповещение = Новый ОписаниеОповещения("ЗапускПриложения", ЭтотОбъект);
НачатьЗапускПриложения(Оповещение, врмф, , Ложь);
ПоказатьОповещениеПользователя("Документ сформирован", "", "Дождитесь открытия приложения для работы с документом", БиблиотекаКартинок.БизнесПроцесс);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ЗапускПриложения(КодВозврата, ДополнительныйПараметр) Экспорт
КонецПроцедуры
&НаСервере
Функция СформироватьДокументНаСервере(ДокументСсылка);
Возврат Документы.СК_КалькуляторИндексации.СгенерироватьДокумент(ДокументСсылка,"ЗаявлениеОбИндексации");
КонецФункции
Код формирования файла на сервере:
Процедура ДобавитьОписаниеОбласти(НаборОбластей, знач ИмяОбласти, знач ТипОбласти) Экспорт
НоваяОбласть = Новый Структура;
НоваяОбласть.Вставить("ИмяОбласти", ИмяОбласти);
НоваяОбласть.Вставить("ТипОбласти", ТипОбласти);
НаборОбластей.Вставить(ИмяОбласти, НоваяОбласть);
КонецПроцедуры
Функция ПолучениеОписанияОбластей() Экспорт
ОписаниеОбластей = Новый Структура;
ДобавитьОписаниеОбласти(ОписаниеОбластей, "Тушка", "Общая");
ДобавитьОписаниеОбласти(ОписаниеОбластей, "Подвал", "Общая");
ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийКолонтитул", "ВерхнийКолонтитул");
ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийКолонтитул", "НижнийКолонтитул");
ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийТитульныйКолонтитул", "НижнийТитульныйКолонтитул");
Возврат ОписаниеОбластей;
КонецФункции
функция ПолучитьДанныеМакета(Знач ИмяМакета)
ОписаниеОбластей = Новый Соответствие;
ДвоичныеДанныеМакетов = Новый Соответствие;
ТипыМакетов = Новый Соответствие;
ДвоичныеДанныеМакетов.Вставить(ИмяМакета, ПолучитьМакет(ИмяМакета));
ОписаниеОбластей.Вставить(ИмяМакета, ПолучениеОписанияОбластей());
Макет = Новый Структура;
Макет.Вставить("ОписаниеОбластей", ОписаниеОбластей);
Макет.Вставить("ДвоичныеДанныеМакетов", ДвоичныеДанныеМакетов);
Макет.Вставить("ТипыМакетов", ТипыМакетов);
Макет.Вставить("ЛокальныйКаталогФайловПечати", Неопределено);
Если НЕ Макет.Свойство("ТипыМакетов") Тогда
Макет.Макеты.Вставить("ТипыМакетов", Новый Соответствие);
КонецЕсли;
Возврат Макет;
Конецфункции
Функция СгенерироватьДокумент(ДокументСсылка,ИмяМакета) Экспорт
ДанныеОбъекта = Новый Структура;
ДанныеОбъекта.Вставить("АрбитражныйСуд", "Самый гуманный суд в мире!");
ДанныеМакетов = ПолучитьДанныеМакета(ИмяМакета);
ТипМакета = ДанныеМакетов.ТипыМакетов[ИмяМакета];
ДвоичныеДанныеМакета = ДанныеМакетов.ДвоичныеДанныеМакетов;
Области = ДанныеМакетов.ОписаниеОбластей;
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета[ИмяМакета],ТипМакета,ИмяМакета);
Если Макет = Неопределено Тогда
Возврат "";
КонецЕсли;
ЗакрытьОкноПечатнойформы = Ложь;
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(ТипМакета, Макет.НастройкиСтраницыМакета,Макет);
АдресХранилищаПечатнойФормы = "";
Если ПечатнаяФорма = Неопределено Тогда
УправлениеПечатью.ОчиститьСсылки(Макет);
Возврат "";
КонецЕсли;
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Тушка"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта);
АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма, ЗакрытьОкноПечатнойФормы);
УправлениеПечатью.ОчиститьСсылки(Макет);
докбин = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресХранилищаПечатнойФормы));
док = докбин.Получить();
Возврат док;
КонецФункции