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