Обращение к веб-сервису 1С:Предприятия из .NET Framework

15 апреля 2014

Файлы для загрузки

Вместо предисловия

Решения на платформе 1С:Предприятие не единственные в своем роде. Есть другие учетные системы, созданные в том числе на платформе .NET Framework.

Далее в статье рассмотрим способ взаимодействия с веб-сервисами 1С:Предприятия 8 из приложений, написанных на .NET Framework. Также, кратко рассмотрим вопрос создания и публикации веб-сервиса 1С:Предприятия.

В конце статьи находятся ссылки для загрузки тестовой конфигурации 1С:Предприятия с веб-сервисом и пример .NET приложения.

Создание и публикация веб-сервиса

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

  1. "Веб-сервисы в 1С"
  2. "Публикация 1С на веб-сервере IIS 7.5"
  3. "Веб-сервисы в 1С" на сайте howknow1c.ru

Для того, чтобы сделать пример вызова веб-сервиса из .NET конкретным, опишем методы и типы веб-сервиса. Структура метаданных функционала веб-сервиса следующая:

Структура метаданных для реализации веб-сервиса. XDTO-пакет с описанием типов и объектов и веб-сервис.

Методы веб-сервиса управляют содержимым справочника "Контрагенты".

Справочник контрагенты. Используются стандартные реквизиты "Код" и "Наименование", а также ИНН и КПП

Метод "CreateOrUpdate" выполняет создание или модификацию существующего контрагента, "Delete" - удаляет контрагента по значению кода элемента, "GetList" - возвращает список объектов контрагентов.

В XDTO-пакете "Exchange" находится описание объекта "Contragent":

Содержимое XDTO-пакета. Объект "Contragent" и его свойства

Все свойства, кроме "ElementsContragents", имеют строковый тип данных. Вот так, например, выглядят настройки поля "Name":

Настройки свойства "Name" объекта "Contragent"

Каждое из свойств соответствует реквизиты справочника "Контрагенты". Поле "ElementsContragents" имеет тип объекта "Contragent", чтобы с его помощью можно было передавать список этих объектов. Максимальное количество передаваемых элементов в примере установил в 1000 объектов. Вот настройки этого свойства:

Настройки свойства "ElementsContragents" объекта для передачи списка

На следующем листинге продемонстрирован обработчик метода "GetList", возвращающий список объектов "Contragent":

Функция GetList() 
 // Создаем объект XDTO с типом "Contragent" 
 ТипXDTO_Товар = ФабрикаXDTO.
  Тип("http://www.develplatform.com/ExchangeTypes","Contragent");
 КорневойЭлемент = ФабрикаXDTO.Создать(ТипXDTO_Товар);
 КорневойЭлемент.Name = "List of contragents";
 
 Запрос = Новый Запрос;
 Запрос.Текст = 
  "ВЫБРАТЬ
  | Контрагент.Наименование,
  | Контрагент.ИНН,
  | Контрагент.КПП,
  | Контрагент.Код
  |ИЗ
  | Справочник.Контрагент КАК Контрагент";
 Результат = Запрос.Выполнить(); 
 ВыборкаДетальныеЗаписи = Результат.Выбрать();  
 
 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл   
  // В свойство "ElementsContragents" записываем список
  // объектов "Contragent"  
  Элемент = ФабрикаXDTO.Создать(ТипXDTO_Товар);
  Элемент.Name = ВыборкаДетальныеЗаписи.Наименование;
  Элемент.INN = ВыборкаДетальныеЗаписи.ИНН; 
  Элемент.KPP = ВыборкаДетальныеЗаписи.КПП;
  Элемент.Code = ВыборкаДетальныеЗаписи.Код;
  КорневойЭлемент.ElementsContragents.Добавить(Элемент);    
 КонецЦикла;
 
 Возврат КорневойЭлемент;   
КонецФункции

Далее перейдем непосредственно к теме статьи и рассмотрим пример вызова веб-сервиса 1С:Предприятия 8.x из .NET Framework.

Вызов из .NET Framework

Для примера было написано небольшое .NET приложение, демонстрирующее использование всех методов веб-сервиса.

.NET-приложение для взаимодействия с веб-сервисом 1C:Предприятия

На следующем видео продемонстрирована работа этого приложения.

Подробно описывать его реализацию не будем, опишу лишь пример вызова метода "GetList".

BasicHttpBinding myBinding = new BasicHttpBinding();
// Проверку подлинности клиента выполняется только посредством HTTP
myBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
// Настраиваем конечную точку веб-сервиса
EndpointAddress ea = new EndpointAddress(@"http://127.0.0.1/Clients/ws/integration.1cws");
IntegrationPortTypeClient Service = new IntegrationPortTypeClient(myBinding, ea);
// Устанавливаем логин и пароль пользователя информационной базы 1С:Предприятия
// от имени которого будет выполняться вызов методов веб-сервиса
Service.ClientCredentials.UserName.UserName = "Admin";
Service.ClientCredentials.UserName.Password = "Admin";
// Получаем список контрагентов методом "GetList"
Contragent res = Service.GetList();
// Если список не пустой, то обрабатываем его, заполняя таблицу на форме
if (res.ElementsContragents != null)
{
    foreach (Contragent cn in res.ElementsContragents)
    {
        int inxRow = dataGridViewContragents.Rows.Add();
        var cells = dataGridViewContragents.Rows[inxRow].Cells;
        cells ["rowCode"].Value = cn.Code.ToString();
        cells ["rowName"].Value = cn.Name.ToString();
        cells ["rowINN"].Value = cn.INN.ToString();
        cells ["rowKPP"].Value = cn.KPP.ToString();
    }
}

Используется HTTP-аутентификация по данным пользователя информационной базы 1С:Предприятия. Выполнять аутентификацию можно некоторыми другими способами, но тогда придется выполнять сложные настройки. Например, если использовать аутентификацию посредством сертификатов, то его нужно будет устанавливать и настраивать, чтобы в конечном счете платформа его увидела.

Проект VS2012 приложения Вы можете скачать по ссылке в конце статьи. В зависимости от настроек веб-сервера и параметров публикации веб-сервиса нужно будет внести изменения в приложение.

Заключение

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


comments powered by Disqus