1С: Генерация документа DOCX на сервере без установки WORD
Задача: создать по шаблону файл формата Word на сервере 1С предприятие. Кросплатформенно (т.е. никаких COMОбъект).
Первоначально было сделано на основе сохранения табличного документа генерируемого из Макета. Однако в нём сложно получить вычурную разметку, которая необходима в моем случае.
Решение: используем функционал БСП УправлениеПечатью, а именно функцию ИнициализироватьМакетОфисногоДокумента.
1.Создаем документа в формате OpenXML. Любым редактором. Хоть Word хоть LibreOffice. Без разницы. Разметку в нём делаем в соответствии с разделителями вида:
1 2 3 |
{v8 Область.<Имя области>} {v8 <ИмяПараметра>} {/v8 Область.<Имя области>} |
Подробнее о разметке тут
2. Создаем в конфигураторе 1С документ и макет с бинарными данными и загружаем в него этот файл.
3. В Менеджере документа размещаем:
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 85 86 87 88 89 90 91 92 |
Функция СгенерироватьДокументБСП(Ссылка,ИмяМакета) Экспорт ДанныеМакета = ПолучитьДанныеМакета(ИмяМакета); ОфисныеДокументы = Новый Соответствие; АдресХранилищаОфисныйДокумент = СоздатьДокументOfficeOpenXML(Ссылка, ДанныеМакета, ИмяМакета); докбин= Новый ХранилищеЗначения( ПолучитьИзВременногоХранилища(АдресХранилищаОфисныйДокумент) ); фф=докбин.Получить(); возврат фф; КонецФункции функция СоздатьДокументOfficeOpenXML(Ссылка, ДанныеМакетов, ИмяМакета) //Тестовые данные, могут быть получены ранее в другой функции или в этой функции ДанныеОбъекта = Новый Структура; ДанныеОбъекта.Вставить("Кому", "ООО НАША ОРГАНИЗАЦИЯ"); ТипМакета = ДанныеМакетов.ТипыМакетов[ИмяМакета]; ДвоичныеДанныеМакета = ДанныеМакетов.ДвоичныеДанныеМакетов; Области = ДанныеМакетов.ОписаниеОбластей; Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета[ИмяМакета],ТипМакета, ИмяМакета); Если Макет = Неопределено Тогда Возврат ""; КонецЕсли; ЗакрытьОкноПечатнойформы = Ложь; Попытка ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(ТипМакета, Макет.НастройкиСтраницыМакета, Макет); АдресХранилищаПечатнойФормы = ""; Если ПечатнаяФорма = Неопределено Тогда УправлениеПечатью.ОчиститьСсылки(Макет); Возврат ""; КонецЕсли; // Вывод верхней части документа - обычная область с параметрами. Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Шапка"]); УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта); АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма); Исключение ОбщегоНазначения.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ЗакрытьОкноПечатнойФормы = Истина; Возврат ""; КонецПопытки; УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма, ЗакрытьОкноПечатнойФормы); УправлениеПечатью.ОчиститьСсылки(Макет); Возврат АдресХранилищаПечатнойФормы; Конецфункции функция ПолучитьДанныеМакета(Знач ИмяМакета) ОписаниеОбластей = Новый Соответствие; ДвоичныеДанныеМакетов = Новый Соответствие; ТипыМакетов = Новый Соответствие; ДвоичныеДанныеМакетов.Вставить(ИмяМакета, ПолучитьМакет(ИмяМакета)); ОписаниеОбластей.Вставить(ИмяМакета, ОписаниеОбластейМакетаОфисногоДокумента()); Макет = Новый Структура; Макет.Вставить("ОписаниеОбластей", ОписаниеОбластей); Макет.Вставить("ДвоичныеДанныеМакетов", ДвоичныеДанныеМакетов); Макет.Вставить("ТипыМакетов", ТипыМакетов); Макет.Вставить("ЛокальныйКаталогФайловПечати", Неопределено); Если НЕ Макет.Свойство("ТипыМакетов") Тогда Макет.Макеты.Вставить("ТипыМакетов", Новый Соответствие); КонецЕсли; Возврат Макет; Конецфункции функция ОписаниеОбластейМакетаОфисногоДокумента() ОписаниеОбластей = Новый Структура; УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Шапка", "Общая"); Возврат ОписаниеОбластей; Конецфункции |
4. В Форме документа размещаем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
&НаСервере Функция СформироватьДокументНаСервереБСП(); бинарныеданные=Документы.ascsdc.СгенерироватьДокументБСП(объект,"Шаблон_2"); возврат бинарныеданные; КонецФункции &НаКлиенте Процедура ГенерацияБСП(Команда) БинарныеДанные=СформироватьДокументНаСервереБСП(); врмф=ПолучитьИмяВременногоФайла(".docx"); БинарныеДанные.Записать(врмф); Попытка ОбъектВорд = Новый COMОбъект("Word.Application"); Исключение Сообщить("Ошибка при запуске Microsoft Word (3): " + ОписаниеОшибки(), СтатусСообщения.Внимание); КонецПопытки; //Путь к шаблону ОбъектВорд.Documents.Add(врмф); ШаблонВорд = ОбъектВорд.ActiveDocument; ОбъектВорд.Application.Visible = Истина; ОбъектВорд.Activate(); КонецПроцедуры |
В приведенном примере, файл формируется на сервере и открывается для наглядности в Word уже «готовым» на клиенте. В принципе ничего не мешает эту фазу исключить и сразу сохранять полученный с сервера файл куда угодно.