Благо ограничений на работу с веб-сервисами в ней нет.

Добавление Web-сервиса в метаданные

Открываем дерево конфигурации, ветка Общие , далее Web-сервисы , добавляем новый веб-сервис (назову его my_ws) и заполняем свойства как показано на рисунке.

Необходимо сделать несколько пояснений о свойствах веб-сервисов

  • Пакеты XDTO — в этом поле указывается список пакетов XDTO, типы которых могут использоваться в значении, которое возвращается в результате выполнения операций веб-сервиса.
  • URI пространства имен — это строка, которая задает URI пространства имен для данного веб-сервиса. Любой веб-сервис можно однозначно идентифицировать по сочетанию его имени и пространству имен. Необходимо четко понимать, что это свойство не имеет ничего общего ни с физическим адресом веб-сервера, ни с сайтом органицации и т.д. Это просто некий виртуальный адрес. Поэтому присваивать надо внятное имя, которое сможет рассказать, например, об области расположения и применения веб сервиса. В частности может присутствовать аббревиатура типовой конфигурации к которой веб-сервис относится.

Операции веб-сервиса

Чтобы обеспечить функционирование веб-сервиса, необходимо создать для него операции, которые будут выполнять определенные действия, а при необходимости и возвращать нужные данные.

В качестве примера создадим для нашего веб-сервиса операцию, которая будет возвращать классическую фразу «Привет мир!». Назовем ее Hello :

В модуле веб-сервиса создадим функцию ПриветМир() , ссылку на которую вставим в соответствующее свойство операции.

Функция ПриветМир() Возврат "Привет мир!" ; КонецФункции

Но у этой операции есть один недостаток. В нее нельзя передавать исходные данные. Для этих целей в операциях веб-сервисов используется подчиненные им объекты — Параметры .

Добавим еще одну операцию — HelloUsr , и создадим для нее параметр Name .

Эта операция будет у нас возвращать приветствие пользователю при помощи вызова вот такой функции:

Функция ПриветПользователь(ИмяПользователя) Возврат "Привет, " + ИмяПользователя + "!" ; КонецФункции

Публикация Web-сервиса

Теперь у нас все готово для публикации веб-сервиса. Для этого необходимо зайти в конфигуратор под правами администратора. Щелкаем по ярлыку 1С правой кнопкой и выбираем соответствующий пункт меню:

В меню выбираем Администрирование —> Публикация на веб-сервере

В открывшемся окне прописываем имя публикации, отмечаем пункт Публиковать Web-сервисы и также отмечаем созданный нами веб-сервис:

WS-ссылки

Для работы с веб-сервисами используется такой объект 1С как WS-ссылка . Она представляет собой WSDL описание веб-сервиса полученное путем импорта из источника на котором расположен веб-сервис. То есть в первую очередь нам надо знать адрес по которому мы сможем получить WSDL описание веб-сервиса. Применительно к нашему примеру в соответствии с настройками, которые мы делали в процессе создания и публикации веб-сервиса этот адрес будет выглядеть следующим образом

Http://localhost/professia1c/ws/my_ws.1cws?wsdl

Рассмотрим из каких же частей состоит этот адрес.

  • http://localhost/ — это адрес указывает на физическое расположение веб-сервера. Так как у меня он находится на локальной машине, то localhost, а на практике это либо IP-адрес сервера, либо его имя
  • professia1c — это имя публикации. Мы его вводили в поле Имя в диалоговом окне, когда публиковали веб-сервис
  • ws — признак того, что мы обращаемся к веб сервису
  • my_ws.1cws — имя файла публикации, которое мы указывали в свойствах при создании веб-сервиса
  • ?wsdl — параметр, который указывает, что нам нужно получить WSDL описание

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

  1. Использование динамической ws-ссылки.
  2. Создание статической ws-ссылки.

Рассмотрим каждый из этих способов

Динамические WS-ссылки

&НаСервере Процедура ПодключитьсяНаСервере() ВСОпределение = Новый WSОпределения("http://localhost/professia1c/ws/my_ws.1cws?wsdl" , "Сидоров" , "" ) ; ВСПрокси = Новый WSПрокси(ВСОпределение, "http://www.сайт/" , "my_ws" , "my_wsSoap" ) ; ВСПрокси. Пользователь = "Сидоров" ; ВСПрокси. Пароль = "" ; ТекстВС = ВСПрокси. HelloUsr("Вася" ) ; Сообщение = Новый СообщениеПользователю; Сообщение. Текст = ТекстВС; Сообщение. Сообщить() ; КонецПроцедуры

Как нетрудно догадаться, результатом выполнения этой процедуры будет текст в окне сообщения «Привет, Вася!»

Статические WS-ссылки

Вместо программного создания объекта WSОпределения мы можем непосредственно в дереве конфигурации создать объект метаданных WS-ссылка. В процессе создания будет выведено окно с предложением указать адрес WSDL определения для его импорта:

После этого мы можем в коде ссылаться непосредственно на эту WS-ссылку. И процедура по обращению к веб-сервису примет вот такой вид:

&НаСервере Процедура ПодключитьсяЧересСсылкуНаСервере() ВСПрокси = WSСсылки. WSСсылка_my_ws. СоздатьWSПрокси("http://www.сайт/" , "my_ws" , "my_wsSoap" ) ; ВСПрокси. Пользователь = "Сидоров" ; ВСПрокси. Пароль = "" ; ТекстВС = ВСПрокси. HelloUsr("Вася" ) ; Сообщение = Новый СообщениеПользователю; Сообщение. Текст = ТекстВС; Сообщение. Сообщить() ; КонецПроцедуры

Печать (Ctrl+P)

Механизм Web-сервисов в системе «1С:Предприятие» является средством поддержки сервисно-ориентированной архитектуры (Service-Oriented Architecture, SOA).
Сервисно-ориентированная архитектура представляет собой прикладную архитектуру, в которой все функции определены как независимые сервисы с вызываемыми интерфейсами. Обращение к этим сервисам в определенной последовательности позволяет реализовать тот или иной бизнес-процесс.
Сервисно-ориентированная архитектура предлагает новый подход к созданию распределенных информационных систем, в которых программные ресурсы рассматриваются как сервисы, предоставляемые по сети. Такой подход позволяет обеспечить быструю консолидацию распределенных компонентов (сервисов) в единое решение для поддержки определенных бизнес-процессов.
Механизм Web-сервисов позволяет использовать систему «1С:Предприятие» как набор сервисов в сложных распределенных и гетерогенных системах, а также позволяет интегрировать ее с другими промышленными системами с использованием сервисно-ориентированной архитектуры.
Конфигурация системы «1С:Предприятие» может экспортировать свою функциональность через Web-сервисы. Определения Web-сервисов задаются в дереве конфигурации и становятся доступны произвольным информационным системам благодаря публикации их на веб-сервере.
Кроме этого, система «1С:Предприятие» может обращаться к Web-сервисам сторонних производителей как через статические ссылки, определенные в дереве конфигурации, так и с помощью динамических ссылок, создаваемых средствами встроенного языка. Рис. 1. Web-сервисы

В основе сервисной архитектуры системы «1C:Предприятие 8» находится менеджер сервисов. Менеджер сервисов выполняет следующие функции:
● управление пулом соединений с информационными базами;
● поддержка WSDL описания сервиса;
● реализация протокола SOAP, сериализация сообщений, вызов соответствующего сервиса.
Менеджер сервисов выполняется в процессе сервисного хоста, который выполняет функцию приема/передачи сообщений из/в менеджер сервисов. В качестве сервисного хоста может использоваться веб-сервер IIS или Apache.
Менеджер сервисов содержит в себе пул соединений, через которые идет взаимодействие с базами данных системы «1С:Предприятие».
Механизм Web-сервисов, реализованный в системе «1С:Предприятие», поддерживает следующие стандарты:
● SOAP 1.1,
● SOAP 1.2,
● WSDL 1.1,
● WS-I Basic Profile 1.1,
● HTTP 1.1,
● TLS 1.x (TLS 1.1 и 1.2 поддерживаются, если не требуется передача клиентского сертификата на сервер), включая криптографические алгоритмы,
соответствующие ГОСТ Р 34.10-2001, Р 34.10-94, Р 34.11-94 и 28147-89;
● MTOM;
● Аутентификация: Basic, NTLM/Negotiate.

Для получения доступа к Web-сервису необходимо использовать адрес, который формируется следующим образом:

http://host/base/ws/ИмяWebСервиса

Http://host/base/ws/АдресWebСервиса .

Более подробно рассмотрим составные части адреса:

http://host/base – обычный URL, по которому выполняется доступ, например, к информационной базе с помощью веб-клиента. При наличии разделителей, не поддерживается указание значений разделителей с помощью параметра Z командной строки запуска клиентского приложения.

ws – признак того, что выполняется обращение к Web-сервису (в отличие от hs, который определяет доступ к HTTP-сервису, см. здесь).

ИмяWebСервиса – имя Web-сервиса. Задается в свойстве объекта Web-сервис.

АдресWebСервиса – описывает альтернативное имя для доступа к Web-сервису. Задается в свойстве Имя файла публикации объекта Web-сервис.Может быть изменено при публикации Web-сервиса.

Обращения по имени ИмяWebСервиса и адресу АдресWebСервиса Web-сервиса являются равносильными.

Предоставление функциональности через Web-сервисы

Для того чтобы функциональность системы «1С:Предприятие» стала доступна внешним потребителям Web-сервисов, нужно выполнить следующие действия:
● создать в конфигурации необходимое количество Web-сервисов,
● опубликовать Web-сервисы с помощью специального инструмента конфигуратора.
Описание процедуры публикации Web-сервисов и описание использования Reverse Proxy для доступа к «1С:Предприятию» написано главе 7 “Руководство администратора” на диске ИТС.
Создание Web-сервиса заключается:
● в добавлении в дерево метаданных объекта конфигурации Web-сервис,
● описании операций, которые может выполнять создаваемый Web-сервис,
● описании параметров операций Web-сервиса.
Объект конфигурации Web-сервис содержит модуль, в котором создаются процедуры на встроенном языке, выполняемые при вызове тех или иных операций Web-сервиса. Типы параметров операций Web-сервиса описываются с помощью типов XDTO и могут представлять собой либо значения XDTO, либо объекты XDTO.
Вызов Web-сервиса происходит следующим образом:
● из пула соединений выбирается подходящее соединение с информационной базой; при отсутствии необходимого соединения соединение создается;
● создается новый сеанс и для созданного сеанса вызывается событие УстановкаПараметровСеанса (в модуле сеанса);
● выполняется вызов затребованного метода Web-сервиса, при этом происходит вызов обработчика УстановкаПараметровСеанса() (в модуле сеанса) каждый раз, когда происходит обращение к не инициализированному параметру сеанса.
СОВЕТ. Не рекомендуется выполнять ресурсоемкие операции в обработчике события УстановкаПараметровСеанса .
Событие УстановкаПараметровСеанса модуля сеанса вызывается на сервере в привилегированном режиме. Модуль вызванного сервиса исполняется на
сервере в обычном режиме.
Модуль сеанса служит для инициализации параметров сеанса и выполнения некоторого набора команд при вызове любого Web-сервиса системы «1С:Предприятие».

Пример реализации Web-сервиса

Например, требуется создать Web-сервис системы «1С:Предприятие», который должен по переданному номеру расходной накладной возвращать состав ее табличной части. Аналогичный пример с помощью HTTP-сервисов будет рассмотрено в другой статьи.
Для описания возвращаемого значения создадим пакет XDTO ДанныеРасходнойНакладной с пространством имен http://www.MyCompany.ru/shipment, содержащий три типа объектов XDTO:
● Номенклатура – для передачи данных элемента справочника Номенклатура. Этот тип объекта XDTO будет содержать следующие свойства:
● Наименование – тип string из пространства имен
ПолноеНаименование – тип string из пространства имен http://www.w3.org/2001/XMLSchema;
● ШтрихКод – тип string из пространства имен http://www.w3.org/2001/XMLSchema;
● ЗакупочнаяЦена – тип int из пространства имен http://www.w3.org/2001/XMLSchema.
СтрокаРасходнойНакладной – для передачи данных одной строки расходной накладной. Этот тип объекта XDTO будет содержать следующие свойства:
● Номенклатура – тип Номенклатура из пространства имен ; представляет собой ссылку на объект XDTO,
который мы определили выше;
● Количество – тип int из пространства имен http://www.w3.org/2001/XMLSchema;
● Цена – тип int из пространства имен http://www.w3.org/2001/XMLSchema;
● Сумма – тип int из пространства имен http://www.w3.org/2001/XMLSchema.
РасходнаяНакладная – для передачи данных всех строк расходной накладной. Этот тип объекта XDTO будет содержать единственное свойство:
● Состав – тип СтрокаРасходнойНакладной из пространства имен http://www.MyCompany.ru/shipment . Представляет собой ссылку на объект XDTO,
который мы определили выше. Для того чтобы это свойство могло содержать неограниченное множество значений, необходимо установить его
свойство Верхняя граница в значение -1.
После того как необходимые типы XDTO созданы, следует добавить в конфигурацию новый Web-сервис ДанныеРасходнойНакладной со следующими значениями свойств:

URI Пространства имен – http://www.MyCompany.ru/shipment ;
● Пакеты XDTO – ДанныеРасходнойНакладной ;
Имя файла публикации – shipment.1cws .
У созданного Web-сервиса следует определить операцию Получить со следующими значениями свойств:
Тип возвращаемого значения РасходнаяНакладная из пространства имен http://www.MyCompany.ru/shipment ;
Возможно пустое значение – установлен;
● Имя процедуры – Получить .
У операции Получить следует определить параметр НомерДокумента со следующими значениями свойств:
● Тип значения – тип string из пространства имен http://www.w3.org/2001/XMLSchema;
Направление передачи – Входной .
После этого следует открыть модуль созданного Web-сервиса и разместить в этом модуле функцию Получить() , которая будет выполняться при вызове данного Web-сервиса.

Функция Получить (НомерДокумента) Экспорт // Получить объект расходной накладной по переданному номеру ДокументСсылка = Документы.РасходнаяНакладная. НайтиПоНомеру(НомерДокумента, ТекущаяДата()); Если ДокументСсылка.Пустая() Тогда Возврат Неопределено; КонецЕсли; Документ = ДокументСсылка.ПолучитьОбъект() ; // Получить типы объектов XDTO НоменклатураТип = ФабрикаXDTO.Тип ("http://www.MyCompany.ru/shipment", "Номенклатура"); РасходнаяНакладнаяТип = ФабрикаXDTO.Тип ("http://www.MyCompany.ru/shipment", "РасходнаяНакладная"); СтрокаРасходнойНакладнойТип = ФабрикаXDTO.Тип ("http://www.MyCompany.ru/shipment", "СтрокаРасходнойНакладной"); // Создать объект XDTO расходной накладной РасходнаяНакладная = ФабрикаXDTO.Создать (РасходнаяНакладнаяТип); Для Каждого СтрокаДокумента Из Документ.Состав Цикл // Создать объекты XDTO строки расходной накладной // и номенклатуры СтрокаРасходнойНакладной = ФабрикаXDTO .Создать(СтрокаРасходнойНакладнойТип); Номенклатура = ФабрикаXDTO.Создать (НоменклатураТип); // Заполнить свойства номенклатуры Номенклатура.Наименование = СтрокаДокумента.Номенклатура.Наименование; Номенклатура.ПолноеНаименование = СтрокаДокумента.Номенклатура.ПолноеНаименование; Номенклатура.ШтрихКод = СтрокаДокумента.Номенклатура.ШтрихКод; Номенклатура.ЗакупочнаяЦена = СтрокаДокумента.Номенклатура.ЗакупочнаяЦена; // Заполнить свойства строки расходной накладно й СтрокаРасходнойНакладной.Номенклатура = Номенклатура; СтрокаРасходнойНакладной.Количество = СтрокаДокумента.Количество; СтрокаРасходнойНакладной.Цена = СтрокаДокумента.Цена; СтрокаРасходнойНакладной.Сумма = СтрокаДокумента.Сумма; // Добавить строку расходной накладной РасходнаяНакладная.Состав.Добавить (СтрокаРасходнойНакладной); КонецЦикла; // Вернуть расходную накладную Возврат РасходнаяНакладная ; КонецФункции

Работа с веб-сервисами сторонних поставщиков

Система «1С:Предприятие» может использовать веб-сервисы, предоставляемые другими поставщиками, несколькими способами:
● с помощью статических ссылок, создаваемых в дереве конфигурации;
● с помощью динамических ссылок, создаваемых средствами встроенного языка;
● комбинацией предыдущих способов.
Преимущество использования статических ссылок заключается в большей скорости работы, т. к. описание веб-сервиса поставщика получается один раз, при создании ссылки. В дальнейшем при обращении к данному веб-сервису используется существующее описание веб-сервиса.
При использовании динамических ссылок описание веб-сервиса поставщика будет получаться системой «1С:Предприятие» каждый раз при вызове веб-сервиса, что, естественно, будет замедлять работу с данным веб-сервисом. Однако преимуществом такого подхода является возможность получения актуального описания веб-сервиса поставщика. При использовании же статических ссылок для получения актуального описания веб-сервиса следует выполнить повторный импорт WSDL-описания средствами конфигуратора и сохранение измененной конфигурации.
При эксплуатации прикладных решений может возникать ситуация, когда один и тот же веб-сервис предоставляется по разным адресам (URL), однако имеет абсолютно одинаковое описание (WSDL). В этом случае возникает потребность загрузить описание веб-сервиса в конфигурацию (создать объект в дереве объектов конфигурации), но во время использования указать конкретный адрес, по которому расположен веб-сервис. Комбинированный способ позволяет работать таким образом. В качестве примера можно рассмотреть следующую ситуацию: есть тиражируемый веб-сервис, выполняющий
некоторую функцию. Прикладное решение, написанное на «1С:Предприятии», пользуется услугами данного сервиса, при этом адрес сервиса может быть различным (сервис тиражируемый), а описание – фиксированное. Тогда в прикладное решение может загрузить описание веб-сервиса, а в настройках прикладного решения предусмотреть ввод адреса конкретного экземпляра сервиса, который (адрес) и будет использоваться при работе.
Также доступно и другой способ: используется динамическая ссылка, но адрес расположения веб-сервиса получается не из файла описания (WSDL), а непосредственно указывается при создании объекта.
При попытке загрузить описание Web-сервиса в конфигураторе (создание статической ссылки) или при использовании динамической ссылки (при помощи объекта WSОпределения), система выполняет проверку загружаемого описания Web-сервиса (WSDL). Если в описании Web-сервиса присутствует ошибка (с «точки зрения» системы «1С:Предприятия»), то описание не будет загружено и будет сгенерировано исключение. В тексте исключения будет находиться подробная диагностика причин отказа в загрузке. Ошибки WSDL располагаются в порядке их обнаружения. Каждая ошибка WSDL содержит запись с детальным описанием следующего вида:

<Тип элемента с ошибкой>.<Имя>
[<Тип элемента с ошибкой>.<Имя>[…]]
<Описание ошибки>
<Тип элемента с ошибкой>
<Имя>
В этом описании:
● Тип элемента с ошибкой – тип элемента WSDL. Чаще всего соответствует имени тега в xml-файле, описывающем Web-сервис.
● Описание ошибки – описание конкретной ошибки.
● Имя – имя объекта WSDL, в котором произошла ошибка.

Пример использования статической WS-ссылки

В качестве примера использования веб-сервисов стороннего поставщика рассмотрим обращение к Web-сервису, который ранее был создан в примере выше

Прежде всего, следует добавить в дерево конфигурации новый объект конфигурации WS-ссылка с именем ДанныеРасходнойНакладной, ссылающийся на опубликованный сервис. Для этого следует выполнить импорт WSDL-описания опубликованного сервиса и в качестве URL указать http://www.MyCompany.ru/shipment/ws/Shipment.1cws?wsdl . Описание импорта WSDL-описания написано в другой статьи.
После этого, например, в модуле приходной накладной, можно создать процедуру, приведенную ниже. Она заполняет табличную часть документа данными расходной накладной поставщика, полученными с помощью веб-сервиса поставщика.

Процедура ПолучитьДанныеРасходнойНакладной (НомерНакладнойПоставщика) Прокси = WSСсылки.ДанныеРасходнойНакладной. СоздатьWSПрокси("http://www.MyCompany.ru/shipment", "ДанныеРасходнойНакладной", "ДанныеРасходнойНакладной"); ДанныеНакладной = Прокси.Получить() ; Если ДанныеНакладной = Неопределено Тогда Возврат; КонецЕсли; // Заполнить приходную накладную полученными данными Для Каждого СтрокаНакл Из ДанныеНакладной.Состав Цикл НоваяСтрока = ДокументОбъект.Состав.Добавить(); НоваяСтрока.Количество = СтрокаНакл.Количество; НоваяСтрока.Цена = СтрокаНакл.Цена; НоваяСтрока.Сумма = СтрокаНакл.Сумма; // Найти элемент номенклатуры по переданным данным // (например, по штрихкоду) НоваяСтрока.Номенклатура = Справочники.Номенклатура. НайтиПоРеквизиту ("ШтрихКод", СтрокаНакл.Номенклатура.ШтрихКод ); КонецЦикла; КонецПроцедуры

Если адрес реального расположения сервиса отличается от адреса, который использовался во время загрузки описания веб-сервиса в конфигурацию,
то новый адрес необходимо явно указать при создании объекта WSПрокси:

Пример использования динамической WS-ссылки

Использование динамической ссылки отличается от использования статической ссылки только способом создания WS-прокси и отсутствием необходимости создавать WS-ссылку в дереве конфигурации.
Если провести сравнение с примером, представленным в предыдущем разделе, то, в отличие от создания прокси на основе статической ссылки, при использовании динамической ссылки WS-прокси создается с помощью конструктора следующим образом:

// Создать WS-прокси на основании WS-определения
Определение = Новый WSОпределения (“http://www.MyCompany.ru/shipment/ws/Shipment.1cws?wsdl”);
Прокси = Новый WSПрокси (Определение , “http://www.MyCompany.ru/shipment”, “ДанныеРасходнойНакладной”, “ДанныеРасходнойНакладнойSoap”);
В то время как создание WS-прокси на основе статической ссылки выглядит следующим образом:

// Создать WS-прокси на основании ссылки
Прокси = WSСсылки.ДанныеРасходнойНакладной. СоздатьWSПрокси (“http://www.MyCompany.ru/shipment”, “ДанныеРасходнойНакладной”, “ДанныеРасходнойНакладной”);
Если адрес реального расположения сервиса отличается от адреса, который указан в WSDL-файле, используемом при создании определения веб-сервисов, новый адрес необходимо явно указать при создании объекта WSПрокси на основании определения веб-сервисов:

// Создать WS-прокси на основании WS-определения Определение = Новый SОпределения ("http://www.MyCompany.ru/shipment/ws/Shipment.1cws?wsdl"); Прокси = Новый WSПрокси (Определение , "http://www.MyCompany.ru/shipment", "ДанныеРасходнойНакладной", "ДанныеРасходнойНакладнойSoap",);

Редактирование свойств Web-сервиса

На закладке Основные вводится имя, синоним и комментарий объекта.
На закладке Операции создаются подчиненные объекты Операции, которые, в свою очередь, могут иметь подчиненные объекты Параметры, необходимые для работы с объектами данного типа. Описание подчиненных объектов выполняется в палитре свойств.

Свойства «Операции»

Помимо общих свойств объектов конфигурации операция Web-сервиса содержит следующие свойства:

● Тип возвращаемого значения – тип значения, которое возвращает операция Web-сервиса. Может являться типом значения XDTO или типом объекта
XDTO.
● Возможно пустое значение – показывает, может ли возвращаемое значение принимать неопределенное значение.
● В транзакции – показывает, будет ли выполняться код модуля Web-сервиса в транзакции или нет. Если свойство установлено, то при вызове Web-сервиса автоматически будет начата транзакция, а при завершении работы Web-сервиса транзакция будет либо зафиксирована, либо произойдет откат транзакции (в зависимости от результатов выполнения). Если свойство не установлено, при начале исполнения модуля Web-сервиса
транзакция не будет начата.
● Имя метода – имя экспортируемой процедуры модуля Web-сервиса, которая будет выполнена при вызове данного свойства.
На закладке Подсистемы указывается, к каким подсистемам относятся объекты данного типа.
На закладке Прочее определяются следующие свойства:
● URI пространства имен – содержит URI пространства имен Web-сервиса. Каждый Web-сервис может быть однозначно идентифицирован по своему
имени и URI пространству имен, которому он принадлежит. Пространство имен сервиса не должна совпадать с известными пространствами имен, которые уже используются или зарезервированы другими организациями. Рекомендуется в пространство имен сервиса включать фрагмент, уникальный для организации, которая ведет разработку Web-сервиса. Например, для организации с названием Промресурс имеет смысл начинать все пространства имен с префикса, например, http://promresurs.com. Тогда URI пространства имен Web-сервиса будет иметь вид http://promresurs.com/public/services/OurService.
● Пакеты XDTO – перечень пакетов XDTO, типы которых могут использоваться в качестве типов возвращаемого значения операций и типов параметров операций Web-сервиса.
● Имя файла публикации – имя файла описания Web-сервиса, который расположен на веб-сервере.
По кнопке Модуль открывается редактор модуля Web-сервиса.

Свойства «Параметр»
Помимо общих свойств объектов конфигурации параметр операции Web-сервиса содержит следующие свойства:
● Тип значения – тип значения параметра операции Web-сервиса. Может являться типом значения XDTO или типом объекта XDTO.
● Возможно пустое значение – показывает, может ли значение параметра операции принимать неопределенное значение.
● Направление передачи – определяет направление передачи данных с помощью данного параметра. Возможные значения:
● Входной – означает, что параметр используется для передачи данных Web-сервису;
● Выходной – означает, что параметр используется для получения данных от Web-сервиса;
● Входной-Выходной – означает, что параметр может использоваться как для передачи данных, так и для их получения от Web-сервиса.

Заголовок топика – это действительно вопрос, т.к. я сам не знаю, что это и впервые попробую поработать с этим в рамках настоящей статьи. Единственное, что могу гарантировать, что код, представленный ниже, будет работать, однако мои фразы будут лишь предположениями и догадками о том, как я сам все это понимаю. Итак, поехали…

Введение

Начать надо с того, для чего создавалась концепция веб-сервисов. К моменту появления этого понятия в мире уже существовали технологии, позволяющие приложениям взаимодействовать на расстоянии, где одна программа могла вызвать какой-нибудь метод в другой программе, которая при этом могла быть запущена на компьютере, расположенном в другом городе или даже стране. Все этого сокращенно называется RPC (Remote Procedure Calling – удаленный вызов процедур). В качестве примеров можно привести технологии CORBA, а для Java – RMI (Remote Method Invoking – удаленный вызов методов). И все вроде в них хорошо, особенно в CORBA, т.к. с ней можно работать на любом языке программирования, но чего-то все же не хватало. Полагаю, что минусом CORBA является то, что она работает через какие-то свои сетевые протоколы вместо простого HTTP, который пролезет через любой firewall. Идея веб-сервиса заключалась в создании такого RPC, который будет засовываться в HTTP пакеты. Так началась разработка стандарта. Какие у этого стандарта базовые понятия:
  1. SOAP . Прежде чем вызвать удаленную процедуру, нужно этот вызов описать в XML файле формата SOAP. SOAP – это просто одна из многочисленных XML разметок, которая используется в веб-сервисах. Все, что мы хотим куда-то отправить через HTTP, сначала превращается в XML описание SOAP, потом засовывается в HTTP пакет и посылается на другой компьютер в сети по TCP/IP.
  2. WSDL . Есть веб-сервис, т.е. программа, методы которой можно удаленно вызывать. Но стандарт требует, чтобы к этой программе прилагалось описание, в котором сказано, что «да, вы не ошиблись – это действительно веб-сервис и можно у него вызвать такие-то такие-то методы». Такое описание представляется еще одним файлом XML, который имеет другой формат, а именно WSDL. Т.е. WSDL – это просто XML файл описания веб-сервиса и больше ничего.
Почему так кратко спросите вы? А по подробней нельзя? Наверное можно, но для этого придется обратиться к таким книгам как Машнин Т. «Web-сервисы Java». Там на протяжении первых 200 страниц идет подробнейшее описание каждого тега стандартов SOAP и WSDL. Стоит ли это делать? На мой взгляд нет, т.к. все это на Java создается автоматически, а вам нужно лишь написать содержимое методов, которые предполагается удалено вызывать. Так вот, в Java появился такой API, как JAX-RPC. Если кто не знает, когда говорят, что в Java есть такой-то API, это означает, что есть пакет с набором классов, которые инкапсулируют рассматриваемую технологию. JAX-RPC долго развивался от версии к версии и в конечном итоге превратился в JAX-WS. WS, очевидно, означает WebService и можно подумать, что это простое переименование RPC в популярное нынче словечко. Это не так, т.к. теперь веб-сервисы отошли от первоначальной задумки и позволяют не просто вызывать удаленные методы, но и просто посылать сообщения-документы в формате SOAP. Зачем это нужно я пока не знаю, вряд ли ответ здесь будет «на всякий случай, вдруг понадобится». Сам бы хотел узнать от более опытных товарищей. Ну и последнее, далее появился еще JAX-RS для так называемых RESTful веб-сервисов, но это тема отдельной статьи. На этом введение можно заканчивать, т.к. далее мы будем учиться работать с JAX-WS.

Общий подход

В веб-сервисах всегда есть клиент и сервер. Сервер – это и есть наш веб-сервис и иногда его называют endpoint (типа как, конечная точка, куда доходят SOAP сообщения от клиента). Нам нужно сделать следующее:
  1. Описать интерфейс нашего веб-сервиса
  2. Реализовать этот интерфейс
  3. Запустить наш веб-сервис
  4. Написать клиента и удаленно вызвать нужный метод веб-сервиса
Запуск веб-сервиса можно производить разными способами: либо описать класс с методом main и запустить веб-сервис непосредственно, как сервер, либо задеплоить его на сервер типа Tomcat или любой другой. Во втором случае мы сами не запускаем новый сервер и не открываем еще один порт на компьютере, а просто говорим контейнеру сервлетов Tomcat, что «мы написали тут классы веб-сервиса, опубликуй их, пожалуйста, чтобы все, кто к тебе обратиться, могли нашим веб-сервисом воспользоваться». В независимости от способа запуска веб-сервиса, клиент у нас будет один и тот же.

Сервер

Запустим IDEA и создадим новый проект Create New Project . Укажем имя HelloWebService и нажмем кнопку Next , далее кнопку Finish . В папке src создадим пакет ru.javarush.ws . В этом пакете создадим интерфейс HelloWebService: package ru. javarush. ws; // это аннотации, т.е. способ отметить наши классы и методы, // как связанные с веб-сервисной технологией import javax. jws. WebMethod; import javax. jws. WebService; import javax. jws. soap. SOAPBinding; // говорим, что наш интерфейс будет работать как веб-сервис @WebService // говорим, что веб-сервис будет использоваться для вызова методов @SOAPBinding (style = SOAPBinding. Style. RPC) public interface HelloWebService { // говорим, что этот метод можно вызывать удаленно @WebMethod public String getHelloString (String name) ; } В этом коде классы WebService и WebMethod являются так называемыми аннотациям и ничего не делают, кроме как помечают наш интерфейс и его метод, как веб-сервис. Это же относится и к классу SOAPBinding . Разница лишь в том, что SOAPBinding – это аннотация с параметрами. В данном случае используется параметр style со значением, говорящим, что веб-сервис будет работать не через сообщения-документы, а как классический RPC, т.е. для вызова метода. Давайте реализуем логику нашего интерфейса и создадим в нашем пакете класс HelloWebServiceImpl . Кстати, замечу, что окончание класса на Impl – это соглашение в Java, по которому так обозначают реализацию интерфейсов (Impl – от слова implementation, т.е. реализация). Это не требование и вы вольны назвать класс как хотите, но правила хорошего тона того требуют: package ru. javarush. ws; // таже аннотация, что и при описании интерфейса, import javax. jws. WebService; // но здесь используется с параметром endpointInterface, // указывающим полное имя класса интерфейса нашего веб-сервиса @WebService (endpointInterface = "ru.javarush.ws.HelloWebService" ) public class HelloWebServiceImpl implements HelloWebService { @Override public String getHelloString (String name) { // просто возвращаем приветствие return "Hello, " + name + "!" ; } } Запустим наш веб-сервис как самостоятельный сервер, т.е. без участия всяких Tomcat и серверов приложений (это тема отдельного разговора). Для этого в структуре проекта в папке src создадим пакет ru.javarush.endpoint , а в нем создадим класс HelloWebServicePublisher с методом main: package ru. javarush. endpoint; // класс, для запуска веб-сервера с веб-сервисами import javax. xml. ws. Endpoint; // класс нашего веб-сервиса import ru. javarush. ws. HelloWebServiceImpl; public class HelloWebServicePublisher { public static void main (String. . . args) { // запускаем веб-сервер на порту 1986 // и по адресу, указанному в первом аргументе, // запускаем веб-сервис, передаваемый во втором аргументе Endpoint. publish ("http://localhost:1986/wss/hello" , new HelloWebServiceImpl () ) ; } } Теперь запустим этот класс, нажав Shift+F10 . В консоли ничего не появится, но сервер запущен. В этом можно убедиться набрав в браузере строку http://localhost:1986/wss/hello?wsdl . Открывшаяся страница, с одной стороны, доказывает, что у нас на компьютере (localhost) запустился веб-сервер (http://) на порту 1986, а, с другой стороны, показывает WSDL описание нашего веб-сервиса. Если вы остановите приложение, то описание станет недоступно, как и сам веб-сервис, поэтому делать этого не будем, а перейдем к написанию клиента.

Клиент

В папке проекта src создадим пакет ru.javarush.client , а в нем класс HelloWebServiceClient с методом main: package ru. javarush. client; // нужно, чтобы получить wsdl описание и через него // дотянуться до самого веб-сервиса import java. net. URL; // такой эксепшн возникнет при работе с объектом URL import java. net. MalformedURLException; // классы, чтобы пропарсить xml-ку c wsdl описанием // и дотянуться до тега service в нем import javax. xml. namespace. QName; import javax. xml. ws. Service; // интерфейс нашего веб-сервиса (нам больше и нужно) import ru. javarush. ws. HelloWebService; public class HelloWebServiceClient { public static void main (String args) throws MalformedURLException { // создаем ссылку на wsdl описание URL url = new URL ("http://localhost:1986/wss/hello?wsdl" ) ; // Параметры следующего конструктора смотрим в самом первом теге WSDL описания - definitions // 1-ый аргумент смотрим в атрибуте targetNamespace // 2-ой аргумент смотрим в атрибуте name QName qname = new QName ("http://ws.javarush.ru/" , "HelloWebServiceImplService" ) ; // Теперь мы можем дотянуться до тега service в wsdl описании, Service service = Service. create (url, qname) ; // а далее и до вложенного в него тега port, чтобы // получить ссылку на удаленный от нас объект веб-сервиса HelloWebService hello = service. getPort (HelloWebService. class ) ; // Ура! Теперь можно вызывать удаленный метод System. out. println (hello. getHelloString ("JavaRush" ) ) ; } } Максимум комментариев по коду я дал в листинге. Добавить мне нечего, поэтому запускаем (Shift+F10). Мы должны в консоли увидеть текст: Hello, JavaRush! Если не увидели, то видимо забыли запустить веб-сервис.

Заключение

В данном топике был представлен краткий экскурс в веб-сервисы. Еще раз скажу, что многое из того, что я написал – это мои догадки по поводу того, как это работает, и поэтому мне не стоит сильно доверять. Буду признателен, если знающие люди меня поправят, ведь тогда я чему-нибудь научусь. UPD.

Web-сервисы - это один из механизмов платформы, используемых для интеграции с другими информационными системами . Он является средством поддержки SOA (Service-Oriented Architecture) - сервис-ориентированной архитектуры, которая является современным стандартом интеграции приложений и информационных систем.

Значительным преимуществом сервис - ориентированной архитектуры является то, что она позволяет развивать инфраструктуру предприятия однородным образом, без разрушения уже существующих решений. Ее использование позволяет минимизировать издержки за счет интеграции разнородных и унаследованных систем в современный ландшафт предприятия. Она позволяет реализовывать слабо связные программные компоненты с тем, чтобы максимально повысить их повторную используемость.

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

Прикладное решение 1С:Предприятия 8 может являться как поставщиком веб-сервисов, так и потребителем веб-сервисов, опубликованных другими поставщиками.

В качестве потребителей могут выступать системы, использующие произвольные аппаратные и программные платформы. Технология веб-сервисов является платформенно независимой.


Техническая реализация web-сервисов

Если прикладное решение является поставщиком веб-сервиса то и в файловом , и в клиент-серверном варианте работы взаимодействие между прикладным решением и потребителями веб-сервиса осуществляется через веб-сервер, с помощью модуля расширения веб-сервера.

При этом, когда потребитель обращается к web-сервису прикладного решения , выполняется модуль web-сервиса . Этот модуль содержится в конфигурации и в нем располагаются процедуры, выполняемые при вызове тех или иных операций web-сервиса.

В случае клиент-серверного варианта работы этот модуль будет исполняться в кластере . В случае файлового варианта работы - в модуле расширения веб-сервера.

Если прикладное решение является потребителем веб-сервиса стороннего поставщика, то в этом случае взаимодействие между прикладным решением и поставщиком веб-сервиса осуществляет

Мы рассмотрели общие понятия использования механизма « Web -сервисов». Освежим некоторые знания.

Web-сервисы применяются для обмена данными между сервером и клиентом; формат XML используется для «упаковывания» данных в целях взаимопонимания между обоими участниками общения.

РАЗДЕЛ I

ПРИМЕР РЕАЛИЗАЦИИ WEB -СЕРВИСА В СИСТЕМЕ «1С:ПРЕДПРИЯТИЕ»

ЗАДАЧА: Необходимо создать web-сервис, обращаясь к которому клиенты могут определить всю необходимую информацию по своим заявкам.

Задача является демонстрационной и служит только примером для понимания и обучения механизму web -сервисов.

РЕШЕНИЕ:

Шаг 1. Создадим новую информационную базу без конфигурации для разработки новой конфигурации.

Шаг 2. Добавим в конфигурацию несколько новых объектов

Справочник «Клиенты»;

Документ «Заявка»;

Перечисление «СтатусыЗаявок».

Шаг 3. Создадим новый XDTO-пакет.

Почему и для чего мы создаем XDTO-пакет? Подробнее об использовании механизма XDTO можно прочитать в «Глава 16. Руководство разработчика» и .

Коротко отметим лишь только то, что механизм XDTO является универсальным способом представления данных для взаимодействия с различными внешними источниками данных и программными системами.

В нашем случае пакет XDTO создается для описания возвращаемого значения web-сервиса.

Раскроем ветку «Общие» → «XDTO-пакеты» → Добавить…

Укажем имя XDTO-пакета «DocumentsData » и его пространство имен http://localhost/request или http://192.168.1.76/request (для облегчения понимания и процесса обучения, мы указываем локальный IP-адрес компьютера, где установлен web-сервер (поддерживаемые web-сервера: IIS или Apache)). Каждый Web-сервис может быть однозначно идентифицирован по своему имени и URI пространству имен, которому он принадлежит.

Наш пакет содержит два типа объектов XDTO:

1) Сustomer - для передачи данных элемента справочника «Клиенты».

- Name ;

2) Document - для передачи данных документа «Заявки»

Этот тип объекта XDTO будет содержать следующие свойства:

- Сustomer - тип Сustomer из пространства имен http://192.168.1.76/request ; представляет собой ссылку на объект XDTO, который мы определили выше;

- Status - тип string из пространства имен http://www.w3.org/2001/XMLSchema ;

- Numder - тип string из пространства имен http://www.w3.org/2001/XMLSchema .

Шаг 4. Добавим в конфигурацию новый Web-сервис

Раскроем ветку «Общие» → «Web-сервисы» → Добавить…

Для Web-сервиса укажем следующими значения свойств:

Имя - DocumentsData

URI Пространства имен - http://192.168.1.76/request

Пакеты XDTO - DocumentsData или http://192.168.1.76/request

Имя файла публикации - request.1cws

Шаг 5. У созданного Web-сервиса определим операцию «GetData »

Значения свойств операции:

Тип возвращаемого значения - Document (http://192.168.1.76/request)

Возможно пустое значение - Истина

Имя процедуры - GetData .

Шаг 6. У операции GetData определим параметр Сustomer со следующими значениями свойств:

Тип значения - тип string из пространства имен http://www.w3.org/2001/XMLSchema;

Направление передачи - входной .

Шаг 7. Откроем модуль созданного Web-сервиса и поместить в него функцию Получить(), которая будет выполняться при вызове данного Web-сервиса.

Функция GetData(Сustomer) // Получить типы объектов XDTO КлиентТип = ФабрикаXDTO.Тип("http://192.168.1.76/request", "Сustomer"); ЗаявкаТип = ФабрикаXDTO.Тип("http://192.168.1.76/request", "Document"); // Получаем клиента КлиентСсылка = Справочники.Клиенты.НайтиПоНаименованию(Сustomer); Если Не ЗначениеЗаполнено(КлиентСсылка) Тогда Возврат Неопределено; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | Заявка.Ссылка, | ПРЕДСТАВЛЕНИЕ(Заявка.Статус) КАК Статус, | Заявка.Номер |ИЗ | Документ.Заявка КАК Заявка |ГДЕ | Заявка.Клиент = &Клиент"; Запрос.УстановитьПараметр("Клиент", КлиентСсылка); РезультатЗапроса = Запрос.Выполнить(); Если РезультатЗапроса.Пустой() Тогда Возврат Неопределено; КонецЕсли; Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующий(); Документ = Выборка.Ссылка.ПолучитьОбъект(); // Создать объект XDTO заявки Заявка = ФабрикаXDTO.Создать(ЗаявкаТип); Заявка.Numder = Выборка.Номер; Клиент = ФабрикаXDTO.Создать(КлиентТип); Клиент.Name = КлиентСсылка.Наименование; Заявка.Сustomer = Клиент; Заявка.Status = Выборка.Статус; // Вернуть заявку Возврат Заявка; КонецФункции

Шаг 8. Опубликуем созданный Web-сервис на веб-сервере.

Пункт меню Конфигуратор: «Администрирование» → «Публикация на Web-сервере».

На вкладке «Web-сервисы» устанавливаем признак «Публиковать Web-сервисы» и напротив нашего нового Web-сервиса также ставим «галочку».

РАЗДЕЛ II

ПРИМЕР ОБРАЩЕНИЯ К WEB -СЕРВИСУ СИСТЕМЫ «1С:ПРЕДПРИЯТИЕ» ИЗ СТОРОННЕГО ПРИЛОЖЕНИЯ

Основное назначение механизма Web-сервисов в системе «1С:Предприятие» - это передача необходимых данных сторонним приложениям.

Рассмотрим пример разработки приложения на Delphi обращения к нашему web-сервису из первого раздела данной статьи.

Шаг 1. Создадим новый проект и на форме разместим несколько элементов управления

Текстовое поле - используется для вывода полученной от web-сервиса информации;

Две кнопки - очистка текстового поля и обращение к web-сервису;

Поле ввода - передаваемый в web-сервис параметр.

Шаг 2. Выполняем импорт WSDL-файла

В результате мы получаем новый модуль request (такое наименование мы определили непосредственно в 1С). В данном модуле имеется все необходимая информация по web-сервису.

Шаг 3. Напишем обработчик вызова web-сервиса

Переменная DocumentDataPortType уже определена в модуле request

Шаг 4. Запустить приложение и выполнить проверку.

РАЗДЕЛ III

ПРИМЕР ОБРАЩЕНИЯ К WEB -СЕРВИСУ В СИСТЕМЕ «1С:ПРЕДПРИЯТИЕ»

Шаг 1. Создадим новую внешнюю обработку с именем «WEB_Service»

Шаг 2. Для обработки определим новую форму

Шаг 3. У формы укажем несколько реквизитов

Клиент - тип «Строка»

КлиентВозврат - тип «Строка»

НомерВозврат - тип «Строка»

СтатусВозврат - тип «Строка».

Выведем реквизиты на форму.

Шаг 4. Добавим команду формы «ПолучитьДанные »

Укажем обработчик команды

&НаКлиенте Процедура ПолучитьДанные(Команда) ПолучитьДанныеНаСервере(Клиент); КонецПроцедуры Процедура ПолучитьДанныеНаСервере(Клиент) // Создать WS-прокси на основании ссылки и выполнить операцию Получить() Определение = Новый WSОпределения("http://192.168.1.76/WEB_Service/ws/request.1cws?wsdl"); Прокси = Новый WSПрокси(Определение, "http://192.168.1.76/request", "DocumentsData", "DocumentsDataSoap"); ДанныеЗаявки = Прокси.GetData(Клиент); Если ДанныеЗаявки = Неопределено Тогда КлиентВозврат = "Неопределено"; СтатусВозврат = "Неопределено"; НомерВозврат = "Неопределено"; Возврат; КонецЕсли; КлиентВозврат = ДанныеЗаявки.Сustomer.Name; СтатусВозврат = ДанныеЗаявки.Status; НомерВозврат = ДанныеЗаявки.Numder; КонецПроцедуры

Система «1С:Предприятие» может использовать веб-сервисы, предоставляемые другими поставщиками, двумя способами:

С помощью статических ссылок, создаваемых в дереве конфигурации;

«плюс»: большая скорость работы;

«минус»: повторный импорт WSDL-описания средствами конфигуратора и сохранение измененной конфигурации.

С помощью динамических ссылок, создаваемых средствами встроенного языка

(соответственно «минусы» статических для динамических - «плюсы»)

РАЗДЕЛ IV

ОТЛАДКА WEB-СЕРВИСОВ В СИСТЕМЕ «1С:ПРЕДПРИЯТИЕ»

Для локального web-сервиса необходимо:

Шаг 1. Положить на клиент, где запускается система 1С файлик webservicecfg.xml со следующим содержимом

Шаг 2. В файл default . vrd публикации конфигурации добавить строку

Шаг 3. В конфигураторе выбрать пункт меню

«Отладка» → «Подключение» → «Автоматическое подключение» → «Web-сервисы на сервере»

Шаг 4. Нажать на кнопку «OK»

Для серверного варианта надо еще сервер 1с запускать в режим отладки с ключом /debug


Close