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

01.02.21

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Пример работы с файлами odt в клиент-серверной модели работы:
.epf 12,21Kb ver:1
24
24 Скачать (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

См. также

SALE! 10%

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

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

35000 31500 руб.

15.12.2021    24192    171    51    

130

SALE! 15%

Перенос данных 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

26280 руб.

12.06.2017    141848    799    297    

420

SALE! 10%

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

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

35000 31500 руб.

23.07.2020    51570    228    70    

187

SALE! 10%

Перенос данных 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 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

55778 50200 руб.

15.04.2019    72212    182    150    

124

SALE! 10%

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

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

48278 43450 руб.

25.02.2015    171312    302    257    

378

SALE! 10%

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

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

55778 50200 руб.

29.10.2018    56303    59    105    

61

Перенос данных 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, почту.

15300 руб.

18.02.2016    187032    590    509    

527

SALE! 10%

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

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

53111 47800 руб.

03.12.2020    36728    94    66    

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

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

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


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


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