1с odt подключение офисных документов
1) Разработать внутреннюю печатную форму по методике подключения новых внутренних печатных форм (см. материалы 3 занятия).
2) В модуле менеджера нашего документа, в процедуре "ДобавитьКомандыПечати", в абзаце, посвященном нашей печатной форме использовать параметр печати с ключом "ФорматСохранения" и значением из системного перечисления "ТипФайлаТабличногоДокумента".
На текущем этапе развития платформы возможно сохранение в файлы следующих форматов:
Подготовка макета печати офисного документа из образца документа
1) Получить у Заказчика образец самого документа
2) Содержимое файла "нарезать" на области, используя теги начала и окончания областей
Тег начала области содержит в фигурных скобках сочетание «v8» и название области через пробел.
Тег окончания области содержит тоже самое, только сочетание «v8» заменено на «/v8».
3) Заменить в файле образце динамически изменяемые фрагменты на параметры замены.
Такие параметры должны быть ограничены фигурными скобками и так же начинаются с сочетания «v8».
Методика подключения печатных форм (odt и doc) на основе офисных макетов
Поскольку большая часть функционала рассматриваемой подсистемы определена стандартом достаточно жестко, то мы позволили себе предложить Вам в помощь файл шаблона "ШаблонФункцииОбработкиКомандыПечатиОфиснДок.txt". Поэтому нижеприведенная методика подразумевает, что данным файлом Вы будете пользоваться.
1) Создать и разместить в конфигурации макет, созданный в офисном приложении (MicrosoftWord или OpenOffice.org Writer), включающего в себя все необходимые области. Макет размещать в конфигурации только посредством конструктора макета "Двоичные данные"
2) Создать или использовать Общий модуль, исполняемый в режиме Клиент(Управляемое приложение).
В этом модуле сразу поместить код на основе файла шаблона "ШаблонФункцииОбработкиКомандыПечатиОфиснДок.txt" и внести исправления в имени функции (нужное место помечено угловыми скобками <>).
3) Модуль менеджера нашего документа. Процедура «ДобавитьКомандыПечати». Добавить описание нашей новой команды, при этом в качестве обработчика указать функцию из п.2.
4) Модуль менеджера нашего документа. Внести коррективы в функцию "ПолучитьДанныеПечати" и в обслуживающие ее функции:
5) Вернуться в функцию из п.2 и отработать заполнение формируемого документа нужными областями.
Методика создания печатных форм (docx) на основе офисных макетов
Для облегчения использования данной методики – разработчики старались обеспечить максимальную преемственность со старой технологией (клиентской сборкой odt и doc).
Поэтому не удивляйтесь почти полному совпадению.
1) Создать и разместить в конфигурации макет, созданный в офисном приложении в формате docx, включающего в себя все необходимые области. Макет размещать в конфигурации только посредством конструктора макета "Двоичные данные"
2) Модуль менеджера нашего документа. Процедура «ДобавитьКомандыПечати». Добавить обычное описание нашей новой команды
3) Модуль менеджера нашего документа. Внести коррективы в функцию "ПолучитьДанныеПечати" и в обслуживающие ее функции:
4) Добавить в процедуре «Печать» модуля менеджера документа фрагмент, посвященный формированию нашего офисного документа и передаче адреса хранилища нашего документа в свойство «ОфисныеДокументы» нашей печатной формы;
// Наша печатная форма
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "НашаПФ");
Если ПечатнаяФорма <> Неопределено Тогда
МакетИДанныеОбъекта = УправлениеПечатьюВызовСервера.МакетыИДанныеОбъектовДляПечати("Документ._НашДокумент", ИмяМакета, МассивОбъектов);
ОфисныеДокументы = Новый Соответствие;
Для Каждого Ссылка Из МассивОбъектов Цикл
АдресХранилищаОфисныйДокумент = НашаФункцияСборкиОфиснДокумента(Ссылка, МакетИДанныеОбъекта, ИмяМакета);
ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Наша печатная форма'");
5) Модуль менеджера нашего документа. Создать функцию, собирающую офисный документ для нашей печатной формы. В этой функции сразу поместить код на основе файла шаблона "ШаблонDOCXСборкиПечатиОфиснДок.txt" и внести нужные исправления в фрагментах описания используемых областей.
Методика вывода факсимильных подписи и печати в печатной форме
1) В макете печатной формы добавить рисунки шириной 40 мм и соотношением сторон 1:1 для печати (или 4:1 для подписи) и установить их свойства:
Имя: идентификатор вида «Подпись. » или «Печать. » или «Факсимиле. », например, «ПодписьРуководителя», «ПечатьОрганизации»
Картинка: (не заполнено)
2) Добавить по образцу код по получению картинок в процедуре общего модуля УправлениеПечатьюПереопределяемый.ПриПолученииПодписейИПечатей. Особое внимание уделить указанию правильного имени реквизита, содержащего ссылку на элемент справочника «Организации» для обслуживаемого объекта:
Если ТипДокумента = Тип("ДокументСсылка._ДемоСчетНаОплатуПокупателю") Тогда
ОрганизацииВДокументах = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(СписокДокументов, "Организация");
Методика подключения внешней печатной формы при помощи файла шаблона
1) Сделать клон из файла шаблона "ШаблонВнешнейОбработкиПечатиНаОсновеТабличногоДокумента.epf", переименовав и сохранив его посредством пункта меню "Файл/Сохранить как";
2) Внести изменения в модуле объекта полученной обработки:
2.3) В функции "СформироватьПечатнуюФорму" воспользоваться "Конструктором запроса с обработкой результата" для формирования печатной формы (при составлении запроса не забудьте про необходимость выходного поля "Ссылка" и наложение условия "В" по этому полю);
2.4) Использовать закомментированные фрагменты функции для подключения к стандарту.
Методика подключения внешней печатной формы на основе офисного документа (odt и doc) при помощи файла шаблона
1) Сделать клон из файла шаблона "ШаблонВнешнейОбработкиФормированияОфисногоДокумента.epf", переименовав и сохранив его посредством пункта меню "Файл/Сохранить как";
2) Внести изменения в модуле объекта полученной обработки:
3) Заменить макет в обработке
4) Внести правки в модуле формы обработки, используя закомментированные фрагменты в качестве примеров
4.1) в функцию "ПолучитьДанныеДокументов";
4.2) в функцию "ПолучитьДанныеОбъекта";
4.3) в функцию "ПолучитьОписаниеОбластейМакетаОфисногоДокумента";
4.4) в процедуру "Печать".
Методика подключения внешней печатной формы на основе офисного документа DOCX при помощи файла шаблона
1) Сделать клон из файла шаблона "ШаблонВнешнейОбработкиФормированияДокументаDOCX.epf", переименовав и сохранив его посредством пункта меню "Файл/Сохранить как";
2) Внести изменения в модуле объекта полученной обработки:
3) Заменить макет в обработке (Внимание! Загружать можно только файл с расширением docx)
4) Внести правки в модуле формы обработки, используя закомментированные фрагменты в качестве примеров
Т.к. шаблоны на сервере, мы где-то храним путь к папке на сервере и имена файлов. У меня их было 5. В зависимости от настроек на форме. В обработке сделал 2 поля по отдельности. Выбор файла не сделаешь, ибо они на сервере.
Далее надо проверить, есть ли указанный файл в папке на сервере.
При работе с шаблоном Open Office нам нужен не сам файл, а его двоичные данные.
Кстати, если у Вас шаблон сохранен внутри конфигурации как макет, то эти танцы с бубном Вам не требуются. Макет - это уже двоичные данные.
Задача №2. Необходимо открыть шаблон для редактирования через COM объект Open Office.
Здесь сразу скажу, что сильно помог общий модуль из ЕРП "УправлениеПечатьюOOWriterКлиент". Однако, стоит отметить, что модуль написан под работу на клиенте. Моя же задача решается на сервере (таково требование заказчика).
Главную процедуру немного адаптировал под серверный вызов. Особо понравилось, что коллеги из 1С все необходимые для заполнения данные хранят в Структуре.
Полученные на первом шаге ДвоичныеДанные являются входящим параметром для этой функции. Структура имеет следующие поля:
Здесь требуются некоторые разъяснения:
1. Для того, чтоб получить Document необходимо предварительно создать временный файл с шаблоном.
2. Временный файл создаётся из двоичных данных, которые мы передали как параметр. Кстати, если Вы шаблон храните на клиенте, а заполнить захотите его на сервере, то ДвоичныеДанные нужно будет передать с клиента на сервер. Это можно сделать через помещение во временное хранилище. Также имейте ввиду, что на новых платформах 13+ (это не возраст) необходимо использовать асинхронные вызовы. Это несколько усложняет логику и читабельность кода.
3. При работе на сервере и клиенте временный файл получается так:
При работе на Веб-клиенте этот метод недоступен! Об этом подробно описано в стандарте разработки на эту тему! Рекомендую изучить. В общем модуле ЕРП работа с Веб-клиентом учтена.
4. Собственно когда мы получили временный файл и связали его с нашими двоичными данными, далее можно связать наш шаблон с COM объектом Open Office. Работа с Microsoft Office конечно гораздо проще.
5. В структуре макета поле "ИмяФайла" - это имя временного файла, а не исходного, из которого мы получили ДвоичныеДанные! Его требуется запомнить, чтоб потом удалить! Удалять временные файлы обязательно, сами они удаляются только при перезапуске 1С. А при работе на Веб-клиенте они не удаляются вовсе! Это также описано в стандарте разработки (вот почему их важно изучать и соблюдать!).
Задача №3. Заполнение показателей.
Здесь есть несколько способов:
1. Замена текста
2. Заполнение переменных. В MS Word переменные назывались DocVariable.
Выбрал первый путь, он проще и понятней. Поэтому как называются переменные в Open Office понятия не имею).
Замена идет в переменной Document в цикле. На каждой итерации создается что-то вроде конструктора замены:
Задача 4. Сохранить результаты заполнения на сервере, чтоб с сервера их передать на клиент.
Здесь пришлось подумать сильней всего. Вот причины этого:
1. COM объект передать с клиента на сервер и обратно невозможно.
2. Передача файлов также не предусмотрена. Передать можно только двоичные данные.
3. Данные у меня были сохранены во временный файл на сервере, но результат заполнения переменных в этом временном файле не сохранен.
4. Исходно я получил и заполнил шаблон ODT, а сохранить мне надо либо в ODT, либо в PDF. По этой причине сохранять данные в первый временный файл не получится. Требуется ещё один.
5. Самое сложное было понять где в текущий момент времени находятся двоичные данные с заполненными показателями. Их нет ни в переданном ранее параметре ДвоичныеДанные, ни во временном файле. Они хранятся в переменной Document, в которой и производилась замена переменных.
Собственно, как написал выше мы должны сохранить данные в новый временный файл. Имя временного файла, точнее его расширение зависит от выбора пользователя. Важно знать, что для PDF формата необходимо при сохранении заполнить параметр FilterName значением "calc_pdf_Export". Иначе двоичные данные будут предназначены для формата ODT и сохранить на клиенте их в формат PDF будет нельзя!
Также необходимо запомнить путь к второму временному файлу. Ниже напишу зачем.
Задача 5. Передача заполненного шаблона с сервера на клиент.
Как писал выше, передать мы можем двоичные данные. На текущий момент они хранятся во втором созданном временном файле. На данном этапе COM объект Open Office уже не требуется, поэтому уничтожаем его. Процедуру для этого взял из модуля ЕРП, код дублировать здесь не буду.
Получим двоичные данные и поместим их в хранилище для передачи на клиент.
После этого временные файл не нужны, их необходимо удалить.
Дальнейший код будет выполняться на клиенте/на веб-клиенте.
Задача 6. Получить данные с сервера и открыть пользователю заполненный шаблон.
Получаем двоичные данные с сервера:
Теперь нужно превратить двоичные данные в файл, чтоб можно было его запустить и показать пользователю.
Здесь мы сталкиваемся с особенностью работы веб-клиента. Путь решения описан в стандарте разработки.
Для веб-клиент необходимо получить каталог, в который будет сохранен временный файл и придумать ему имя. Формат вывода зависит от выбора пользователя.
Осталось показать полученный временный файл пользователю. Для этого на платформах 13+ надо использовать асинхронный вызов:
Т.к. мы создали ещё один временный файл, его необходимо удалить. Я это делаю в 2-х событиях:
2. При повторном нажатии на кнопку вывода шаблона.
Последнее, что осталось описать - как воспользоваться приложенной обработкой:
1. На форме заполнить Имя файла шаблона и Путь к шаблонам (напоминаю, что путь актуален на сервере!)
2. В функции "ПолучитьСписокОбщихПоказателей" указать список параметров Вашего макета.
3. Есть дополнительная функция "ПолучитьСписокНеРедактируемыхПоказателей". В ней указываются те показатели, которые заполняются из реквизитов шапки формы. Но здесь важно, чтоб имя показателя совпадало с именем реквизита на форме (не с синонимом!). Это важно т.к. заполнение идёт следующим кодом:
4. Собственно создать необходимые Вам реквизиты обработки и разместить их на форме.
Весь остальной код работает без всякой адаптации.
Если Вам необходимо макет хранить в конфигурации, то вместо задачи №1 необходимо написать получение макета.
Если необходимо выполнять код на клиенте, то учитывать особенность веб-клиента, которая описана в задаче №6.
Читайте также: