Пример работы с файлами odt в клиент-серверной модели работы

01.02.21

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

Возникла задача, реализовать печатные формы из шаблонов в формате ODT (Open Office). Особенность задачи заключалась в том, что шаблоны хранятся в виде файлов на сервере. Печать должна выполняться через веб-клиент. По выбору пользователя заполненный шаблон выводится либо в ODT либо PDF. Столкнулся с дефицитом информации по этой теме. По этой причине в самой статье опишу подход к решению задачи и особенности, связанные с работой на сервере и веб-клиенте. Прикладываю обработку, в которой все реализовано. Вам останется только отредактировать 2 функции, в которых указан список параметров шаблона. Остальной код универсальный и не зависит от конфигурации. Данная доработка выполнялась в самописной конфигурации и не требует наличия БСП. Сразу напишу, что размышления о том, что можно поместить шаблон в конфигурацию и выполнить всё на клиенте совсем не уместны. Разработка велась на платформе 8.3.16, на более ранних версиях также должна работать.

Скачать исходный код

Наименование Файл Версия Размер
Пример работы с файлами odt в клиент-серверной модели работы:
.epf 12,21Kb
23
.epf 1 12,21Kb 23 Скачать

Задача №1. Нужно открыть файл шаблона.

Т.к. шаблоны на сервере, мы где-то храним путь к папке на сервере и имена файлов. У меня их было 5. В зависимости от настроек на форме. В обработке сделал 2 поля по  отдельности. Выбор файла не сделаешь, ибо они на сервере.

Далее надо проверить, есть ли указанный файл в папке на сервере. 

ФайлШаблона = Новый Файл(ПутьКФайлу + "\" + ИмяФайла);
Если Не ФайлШаблона.Существует() Тогда
    РезультатВыполнения.Успешно = Ложь;
    РезультатВыполнения.ТекстОшибки = "Не найден файл шаблона";
	
    Возврат РезультатВыполнения;
КонецЕсли; 

При работе с шаблоном Open Office нам нужен не сам файл, а его двоичные данные.

ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу + "\" + ИмяФайла)

Кстати, если у Вас шаблон сохранен внутри конфигурации как макет, то эти танцы с бубном Вам не требуются. Макет - это уже двоичные данные. 

Задача №2. Необходимо открыть шаблон для редактирования через COM объект Open Office.

Здесь сразу скажу, что сильно помог общий модуль из ЕРП "УправлениеПечатьюOOWriterКлиент". Однако, стоит отметить, что модуль написан под работу на клиенте. Моя же задача решается на сервере (таково требование заказчика). 

Главную процедуру немного адаптировал под серверный вызов. Особо понравилось, что коллеги из 1С все необходимые для заполнения данные хранят в Структуре. 

СтруктураМакета = ПолучитьМакетOpenOffice(ДвоичныеДанные);

Полученные на первом шаге ДвоичныеДанные являются входящим параметром для этой функции. Структура имеет следующие поля:

СтруктураМакета = Новый Структура("ServiceManager, Desktop, Document, ИмяФайла, ДвоичныеДанные", Неопределено, Неопределено, Неопределено, "", Неопределено);

Здесь требуются некоторые разъяснения:

1. Для того, чтоб получить Document необходимо предварительно создать временный файл с шаблоном. 

2. Временный файл создаётся из двоичных данных, которые мы передали как параметр. Кстати, если Вы шаблон храните на клиенте, а заполнить захотите его на сервере, то ДвоичныеДанные нужно будет передать с клиента на сервер. Это можно сделать через помещение во временное хранилище. Также имейте ввиду, что на новых платформах 13+ (это не возраст) необходимо использовать асинхронные вызовы. Это несколько усложняет логику и читабельность кода.

3. При работе на сервере и клиенте временный файл получается так:

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("ODT");
ДвоичныеДанныеШаблона.Записать(ИмяВременногоФайла);

При работе на Веб-клиенте этот метод недоступен! Об этом подробно описано в стандарте разработки на эту тему! Рекомендую изучить. В общем модуле ЕРП работа с Веб-клиентом учтена.

4. Собственно когда мы получили временный файл и связали его с нашими двоичными данными, далее можно связать наш шаблон с COM объектом Open Office. Работа с Microsoft Office конечно гораздо проще.

Document = Desktop.LoadComponentFromURL("file:///" + СтрЗаменить(ИмяВременногоФайла, "\", "/"), "_blank", 0, ПараметрыДокумента);

5. В структуре макета поле "ИмяФайла" - это имя временного файла, а не исходного, из которого мы получили ДвоичныеДанные! Его требуется запомнить, чтоб потом удалить! Удалять временные файлы обязательно, сами они удаляются только при перезапуске 1С. А при работе на Веб-клиенте они не удаляются вовсе! Это также описано в стандарте разработки (вот почему их важно изучать и соблюдать!).

Задача №3. Заполнение показателей. 

Здесь есть несколько способов:

1. Замена текста

2. Заполнение переменных. В MS Word переменные назывались DocVariable.

Выбрал первый путь, он проще и понятней. Поэтому как называются переменные в Open Office понятия не имею).

Замена идет в переменной Document в цикле. На каждой итерации создается что-то вроде конструктора замены:

//Заполним все переменные в шаблоне
Для Каждого ТекПоказатель Из Объект.СтроковыеПоказатели Цикл
    ReplaceDescriptor = СтруктураМакета.Document.createReplaceDescriptor();
	
    ReplaceDescriptor.SearchString = СокрЛП(ТекПоказатель.ИдентификаторПоказателя);
    ReplaceDescriptor.ReplaceString = СокрЛП(ТекПоказатель.Значение);
	
    СтруктураМакета.Document.replaceAll(ReplaceDescriptor);
КонецЦикла; 

Задача 4. Сохранить результаты заполнения на сервере, чтоб с сервера их передать на клиент.

Здесь пришлось подумать сильней всего. Вот причины этого:

1. COM объект передать с клиента на сервер и обратно невозможно.

2. Передача файлов также не предусмотрена. Передать можно только двоичные данные.

3. Данные у меня были сохранены во временный файл на сервере, но результат заполнения переменных в этом временном файле не сохранен. 

4. Исходно я получил и заполнил шаблон ODT, а сохранить мне надо либо в ODT, либо в PDF. По этой причине сохранять данные в первый временный файл не получится. Требуется ещё один.

5. Самое сложное было понять где в текущий момент времени находятся двоичные данные с заполненными показателями. Их нет ни в переданном ранее параметре ДвоичныеДанные,  ни во временном файле. Они хранятся в переменной Document, в которой и производилась замена переменных.

Собственно, как написал выше мы должны сохранить данные в новый временный файл. Имя временного файла, точнее его расширение зависит от выбора пользователя. Важно знать, что для PDF формата необходимо при сохранении заполнить параметр FilterName значением "calc_pdf_Export". Иначе двоичные данные будут предназначены для формата ODT и сохранить на клиенте их в формат PDF будет нельзя!

ПараметрТипФайла = "";
Если Объект.ФорматPDF Тогда
    ЗаполненныйВременныйФайл = ПолучитьИмяВременногоФайла(".pdf");
    ПараметрТипФайла = "calc_pdf_Export";
Иначе	
    ЗаполненныйВременныйФайл = ПолучитьИмяВременногоФайла(".odt");
КонецЕсли; 
	
НастройкиСохранения.SetValue(0, СвойствоЗначение(СтруктураМакета.ServiceManager, "FilterName", ПараметрТипФайла));
	
//Сохраним полученный временный файл, чтоб далее его удалить
СтруктураМакета.Вставить("ЗаполненныйВременныйФайл", ЗаполненныйВременныйФайл);

//Приводим путь к файлу в формат Open Office и записываем файл
ЗаполненныйВременныйФайл_какУРЛ = "file:///" + СтрЗаменить(ЗаполненныйВременныйФайл, "\", "/");
СтруктураМакета.Document.storeToURL(ЗаполненныйВременныйФайл_какУРЛ, НастройкиСохранения);

Также необходимо запомнить путь к второму временному файлу. Ниже напишу зачем.

Задача 5. Передача заполненного шаблона с сервера на клиент.

Как писал выше, передать мы можем двоичные данные. На текущий момент они хранятся во втором созданном временном файле. На данном этапе COM объект Open Office уже не требуется, поэтому уничтожаем его. Процедуру для этого взял из модуля ЕРП, код дублировать здесь не буду.

Получим двоичные данные и поместим их в хранилище для передачи на клиент.

ДвоичныеДанные = Новый ДвоичныеДанные(СтруктураМакета.ЗаполненныйВременныйФайл);
АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор);

После этого временные файл не нужны, их необходимо удалить.

Если СтруктураМакета.Свойство("ИмяФайла") Тогда
    УдалитьФайлы(СтруктураМакета.ИмяФайла);
КонецЕсли;

Если СтруктураМакета.Свойство("ЗаполненныйВременныйФайл") Тогда
    УдалитьФайлы(СтруктураМакета.ЗаполненныйВременныйФайл);
КонецЕсли;

Дальнейший код будет выполняться на клиенте/на веб-клиенте.

Задача 6. Получить данные с сервера и открыть пользователю заполненный шаблон.

Получаем двоичные данные с сервера:

ДвоичныеДанныеШаблона = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресВХранилище);

Теперь нужно превратить двоичные данные в файл, чтоб можно было его запустить и показать пользователю.

Здесь мы сталкиваемся с особенностью работы веб-клиента. Путь решения описан в стандарте разработки. 

Для веб-клиент необходимо получить каталог, в который будет сохранен временный файл и придумать ему имя. Формат вывода зависит от выбора пользователя. 

	//Получим имя временного файла
#Если ВебКлиент Тогда
	Расширение = ?(Объект.ФорматPDF, ".PDF", ".ODT");
	
	Каталог = КаталогВременныхФайлов();
	ИмяФайла = Строка(Новый УникальныйИдентификатор) + Расширение;
	
	ИмяВременногоФайла = Каталог + ИмяФайла;
#Иначе
	Расширение = ?(Объект.ФорматPDF, "PDF", "ODT");
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
#КонецЕсли

	//Сохраним временный файл
	ДвоичныеДанныеШаблона.Записать(ИмяВременногоФайла);

Осталось показать полученный временный файл пользователю. Для этого на платформах 13+ надо использовать асинхронный вызов:

НачатьЗапускПриложения(ОповещениеЗапускаПриложения, ИмяВременногоФайла);

Т.к. мы создали ещё один временный файл, его необходимо удалить. Я это делаю в 2-х событиях:

1. ПередЗакрытием

2. При повторном нажатии на кнопку вывода шаблона.

 

Последнее, что осталось описать - как воспользоваться приложенной обработкой:

1. На форме заполнить Имя файла шаблона и Путь к шаблонам (напоминаю, что путь актуален на сервере!)

2. В функции "ПолучитьСписокОбщихПоказателей" указать список параметров Вашего макета.

3. Есть дополнительная функция "ПолучитьСписокНеРедактируемыхПоказателей". В ней указываются те показатели, которые заполняются из реквизитов шапки формы. Но здесь важно, чтоб имя показателя совпадало с именем реквизита на форме (не с синонимом!). Это важно т.к. заполнение идёт следующим кодом:

СписокНеРедактируемыхПоказателей = ПолучитьСписокНеРедактируемыхПоказателей();
Для Каждого ТекПоказатель Из СписокНеРедактируемыхПоказателей Цикл
    НайдСтрокиТЧ = Объект.СтроковыеПоказатели.НайтиСтроки(Новый Структура("ИдентификаторПоказателя", ТекПоказатель));
	Если Не НайдСтрокиТЧ.Количество() = 0 Тогда
	    СтрокаТЧ = НайдСтрокиТЧ[0];
        
            СтрокаТЧ.Значение = Объект[ТекПоказатель];
	КонецЕсли; 
КонецЦикла; 

4. Собственно создать необходимые Вам реквизиты обработки и разместить их на форме. 

 

Весь остальной код работает без всякой адаптации.

Если Вам необходимо макет хранить в конфигурации, то вместо задачи №1 необходимо написать получение макета. 

Если необходимо выполнять код на клиенте, то учитывать особенность веб-клиента, которая описана в задаче №6.

Спасибо за внимание.

Open Office шаблон опен офис веб клиент ODT PDF Acrobat

См. также

SALE! 10%

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 руб.

12.06.2017    135883    732    291    

393

SALE! 10%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0. Переносятся документы, начальные остатки и справочники

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | В продаже с 2019г. | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

38500 34650 руб.

15.04.2019    69066    181    139    

111

Перенос данных из УПП 1.3 в БП 3.0. Переносятся документы (обороты за период), справочная информация и остатки

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.226.x) и БП 3.0 (3.0.151.x). Правила подходят для версии ПРОФ и КОРП.

28000 руб.

15.12.2021    20734    136    38    

95

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.87.x) и УТ 11.5 (11.5.16.x).

28000 руб.

23.07.2020    46953    201    64    

162

SALE! 10%

Перенос данных из ERP 2 / КА 2 в ЗУП 3. Переносятся остатки, документы и справочники

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Воспользовались более 79 предприятий! | Предлагаем приобрести готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | В продаже с 2020г. | Оперативно обновляем правила до актуальных релизов 1С | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

48278 43450 руб.

03.12.2020    34567    83    58    

81

SALE! 10%

Перенос данных из БП 3.0 в УНФ 3.0 / УНФ 1.6. Переносятся остатки, документы и справочная информация

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

В продаже с 2018г. | Воспользовались более 41 предприятия! | Правила конвертации (КД 2) для переноса данных из БП 3 в УНФ | Переносятся все виды документов, начальные остатки и вся возможная справочная информация | Есть фильтр по организациям | Оперативно обновляем на новые релизы | Оказываем техподдержку | В комплект файлов входит инструкция, авторская версия обработки "Универсальный обмен...", актуальные правила переноса данных и архив старых версий переноса | Учет в БП 3 должен быть корректным, некорректные данные не переносятся | Можно бесплатно проверить на вашем сервере до покупки!

50722 руб.

10.07.2018    67973    41    123    

46

SALE! 10%

Перенос данных из УТ 10.3 в УТ 11 / КА 2 / ERP 2. Переносятся документы, справочники и остатки

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос в продаже с 2015г., и мы постоянно работаем над его развитием. Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

50722 45650 руб.

24.04.2015    191200    270    239    

270

Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 09.04.2024, версия 9.9 - 9.10)

14400 руб.

20.11.2015    151809    368    376    

503
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ltfriend 963 01.02.21 18:23 Сейчас в теме
Получить файлы на клиенте с сервера - НачатьПолучениеФайлаССервера
2. timeforlive 15 02.03.24 07:11 Сейчас в теме
Не возникали проблемы с не закрытыми сеансами open office? Когда при повторном чтении (или копировании) шаблона - 1С не могла этого сделать, т.к. файл уже используется (открыт).

У меня такая проблема была с word файлами, что-то придумывал с .bat файлом и kill'ом сеансов word на сервере.
Типовой функционал не применял, свои велосипеды городил.

Какую процедуру из ЕРП брали для закрытия COM?
3. biimmap 1864 04.03.24 12:44 Сейчас в теме
(2)
Какую процедуру из ЕРП брали для закрытия COM?


никакую) не работаю с ЕРП. Мой профиль ЗУП
4. biimmap 1864 04.03.24 12:45 Сейчас в теме
(2)
Не возникали проблемы с не закрытыми сеансами open office?


Не получал таких отзывов от пользователей.
Оставьте свое сообщение