На проектах внедрения возникает необходимость интеграции DirectumRX и системы 1С.
Существует 2 основных способа интеграции: коннектор 1С и веб-сервисы.
Для интеграции при помощи веб-сервисов реализуются:
В каких случаях необходимо использовать коннектор 1С:
Трудоемкость разработки интеграции с 1С при помощи коннектора 1С меньше, чем трудоемкость разработки с использованием веб-сервиса, потому что есть SDK и примеры интеграции с 1С.
В каких случаях необходимо использовать веб-сервис на стороне 1С:
В рамках этой статьи мы будем рассматривать только веб-сервис на стороне 1С.
Ниже приведена принципиальная схема взаимодействия.
Проектирование
Реализация
На этом уровне необходимо определить, в каких экземплярах 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С присылает разработчику DirectumRX или файл с wsdl-схемой (в случае отсутствия доступа к локальной сети заказчика с веб-сервисом), или ссылку на веб-сервис.
Для того, чтобы получить wsdl-схему из веб-сервиса, необходимо добавить к ссылке на веб-сервис “?wsdl”. Пример: http://server1c/upp_copy/ws/ws1.1cws?wsdl
Данная обертка необходима для того, чтобы можно было вызывать из прикладного кода методы веб-сервиса.
Разработку обертки необходимо вести в Visual Studio.
Основные шаги:
По окончанию добавления wsdl-схемы будут автоматически созданы транспортные классы.
Способ аутентификации веб-сервиса определяется политикой безопасности системы 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;
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;
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));
}
}
Пример подключения сторонних библиотек в прикладном коде описан справке.
Пример вызова обертки из прикладного кода
try
{
DirRX.Service1CWrapper.Service1CWrapper service = new
DirRX.Service1CWrapper.Service1CWrapper(instance1C.Service1CLink);
var result = service.GetPaymentListRx(beginDate, endDate);
}
Основные рекомендации по использованию обертки в прикладном коде:
При помощи веб-сервиса на стороне 1С можно интегрировать 1С и DirectumRX. Так же при помощи веб-сервиса можно обойти ограничения, которые есть у коннектора 1С.
Преимуществом веб-сервиса является то, что его методы можно вызвать в прикладном событии. Например, при сохранении договора можно отправить этот договор в веб-сервис 1С. Для коннектора 1С сеансы интеграции запускаются через определенные интервалы времени.
Благодарю за описание.
А появятся ли пошаговые примеры для уменьшения порога вхождения в эту тему?
Я понимаю что "Содержимое данного контейнера определяют между собой разработчик DirectumRX и разработчик 1С" и "При реализации веб-сервиса нет готовых шаблонов", но если появятся моменты, которые можно повторить в качестве изучения вопроса, и самим развить в рамках анализа. С этой информацией и оценка интеграции будет более качественная, и включатся в проект уже разработчик будет не с "пустыми руками".
Добрый день! Если имеется 2 1с-ных сервера прод и тест. Функционал одинаковый. DLL для каждого сервера ведь нужно создавать отдельно? Можно ли создать одну универсальную DLL не привязанную к ip-адресам этих серверов?
Авторизуйтесь, чтобы написать комментарий