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

01.02.21

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование SM По подписке [?] Купить один файл
Пример работы с файлами odt в клиент-серверной модели работы:
.epf 12,21Kb
23
23
1 SM
Скачать Купить за 1 850 руб.

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

См. также

Перенос данных 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    138319    764    292    

405

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

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

28000 руб.

15.12.2021    21912    144    40    

104

Перенос данных 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 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

45650 руб.

15.04.2019    70482    174    146    

117

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

Переход и перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:ERP Управление предприятием 2.5 и 1С:Комплексную автоматизацию 2.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.227.x), ERP 2.5 (2.5.16.x), КА 2.5 (2.5.16.x) .

28000 руб.

24.06.2020    62449    51    27    

81

SALE! %

Перенос данных 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 оперативно выпускаем обновление переноса данных.

45650 27000 руб.

24.04.2015    192605    143    241    

274

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

В продаже с 2015 года | Воспользовались более 287 предприятий! | Перенос данных из УПП 1.3 в БП 3.0 | из КА 1.1 в БП 3.0 | Переносятся документы, начальные остатки и вся справочная информация | Сэкономьте свое время - используйте готовое решение для перехода! | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

39500 руб.

25.02.2015    169822    294    253    

374

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

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 2, УНФ 1.6 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

14580 руб.

18.02.2016    184666    573    509    

516

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

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

28000 руб.

23.07.2020    48536    208    64    

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

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

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


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


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