Интеграция DirectumRX с 1С при помощи веб-сервисов

32 2

На проектах внедрения возникает необходимость интеграции DirectumRX и системы 1С.

Существует 2 основных способа интеграции: коннектор 1С и веб-сервисы.

Для интеграции при помощи веб-сервисов реализуются:

  1. Веб-сервис на стороне 1С, основанный на архитектуре SOAP. Данный механизм разработки веб-сервиса заложен в механизм платформы 1С. Веб-сервис используется для отправки и получения данных из 1С.
  2. Веб-сервис на стороне DirectumRX (WebApi), основанный на архитектуре REST.  Веб-сервис используется для отправки и получения данных из DirectumRX.

В каких случаях необходимо использовать коннектор 1С:

  1. Синхронизируются только справочники 1С.
  2. Потребности интеграции c 1C не противоречат ограничениям коннектора. К ограничениям относится синхронизация документов, обращение к записям регистров, использование табличной части и пр. Более подробно ограничения описаны в документе «Разработка правил синхронизации DirectumRX и 1C» поставки SDK коннектора 1С.

Трудоемкость разработки интеграции с 1С при помощи коннектора 1С меньше, чем трудоемкость разработки с использованием веб-сервиса, потому что есть SDK и примеры интеграции с 1С.

В каких случаях необходимо использовать веб-сервис на стороне 1С:

  1. Не удается реализовать интеграцию при помощи коннектора 1С из-за его ограничений.
  2. Заказчика не удовлетворяет интеграция с системой 1С через COM-соединение.

В рамках этой статьи мы будем рассматривать только веб-сервис на стороне 1С.

Ниже приведена принципиальная схема взаимодействия.


 

Алгоритм реализации веб-сервиса

Проектирование

  1. Проработка архитектуры интеграции.
  2. Транспортный уровень.

Реализация

  1. Веб-сервис на стороне 1С.
  2. Реализация .Net обертки над веб-сервисом.
  3. Использование .Net обертки в прикладном коде.

Проектирование

Проработка архитектуры интеграции

На этом уровне необходимо определить, в каких экземплярах 1С будут реализованы веб-сервисы. Так же необходимо определить количество веб-сервисов, сигнатуру методов, типы параметров методов.

Стоит обратить на следующие способы реализации веб-сервиса:

  1. Асинхронно. В этом случае веб-сервис сохраняет во временную таблицу 1С транспортные данные и затем асинхронно обрабатывает эти данные.
  2. Синхронно. В этом случае веб-сервис 1С «на лету» обрабатывает транспортный контейнер и сразу возвращает ответ вызова метода.

Транспортный уровень

На этом уровне прорабатываются формат передачи данных. В транспортных данных может содержаться или информация о сущностях или тела документов. Тела документов передаем в виде base64 строки.

При реализации веб-сервиса нет готовых шаблонов передачи данных. В случае сложного формата данных, можно спроектировать и реализовать контейнер с информацией о сущностях. Содержимое данного контейнера определяют между собой разработчик DirectumRX и разработчик 1С, который будет реализовывать веб-сервис. Контейнер можно передавать в виде строкового параметра в веб-сервис.

Пример контейнера, который содержит входящие счета.

<invoices>
<invoice>
<id>ИД входящего счета DirectumRX</id>
<number>Номер счета</number>
<date>Дата счета</date>
<subject>Содержание счета</subject>
<Counterparty>UUID записи 1с контрагента</Counterparty>
<VAT>10</VAT>
<Currency>Код валюты в 1с</Currency>
<BusinesInitINN>ИНН нашей организации</BusinesInitINN>
<BusinesInitKPP>КПП нашей организации</BusinesInitKPP>
<BudgetLines>
<BudgetLine>
<Project>UUID записи 1с проекта.</Project>
<Line>UUID записи 1с статьи движения денежных средств.</Line>
<Cfr>UUID записи 1с ЦФО</Cfr>
<Sum>Сумма средств по данной статье.</Sum>
</BudgetLine>
<BudgetLine>
<Project>UUID записи 1с проекта.</Project>
<Line>UUID записи 1с статьи движения денежных средств.</Line>
<Cfr>UUID записи 1с ЦФО</Cfr>
<Sum>Сумма средств по данной статье.</Sum>
</BudgetLine>
</BudgetLines>
<invoice>
<invoices>

Реализация

Веб-сервис на стороне 1С

Веб-сервис 1С, как правило, реализуется разработчиками 1С со стороны заказчика.

По окончанию разработки веб-сервиса разработчик 1С присылает разработчику DirectumRX или файл с wsdl-схемой (в случае отсутствия доступа к локальной сети заказчика с веб-сервисом), или ссылку на веб-сервис.

Для того, чтобы получить wsdl-схему из веб-сервиса, необходимо добавить к ссылке на веб-сервис “?wsdl”. Пример: http://server1c/upp_copy/ws/ws1.1cws?wsdl

.Net обертка над веб-сервисом

Данная обертка необходима для того, чтобы можно было вызывать из прикладного кода методы веб-сервиса.

Разработку обертки необходимо вести в Visual Studio.

Основные шаги:

  1. Создать новый проект. Тип проекта Class Library. Выбрать платформу .NET Framework 4.5.
  2. Добавить в Reference ссылку на wsdl-схему, предоставленную разработчиком 1С.


 

По окончанию добавления wsdl-схемы будут автоматически созданы транспортные классы.

  1. Выбрать вариант вызова аутентификации в .Net обертке.

Способ аутентификации веб-сервиса определяется политикой безопасности системы 1С. Ниже приведены популярные способы аутентификации.

Анонимная. В этом способе логин и пароль не задается.

По логину и паролю.

Пример кода

    var binding = new BasicHttpBinding();
    binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
    client1C = new InvoiceExportService1C.Web_DirectumPortTypeClient(binding, new         EndpointAddress(url));     
    client1C.ClientCredentials.UserName.UserName = userName;
    client1C.ClientCredentials.UserName.Password = password;

Win-аутентификация

    var binding = new BasicHttpsBinding();     
    ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, slPolicyErrors) => true;
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
    client1C = new PIR.DirectumPortTypeClient(binding, new EndpointAddress(url));           
    client1C.ClientCredentials.Windows.ClientCredential.Domain = domain;
    client1C.ClientCredentials.Windows.ClientCredential.UserName = userName;
    client1C.ClientCredentials.Windows.ClientCredential.Password = password;     
    client1C.ClientCredentials.Windows.AllowedImpersonationLevel = okenImpersonationLevel.Impersonation;
  1. Реализация класса обертки вызова-веб сервиса 1С. В описанном примере ниже на стороне 1С реализовано 2 метода GetPaymentListRx и SetInterChangePacket.
public class Service1CWrapper
    {
    /// <summary>
    /// Клиент 1С.
    /// </summary>
    Service1C.ObmenUPPPortTypeClient client1C = null;

    /// <summary>
    /// Вызов метода сервиса 1С по созданию платежных поручений.
    /// </summary>
    /// <param name="xmlData">Данные о входящес счете.</param>
    /// <param name="headerData">Заголовок.</param>
    /// <returns>Результат вызова функции.</returns>
    public string SetInterChangePacket(string xmlData, string headerData)
    {
      return client1C.SetInterChangePacket(xmlData, headerData);
    }

    /// <summary>
    ///  Вызов метода сервиса 1С по получению информации о статусе оплаты платежных поручений.
    /// </summary>
    /// <param name="beginDate">Дата начала периода.</param>
    /// <param name="endDate">Дата конца периода.</param>
    /// <returns>Xml строка с данными о платежных поручения.</returns>

    public string GetPaymentListRx(string beginDate, string endDate)
    {
      return client1C.GetPaymentListRx(beginDate, endDate);
    }

    /// <summary>
    /// Конструктор по умолчанию.
    /// </summary>
    /// <param name="url">Url веб-сервиса.</param>
    public Service1CWrapper(string url)
    {
      var binding = new BasicHttpBinding();
      client1C = new Service1C.ObmenUPPPortTypeClient(binding, new EndpointAddress(url));     
    }
  }

Использование .Net обертки в прикладном коде

Пример подключения  сторонних библиотек в прикладном коде описан справке.

Пример вызова обертки из прикладного кода

    try
    {
       DirRX.Service1CWrapper.Service1CWrapper service = new 
       DirRX.Service1CWrapper.Service1CWrapper(instance1C.Service1CLink);
       var result = service.GetPaymentListRx(beginDate, endDate);
    }

Основные рекомендации по использованию обертки в прикладном коде:

  1. Вызов .Net обертки вызывать в try catch.
  2. Реквизиты подключения к веб-сервису (гиперссылка, логин, пароль) необходимо хранить таким образом, чтобы не пришлось пересобирать пакет для заказчика в случае изменения реквизитов подключения. Пример такого решения – хранить во внешней xml данные настройки.
  3. Логировать как результаты вызова веб-сервиса, так и необходимые параметры.

Итоги

При помощи веб-сервиса на стороне 1С можно интегрировать 1С и DirectumRX. Так же при помощи веб-сервиса можно обойти ограничения, которые есть у коннектора 1С.

Преимуществом веб-сервиса является то, что его методы можно вызвать в прикладном событии. Например, при сохранении договора можно отправить этот договор в веб-сервис 1С. Для коннектора 1С  сеансы интеграции запускаются через определенные интервалы времени.

Благодарю за описание. 
А появятся ли пошаговые примеры для уменьшения порога вхождения в эту тему?
Я понимаю что "Содержимое данного контейнера определяют между собой разработчик DirectumRX и разработчик 1С" и "При реализации веб-сервиса нет готовых шаблонов", но если появятся моменты, которые можно повторить в качестве изучения вопроса, и самим развить в рамках анализа. С этой информацией и оценка интеграции будет более качественная, и включатся в проект уже разработчик будет не с "пустыми руками".

Саят Казырханов

Добрый день! Если имеется 2 1с-ных сервера прод и тест. Функционал одинаковый. DLL для каждого сервера ведь нужно создавать отдельно? Можно ли создать одну универсальную DLL не привязанную к ip-адресам этих серверов?

Авторизуйтесь, чтобы написать комментарий