Приветствую Вас, Гость · RSS Понедельник, 07.10.2024, 21:19










Главная » 2013 » Июль » 16 » Заполнение полей шаблонов документов средствами
08:56
 

Заполнение полей шаблонов документов средствами

Дмитрий Тарасов
12 июля 2011 в 09:28

На написание данного материала меня натолкнул вопрос Антона Максунова заданный им на форуме Как можно вставлять в шаблон логотип компании? Процитирую сам вопрос:

Есть задача - надо переписку между нашими компаниями перевести в рамки шаблонов в Directum. У всех компаний разный логотип и он обязательно должен быть в письмах. В связи с этим несколько вопросов:

  1. можно ли хранить в справочнике изображение?
  2. можно ли такое изображение передавать в карточку ЭД?
  3. можно ли из карточки ЭД вставлять не просто поле, а это изображение?

Если это слишком сложный путь, то может кто подскажет другое решение?

Немного поразмыслив, я подумал, а почему бы не реализовать какой-нибудь готовый вспомогательный механизм, который позволит при разработке шаблонов документов использовать возможности объектной модели Word, при этом избавит от необходимости изучения нюансов взаимодействия Directum и Word. Как говориться, дело было вечером, делать было нечего и в результате родилось что-то наподобие технического решения, которое будет описано ниже.

Само решение состоит из следующих компонент:

RITWordTemplate - справочник шаблонов документов Word;

RITOrgLogo - справочник логотипов "Наших организаций";

RITGenerateEDocFromWordTemplate(EDocument: Вариантный; VersionNumber: Целое число; WTCode: Строка) - функция заполнения полей в документе Word, где

EDocument - объект типа IEDocument, документ, в котором мы хотим заполнить поля;

VersionNumber - версия электронного документа, в которой необходимо заполнить поля;

WTCode - код записи справочника RITWordTemplate, в котором содержатся имена полей и их вычисления.

RITGetWordTemplateFieldValue(EDocID: Целое число; CalculateText: Строка) - функция вычисления значения поля документа, где

EDocID - ИД документа, для которого выполняется вычисление значения полей;

CalculateText - текст вычисления значения поля.

RITTestCreateEDocFromWordTemplate - сценарий примера использования данного решения.

Справочник RITWordTemplate выглядит так:

Карточка записи справочника RITWordTemplate:

Назначение реквизитов карточки понятно из их заголовков.

По кнопке Шаблон можно открыть для просмотра или изменения шаблон документа, указанный в реквизите "Шаблон электронного документа":

По кнопке Просмотр можно посмотреть результат заполнения полей шаблона:

В табличной части записи справочника RITWordTemplate задаются имена полей шаблона и вычисления для этих полей на языке ISBL. Результат вычисления необходимо вернуть в строковой переменной Result. В вычислениях доступна предопределенная переменная EDocument, с помощью которой можно обращаться к реквизитам карточки документа. Для полей, в которые нужно будет вставить картинку, необходимо установить реквизит "Картинка" в значение "Да". Для таких полей результат вычисления должен возвращать путь до картинки (другого способа вставки картинки в документ я не нашел). Путь может быть как локальный, так и сетевой (у пользователя должен быть доступ к сетевой папке, где хранятся картинки, на чтение). Поля, для которых не задано вычисление, пропускаются (для примера, поле [Тема] на скриншотах). Если результат вычисления будет пустая строка, то такие поля тоже заполняться не будут.

Для поля [Должность подписанта] вычисление выглядит так:

Для поля [Логотип] вычисление выглядит так:

Пример использования:

TypeKode = "ПЭА" KindCode = "Г000043" TemplateCode = "Д000066" EDocument = EDocuments.CreateNewFromTemplate(TypeKode; KindCode; TemplateCode) EDocument.ISBEDocName = "Документ из тестового шаблона" EDocument.Save() RITGenerateEDocFromWordTemplate(EDocument;;"Д000005") EDocument.Open(True; -1)

Бонусом к решению добавлен справочник логотипов организаций RITOrgLogo:

Карточка записи справочника RITOrgLogo:

С помощью этого справочника можно хранить логотипы наших организаций и потом их использовать в вычислениях на ISBL или вставлять в шаблоны документов.

В итоге мы получили:

  1. Возможность вставлять значения текстовых реквизитов в поля шаблонов документов размером более 255 символов.
  2. Возможность вставлять картинки в шаблоны документов.
  3. Возможность "вешать" вычисления на поля шаблонов документов.
  4. Возможность заполнить поле шаблона документа не только значением из карточки документа.
  5. И много чего еще :)

Разработка велась в версии DIRECTUM 4.6.1. В 4.7 тоже проверял, все работает. Ниже прилагаю архив с самой разработкой. Структура архива:

  1. Dev - папка с разработкой.
  2. Ref - папка с записями справочников для примера.
  3. Шаблон для тестирования (110124 v1).DOC - шаблон документа, на котором я все это тестировал.

WordTemplate.zip (153,46 Кб)

-------------------------------------------------------------------------------------------

Решение обновилось до версии 2.0

Список изменений:

1. Карточка записи справочника RITWordTemplate теперь выглядит так:

2. При выборе Вида электронного документа в реквизите Тип карточки доступны для выбора типы карточек только для данного вида электронного документа. Если доступен только один вид карточки, то он подставляется автоматически.

3. При выборе Вида электронного документа в реквизите Шаблон электронного документа доступны для выбора шаблоны только для данного вида электронного документа. Если доступен только один шаблон, то он подставляется автоматически.

4. Добавился реквизит Запоминать реквизиты. Если реквизит установлен в значение "Да", то будут запоминаться значения реквизитов, которые указываются при заполнении карточки, что избавляет от постоянного заполнения карточки документа при тестировании шаблона. Для каждой записи справочника RITWordTemplate запоминается свой набор значений реквизитов. Т.к. значения реквизитов хранятся в окружении, они будут храниться, пока не будет закрыт справочник RITWordTemplate.

5. Добавился реквизит Удалять временные документы. Если реквизит установлен в значение "Да", то при каждом просмотре шаблона (по кнопке Просмотр) будет удаляться временный документ, созданный при предыдущем просмотре. Если вам мешает то, что перед следующим просмотром, предыдущий временный документ, созданный из шаблона, надо закрыть (иначе его не получится удалить), то установите реквизит в значение "Нет". В этом случае вы можете потом после отладки шаблона удалить все временные документы, созданные во время отладки шаблона, по кнопке Эл.документы.

6. Добавилась кнопка Эл.документы. По этой кнопке отображается список всех временных документов, которые создавались во время тестирования шаблона. Вы можете их после отладки удалить или произвести с ними какие-либо другие действия.

7. Добавилась функция RITGenerateEDocFromWordTemplateFieldsList(EDocument: Вариантный; VersionNumber: Целое число; FieldsList: Вариантный) - функция заполнения полей в документе Word, где

EDocument - объект типа IEDocument, документ, в котором мы хотим заполнить поля;

VersionNumber - версия электронного документа, в котором необходимо заполнить поля;

FieldsList - список полей и их значений типа IList, которые необходимо заполнить в документе. В списке значений в Name заносится имя поля, в Value массив вида (Значение_поля; Признак_картинки).

Данную функцию удобно использовать, когда значения полей вычисляются динамически (например, в ходе выполнения типового маршрута) и вы не можете их расчитать заранее в справочнике RITWordTemplate. Пример использования данной функции:

RECORDS_DOES_NOT_EXIST = 0 FIRST_WORKER_INDEX = 0 if Job.ExecutionResult.Code = 1 // Получим ИД документа из параметров задачи DocID = ТМПолучитьПараметрЗадачи('ИДПНК') EDoc = EDocuments.GetObjectByID(DocID) // Добавим подпись руководителя и дату подписания Performer = Job.Info.Performer WorkerCodeList = GetEmployeesByUserID(Performer.ID) if WorkerCodeList.Count > RECORDS_DOES_NOT_EXIST WorkerCode = WorkerCodeList.Values(FIRST_WORKER_INDEX) Worker = References.РАБ.GetObjectByCode(WorkerCode) FieldsList = CreateList() if Assigned(Worker.Requisites('Текст').AsString) FileName = Worker.SYSREQ_NAME & '.' & Worker.Requisites('Текст').Extension Path = GetTempFolder() FileName = Path & FileName Worker.Requisites('Текст').SaveToFile(FileName) FieldsList.Add('[Подпись2]'; ArrayOf(FileName; YES_VALUE)) endif FieldsList.Add('[Дата2]'; ArrayOf(ToDay(); NO_VALUE)) RITGenerateEDocFromWordTemplateFieldsList(EDoc; ; FieldsList) FieldsList = nil endif endif

8. Исправлено много мелких ошибок, выявленных в ходе тестирования решения.

Разработка тестировалась в версиях DIRECTUM 4.6.0, 4.6.1, 4.7.0.

WordTemplate_ver2.zip (100,63 Кб)

P.S. данный механизм удобно использовать при разработке и тестировании шаблонов и с использованием стандартной интеграции DIRECTUM с MS Office. По крайней мере вы будете избавлены от необходимости выполнять действия по созданию шаблона и заполнению реквизитов карточки документа при тестировании шаблона. Сейчас все гораздо проще:

1. Нажал кнопку "Шаблон" - поправил шаблон и сохранил его.

2. Нажал кнопку "Просмотр" - посмотрел результат.

Просмотров: 3881 | Добавил: hamaget | Рейтинг: 0.0/0
Всего комментариев: 0
Создать бесплатный сайт с uCoz
Copyright MyCorp © 2024