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

01.02.21

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

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

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

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

Задача №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! 15%

[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    135535    730    291    

391

Перенос данных из УПП 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    20603    137    38    

94

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    68820    179    139    

111

Перенос данных из УТ 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    46751    199    64    

162

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    67746    41    123    

46

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    34411    81    58    

78

Перенос данных из Парус 10 в ЗГУ ред.3

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

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9303    9    8    

11

Загрузка номенклатуры 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    151373    367    376    

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

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

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


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


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