Простая интеграция Directum RX с внешними системами позволяет наладить бизнес-процессы, основанные на специфичных возможностях разных систем. Кроме этого, она упрощает пользовательские сценарии работы.
Для интеграции Directum RX c 1С, службой каталогов Active Directory, редакторами ONLYOFFICE и некоторыми другими системами существуют готовые решения. Это здорово, но недостаточно, так как количество и разнообразие систем, которые использует бизнес, огромно: ERP, MDM, CRM, почтовые клиенты, мессенджеры, системы управления проектами и т.д. На основе этого была сформирована цель:
Создать понятный, современный механизм, который позволит просто, а значит дешево, объединять Directum RX с любыми системами, которые предоставляют инструменты интеграции.
В системе Directum RX 4.0 появился сервис интеграции. Он умеет получать от внешней системы HTTP-запросы по веб-протоколу OData и выполнять их. Ответ преобразовывается в формат JSON и передается обратно внешней системе:
Сервис кроссплатформенный и входит в дистрибутив. Разворачивается вместе с остальными компонентами Directum RX на компьютерах с ОС Windows с помощью программы установки, а на Linux – с помощью скриптов. Если нужно масштабировать систему, сервис можно перенести с основного сервера, где развернут веб-сервер, на выделенный. Инструкция по переносу сервиса входит в комплект поставки.
С помощью среды разработки можно постоянно наращивать интеграционные возможности, добавлять новые функции и типы сущностей, которые будут участвовать во взаимодействии с внешними системами.
Настроить интеграцию Directum RX с внешними системами можно на раз-два-три.
Интеграционными могут быть только серверные и разделяемые функции. В базовом решении по умолчанию есть функции, к которым можно обратиться через сервис интеграции. На своем слое разработки эти функции можно переопределить. Кроме этого, на слое можно любую серверную или разделяемую функцию базового решения сделать интеграционной или же с нуля написать свою функцию интеграции.
Чтобы функция стала интеграционной, к ней нужно добавить модификатор public и один из атрибутов:
Также следует проверить типы данных у параметров и возвращаемого значения функции. Из-за использования протокола OData к ним есть ряд требований, которые описаны в справке.
Что касается типов сущностей, через сервис интеграции можно получать, создавать, обновлять или удалять только те типы, для которых в среде разработки в редакторе установлен флажок Использовать в сервисе интеграции:
Флажок по умолчанию установлен для типов документов, задач и заданий. Есть особенности по установке и снятию флажка при наследовании и перекрытии, с ними, опять-таки, предлагаю ознакомиться в справке.
Когда в среде разработки все готово, остается написать HTTP-запросы к интеграционным функциям или типам сущностей. Для обращения к функциям используются методы POST и GET. Для обращения к типам сущностей – POST, GET, PATCH и DELETE. Другие методы для обмена с Directum RX не используются.
В запросах важно:
Пример POST-запроса к функции AddValue(), которая на вход получает параметры Name, PlannedValue, ActualValue:
Чтобы быстро разобраться в понятиях «строка запроса», «заголовки» и «тело», изучите раздел с описанием структуры запроса.
От теории к практике. Рассмотрим кейс интеграции.
Ситуация
Для работы с договорами компания использует узкоспециализированную систему. В Directum RX создаются и хранятся все остальные типы документов. Чтобы упростить поиск и сделать Directum RX хранилищем для всех документов, нужно:
Далее рассмотрим, как реализовать первый пункт. Этого достаточно для понимания принципов.
Решение
Раз. Для этой ситуации не нужны функции интеграции, пункт пропускаем.
Два. В среде разработки для типа документа «Договор» (Contract) из базового решения по умолчанию установлен флажок Использовать в сервисе интеграции. То есть никаких дополнительных настроек не требуется, идем дальше.
Три. Чтобы в Directum RX создать документы на основе договоров из внешней системы:
В первом POST-запросе для создания карточки нужно указать:
{Протокол https или http}://{имя сервера, на котором установлен сервис интеграции}/{имя сервиса интеграции}/odata/{Интерфейс типа сущности во множественном числе}
Пример:
POST /DrxIntegration/odata/IContracts HTTP/1.1
Host: DirectumRXServer.com
Username: Administrator
Password: 11111
Content-Type: application/json
Accept: application/json
Return: minimal
Content-Length: 391
{
"DocumentKind": {"Id": 36},
"DocumentGroup": {"Id": 1},
"Subject":"Производственные площади",
"BusinessUnit": {"Id": 98},
"Department": {"Id": 96},
"ValidFrom": "2021-06-12T13:02:00Z",
"ValidTill": "2021-12-12T13:02:00Z",
"DaysToFinishWorks": 7,
"TotalAmount": 100500.55,
"IsAutomaticRenewal": true,
"Counterparty": {"Id": 1640}
}
В примере для заполнения свойств-ссылок таких как DocumentKind (Вид документа) используется упрощенный синтаксис, можно вместо него использовать синтаксис OData.
Запрос вернет ответ с кодом 201. В заголовке ответа Location будет указан URL созданной сущности с идентификатором (Id): https://DirectumRXServer.com/DrxIntegrationService/odata/IContracts(102).
Идентификатор понадобится во втором запросе, чтобы создать версию документа.
Второй POST-запрос для заполнения версии, т.е. свойства с типом Коллекция, строится так же, как при создании сущности. Особенности:
{Протокол https или http}://{имя сервера, на котором установлен сервис интеграции}/{имя сервиса интеграции}/odata/{Интерфейс типа сущности во множественном числе}(ИД)/{Имя свойства-коллекции}
Пример:
POST /DrxIntegration/odata/IContracts(102)/Versions HTTP/1.1
Host: DirectumRXServer.com
Username: Administrator
Password: 11111
Content-Type: application/json
Accept: application/json
Return: minimal
Content-Length: 56958
{
"Number": 1,
"Note": "Первоначальная версия",
"AssociatedApplication": {"Id": 2},
"Body": {
"Value": "UEsDBBQABgAIAOlKrFJMzYOS4wEAALQNAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA…
}
}
Таким образом мы создали договор в Directum RX.
Примеры запросов к функциям предлагаю посмотреть в справке: тут и тут. Если будут вопросы, пишите. У меня на этом все. Спасибо за внимание!
Написано:
Два. В среде разработки для типа документа «Договор» (Contract) из базового решения по умолчанию установлен флажок Использовать в сервисе интеграции. То есть никаких дополнительных настроек не требуется, идем дальше.
Вопрос: а где почитать про все подобные, готовые, преднастроенные штуки для которых "никаких настроек не требуется"?
Добрый день! Получить или создать сущность понятно, вопрос как обновить уже имеющуюся по ИД? Можно на примере постмана, если есть такая возможность в штатной поставке сервиса.
Тарас, для обновления используется точно такой же запрос, как для создания, только вместо POST, надо отправить PATCH запрос и указать ИД сущности, которую надо изменить.
Пример из справки:
У сотрудника с идентификатором 97 обновить свойства Телефон, Примечание и Email:
PATCH /DrxIntegration/odata/IEmployees(97) HTTP/1.1
Host: DirectumRXServer.com
Return: representation
Username: {Логин}
Password: {Пароль}
{
"Phone": "55-45-55",
"Note": "На испытательном сроке 2 месяца",
"Email": "Ivanov_IM@companymail.ru"
}
По примеру создания договора с версией.
Версия создается, но весит 0 байт, и ошибка при открытии "Нельзя заблокировать только что созданные бинарные данные, которые еще не были сохранены".
Что делать?
Доброго времени суток,
Возникло небольшое недопонимание с GET, возможно Вы сможете помочь.
Я создал функции в модуле, одна выполняет POST запрос, а вторая GET.
Так вот если с POST запросом проблем у меня никаких не возникло и записи создаются/обновляются без ошибок, то GET постоянно выдает ошибку 404. Я пробовал как со своими функциями, так и с теми, которые идут в базовом решении...
Никто не сталкивался с аналогичными проблемами?
POST с ответом 204 (так как я ничего не возвращаю по функции) - http://server/Integration/odata/MyModule/PostFunction
GET с ответом 404 - http://server/Integration/odata/MyModule/GetFunction(id=322) и http://server/Integration/MyModule/GetFunction(id=322), разницы нет...
Авторизуйтесь, чтобы написать комментарий