Работа с Web-сервисами Terrasoft из внешних приложений. Web-сервисы Принимаем файл web сервисом 1с


Ключевые слова: web-сервис, веб-сервис, SOAP, WSDL, ws-ссылка

Дисклеймер и условия использования

Все случайно упомянутые в статье торговые марки принадлежат своим владельцам.
Статья опубликована под лицензией Creative Commons Attribution-Share Alike 3.0 Unported License. http://creativecommons.org/licenses/by-sa/3.0/

Ещё один дисклеймер (спустя многие времена)

Платформа "1С:Предприятие 8" постоянно развивается. В связи с чем, код, представленный в этой статье, в последних версиях платформы будет выдавать ошибку. Происходит это, в частности, из-за того, что изменился порядок вызова методов прокси-объекта web-сервиса: например, сложные объекты необходимо явно преобразовывать в ОбъектXDTO соответствующего типа, используя Фабрику соответствующего сервиса. Об этом вы можете почитать на нашем форуме или в книге "Технологии интеграции 1С:Предприятия" http://v8.1c.ru/metod/books/book.jsp?id=288

Вступление

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

Для тех, кто совсем "не в теме": о web-сервисах "на пальцах"

ОК, специально для ТЕБЯ я чуть-чуть попытаюсь рассказать, что такое web-сервис, и почему именно это показалось мне таким "вкусным" новшеством платформы. Возможно ты знаешь про технологию COM или что-то слышал про OLE? С этой технологией рано или поздно сталкивается любой одинесник (особенно если надо быстро перекинуть какой-нибудь справочник "Сотрудники", а отдел кадров, предвидя необходимость снова вбивать всю 1500 сотрудников, готов повесить тебя на первом встречном подходящем гвозде).
Да, так вот, в основе технологии COM лежит идея о возможности вызова программного кода (и обращения к данным) одного приложения из другого приложения. Причем, возможности делать это не на уровне отдельных процедур и функций, но получая в распоряжение объекты другого приложения. При использовании OLE, мы в своем приложении создаем объект, являющийся "представителем " или, если хотите, "оберткой " некоторого объекта того приложения, с которым мы хотим наладить взаимодействие (т.н. "OLE-объект" или "COM-объект"). Через этот объект-"обертку" нам становятся доступны свойства и методы объекта другого приложения, причем только те из них, которыми разработчик того приложения разрешил нам пользоваться, опубликовав их в описании интерфейса . (Ну вот, не хотел лезть в дебри, но по-другому не получается...)
Теперь представим себе, что то-самое приложение находится на другом компьютере, и даже не в локальной сети (с такими случаями неплохо справляются DCOM, CORBA и прочие заумные аббревиатуры), а где-то далеко-далеко в Интернете. Вот тут-то и выходят на сцену web-сервисы (тоже в комплекте с заумными аббревиатурами: SOAP, WSDL и др.), которые позволяют проделывать аналогичный "фокус" и в этом случае: т.е. получать данные и манипулировать объектами приложения, выполняющегося на компьютере на другом краю Интернета.
Под "внешним " web-сервисом я буду понимать web-сервис, предоставляемый некоторым поставщиком сервиса (т.е. не нашим приложением.) Соответственно, под "внутренним" - web-сервис, который будем предоставлять мы из , или, точнее, на основе нашего приложения. При использовании внешних web-сервисов надо понимать, что хотя объект-"обертка" создается в нашем "локальном" приложении, "исполняющий код" этого объекта находится, может быть, на другой стороне Земного Шара. При этом обмен между нами и ними происходит на вездесущем ныне XML, с его известными "плюсами" (универсальностью и структурированностью) и "минусами" (раздутостью), а в качестве "линии передачи" используется старый добрый http.
Да, и не забудь про интернет-трафик! Причем, в случае с внешними web-сервисами большая часть его придется на входящую составляющую.
Все, остальное есть в Яндексе. Поехали дальше...

Откуда ноги, т.е. крылья растут

Порывшись в том же Яндексе, я нашел замечательный web-сервис от компании "Аэрофлот", который позволяет в режиме реального времени получать информацию о прилете и вылете самолетов, и решил сделать эдакое "Табло аэропорта" в "1С:Предприятие". Сам сервис живет тут: http://webservices.aeroflot.ru/desc_flightinfo.asp

Он сказал: "Поехали!"

Для начала я создал пустую конфигурацию "1С:Предприятия 8.1" (на момент написания статьи в моем распоряжении была версия платформы 8.1.5.123). Затем я добавил в свою конфигурацию новый объект типа WS-ссылка. На предложенный запрос ввести URL импортируемого WSDL, я ввел ссылку на WSDL-файл, которая значится на странице сервиса: http://webservices.aeroflot.aero/flightstatus.wsdl (WSDL-файл является описанием web-сервиса. За подробностями - в Яндекс), и гордо назвал созданный объект "Аэрофлот". Щелкнув два раза на этом объекте, я получил дерево со структурой web-сервиса.

Это дерево представляет собой "портрет" web-сервиса, как его видит 1Ска. Самое интересное находится в ветке "Web-сервисы": это имена и порты web-сервисов (на самом деле WSDL-файл может описывать не один, а несколько web-сервисов, тогда для каждого web-сервиса будет создана своя ветка), и перечислены методы web-сервиса. Это и есть те самые "ниточки", подергав за которые можно приоткрыть себе доступ к тем данным, которые предоставляет web-сервис. В ветке "Модель данных" содержится описание библиотек типов данных, которые используются web-сервисом.
Краткую справку об использовании web-сервиса обычно можно получить там же, где и ссылку на WSDL-файл. В случае с "Аэрофлотом", это страничка http://webservices.aeroflot.aero/flightstatus.asmx

"То взлет, то посадка..."

Для работы с web-сервисом я добавил в конфигурацию обработку "ТаблоВылетов", а в ней - одну форму, которую назначил основной. На форму я положил поле выбора "ВыборАэропорта", поле ввода "ДатаРейса", панель "ПанельТабло" с двумя страницами "Прилет" и "Вылет", при этом я снял флаг "Распределять по страницам" в свойствах панели, и табличное поле "ТаблицаТабло".
Взаимодействие с web-сервисом происходит по принципу "запрос-ответ", при этом для web-сервиса создается специальный объект-посредник. Поэтому я добавил реквизит формы "СервисАэрофлот" произвольного типа.
Если внимательно почитать описание сервиса, то можно увидеть, что web-сервис предоставляет данные о прилетах и вылетах через вызовы методов Arrival и Departure соответственно. При этом оба метода принимают в качестве параметров код аэропорта и нужную дату. Кроме того, web-сервис предоставляет возможность получить список аэропортов, по которым имеются данные в системе. Достаточно очевидным является следующий сценарий взаимодействия с web-сервисом:
1. Получить список аэропортов;
2. Выбрать нужный аэропорт и дату;
3. Получить данные о прилетах или вылетах;
Но прежде чем обращаться к web-сервису, необходимо инициализировать объект-посредник (типа WSПрокси), что я и сделал в обработчике открытия формы:
СервисАэрофлот=WSСсылки.Аэрофлот.СоздатьWSПрокси("http://www.aeroflot.ru/", "FlightStatus", "FlightStatusSoap");
Первым параметром передается URI пространства имен web-сервиса. Узнать его можно открыв свойства web-сервиса в дереве WS-ссылки. Вторым и третьим параметром параметрами передаются соответственно имя и порт web-сервиса.
(не надо путать понятия "имя", "порт", "прокси" и т.п. в применении к web-сервисам с более привычными понятиями протокола TCP/IP. Соответствие между ними если и есть, то скорее смысловое. В общем случае нужно понимать, что, например порт web-сервиса и TCP-порт - это абсолютно разные вещи).
Таким образом я проинициализировал объект СервисАэрофлот типа WSПрокси, который по-сути своей является "оберткой" web-сервиса. Через него я смогу обращаться к методам web-сервиса как к "родным" методам платформы.
Первым делом я получил список аэропортов и заполнил список поля выбора "ВыборАэропорта":

СписокВыбора=ЭлементыФормы.ВыборАэропорта.СписокВыбора; СписокВыбора.Очистить(); СписокАэропортов=СервисАэрофлот.AirportList().ПолучитьСписок("list "); ВсегоАэропортов=СписокАэропортов.Количество(); Для ии=0 по ВсегоАэропортов-1 Цикл Аэропорт=СписокАэропортов.Получить(ии); СписокВыбора.Добавить(Аэропорт.code, ""+Аэропорт.city+" : "+Аэропорт.name); КонецЦикла;
Тут нужен небольшой комментарий по конструкции СписокАэропортов=СервисАэрофлот.AirportList().ПолучитьСписок("list");
Дело в том, что значения, возвращаемые методами web-сервисов, представляются в платформе объектами типа ОбъектXDTO. Поскольку тематика технологии XDTO выходит за рамки этой статьи, скажу лишь, что для превращения этого объекта в список (чем он и является), я вызвал его метод ПолучитьСписок(). Остальное в коде достаточно очевидно, включая названия полей структуры Аэропорт, которые я нашел на странице описания web-сервиса.
Теперь можно запустить конфигурацию и убедиться, что список поля выбора заполняется названиями аэропортов:

"День отлета, день прилета..."

Теперь у меня практически все готово для того, чтобы заставить мое табло функционировать. Осталось только его "выкрасить и выбросить" :) Чем и займусь:

Процедура ЗаполнитьТабло(Прилет=Истина) ТаблицаТабло.Колонки.Очистить(); ТаблицаТабло.Колонки.Добавить("КодРейса ", "Код рейса "); ТаблицаТабло.Колонки.Добавить("КодАвиакомпании ", "Авиакомпания "); ТаблицаТабло.Колонки.Добавить("НомерРейса ", "Номер "); ТаблицаТабло.Колонки.Добавить("АэропортТранзит ", "Аэропорт-транзит "); ТаблицаТабло.Колонки.Добавить("Аэропорт ", "Аэропорт "+?(Прилет,"вылета ","прилета ")); ТаблицаТабло.Колонки.Добавить("ВремяРасписание ", "По расписанию "); ТаблицаТабло.Колонки.Добавить("ВремяПланируемое ", "Планируемое "); ТаблицаТабло.Колонки.Добавить("ВремяФактическое ", "Фактическое "); ТаблицаТабло.Колонки.Добавить("ВремяРасчетное ", "Расчетное "); ТаблицаТабло.Колонки.Добавить("ВремяПосадки ", ?(Прилет,"Посадка ","Взлет ")); ТаблицаТабло.Колонки.Добавить("ОбъедРейс ", "Объед.рейс "); ТаблицаТабло.Колонки.Добавить("Статус ", "Статус "); Если Не Прилет Тогда ТаблицаТабло.Колонки.Добавить("Регистрация ", "Регистрация "); ТаблицаТабло.Колонки.Добавить("Посадка ", "Посадка "); КонецЕсли; ЭлементыФормы.ТаблицаТабло.СоздатьКолонки(); ЭлементыФормы.ТаблицаТабло.Колонки.КодРейса.Видимость=Ложь; Если Не Прилет Тогда ЭлементыФормы.ТаблицаТабло.Колонки.ВремяРасчетное.Видимость=Ложь; КонецЕсли; Если Прилет Тогда Данные=СервисАэрофлот.Arrival(ВыборАэропорта, ДатаРейса).ПолучитьСписок("list "); Иначе Данные=СервисАэрофлот.Departure(ВыборАэропорта, ДатаРейса).ПолучитьСписок("list "); КонецЕсли; ВсегоЗаписей=Данные.Количество(); Для ии=0 по ВсегоЗаписей-1 Цикл Запись=ДАнные.Получить(ии); НоваяСтрока=ТаблицаТабло.Добавить(); НоваяСтрока.КодАвиакомпании=Запись.company; НоваяСтрока.НомерРейса=Запись.flight_no; НоваяСтрока.АэропортТранзит=Запись.airport_inter; НоваяСтрока.Аэропорт=Запись.airport; НоваяСтрока.ВремяРасписание=Запись.sched; НоваяСтрока.ВремяПланируемое=Запись.plan; НоваяСтрока.ВремяФактическое=Запись.fact; НоваяСтрока.ВремяРасчетное=Запись.calc; НоваяСтрока.ВремяПосадки=Запись.real; НоваяСтрока.ОбъедРейс=Запись.union_flight_no; НоваяСтрока.Статус=Запись.status; Если Не Прилет Тогда НоваяСтрока.Регистрация=Запись.is_check; НоваяСтрока.Посадка=Запись.is_board; КонецЕсли; КонецЦикла; КонецПроцедуры

Для того, чтобы проверить как это все работает, я добавил на командную панель формы кнопку "Обновить" с соответствующей картинкой, а в ее обработчике написал такое:

Процедура КоманднаяПанель1 Обновить(Кнопка) ЗаполнитьТабло(ЭлементыФормы.ПанельТабло.ТекущаяСтраница=ЭлементыФормы.ПанельТабло.Страницы.Прилет); КонецПроцедуры
Сохраняю, запускаю, выбираю, нажимаю, получаю:

Послесловие

Удивительное дело, но уже после того, как статья была написана и опубликована, выяснилось, что уважаемый ZAV уже опубликовал похожий пример на IT-Land"е: http://itland.ru/biblio/detail.php?ID=1060
Дабы избежать возможных обвинений в плагиате, настоятельно рекомендую ознакомиться и с этой статьей тоже и сравнить подходы авторов.

Печать (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.сайт/" , "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.

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

Работать с Web-сервисами из сторонних приложений можно двумя способами, все зависит от цели использования и конкретного языка программирования:
1. Работа через COM-объекты Terrasoft
2. Работа с Web-сервисами напрямую

Работа через COM-объекты

Первый вариант наименее трудоемкий и более удобный, но требует, чтобы на клиентской машине были зарегистрированы библиотеки Terrasoft (для использования COM-объектов). При этом вся работа с Web-сервисами будет выполняться COM-объектами Terrasoft, предоставляя доступ к данным и объектам через объектную модель платформы Terrasoft: IDataset, ISelectQuery и т.д.

Для подключения программно нужно выполнить следующий код (пример на Jscript, но это можно реализовать на любом языке, который работает с COM-объектами):

// Создание экземпляров COM-объектов Connector и Configuration
WSConnector = new ActiveXObject("TSDskObjectLibrary.DskConnector" ) ; // Для версий 3.4.0+ объект создается ActiveXObject("TSObjectLibrary.Connector")
var WSConfiguration = new ActiveXObject("TSObjectLibrary.Configuration" ) ;
WSConfiguration.DBExecutorTypeCode = "WebServices" ;

// Кэшироование созданного соединения
Connector.Attributes ("WSConnector" ) = WSConnector;

// Установка строки соедения и название конфигурации настроенной на сервере
WSConfiguration.SetConnectionString (
""URL=http://192.168.227.128/TSWebServicesServerLibrary.dll/soap/IServer"" +
","ConfigurationName=Dev332"" ) ;

// Открытие конфигурации
var IsConnected = WSConnector.OpenConfiguration (
WSConfiguration,
1 , // Тип аутентификации: 0 - Windows Authentication, 1 - Server
"ddd" , // Имя пользователя
"" ) ; // Пароль

После успешного подключения можем обращаться к любым объектам, получать данные и т.д. Например получение данных о контрагентах:

// Получение сервиса ds_Account из коннектора к веб-сервисам
var AccountDataset = WSConnector.Services .GetSingleItemByUSI ("ds_Account" ) ;

// Подготовка датасета: закрытие и очистка фильтров
AccountDataset.Close () ;
EnableDatasetFilters(AccountDataset, false ) ;

// Наложение фильтра по ID текущей записи
ApplyDatasetFilter(AccountDataset, "ID" , dlData.Dataset ("ID" ) , true ) ;

// Открытие датасета
AccountDataset.Open () ;

// Считывание данных
if (AccountDataset.IsEOF ) {
var Value = "(нет данных)" ;
edtWSName.Value = Value;
edtWSOfficialName.Value = Value;
edtWSCode.Value = Value;
} else {
edtWSName.Value = AccountDataset.ValAsStr ("Name" ) ;
edtWSOfficialName.Value = AccountDataset.ValAsStr ("OfficialAccountName" ) ;
edtWSCode.Value = AccountDataset.ValAsStr ("Code" ) ;
}

// Закрытие датасета
AccountDataset.Close () ;

Во вложении полный пример работы с Web-сервисами на Jscript, используя COM-объекты.

Работа с Web-сервисами напрямую

Этот тип работы сложнее, т.к. все запросы к Web-сервисам нужно посылать самостоятельно, а также самому обрабатывать ответ от сервера. При этом не используются COM-объекты Terrasoft, соответственно не нужно устанавливать и регистрировать библиотеки Terrasoft на каждом клиентском компьютере, откуда будут запрашиваться веб-сервисы.

Запросы Web-сервисам можно отправлять исходя из их интерфейса (WSDL) – описания всех методов с параметрами.

Для упрощенной разработки программ для работы с Web-сервисами в некоторых IDE, например Visual Studio, предусмотрен импорт WSDL (Add WebService Reference), при этом сама IDE генерирует оберточные классы для работы с Web-сервисами. Вызывая методы такого класса вы будете упрощенно вызывать соответствующие методы веб-сервиса.

Упрощение заключается в том, что для вызова метода Web-сервиса нужно отправить полный XML запрос, а с помощью оберточных классов – просто вызвать соответствующий метод с параметрами.

Пример на C# :

// Создание клиента Web-сервиса
ws. IServer sc = new ws. ServerClient () ; // ws.IServer – оберточный класс для работы с Web-сервисами Terrasoft
ws. OpenConfigurationRequest rqOpenConfiguration = new ws. OpenConfigurationRequest () ; // Запросы для открытия конфигурации
ws. OpenConfigurationResponse rsOpenConfiguration = new ws. OpenConfigurationResponse () ;

// Открытие конфигурации
rqOpenConfiguration. ACompressionLevel = 0 ; //Without compression (zip)
rqOpenConfiguration. AConfigurationName = Configuration;
rqOpenConfiguration. ADBExecutorTypeCode = "MSSQL" ;
rqOpenConfiguration. AUserName = UserName;
rqOpenConfiguration. AUserPassword = Password;
rsOpenConfiguration = sc. OpenConfiguration (rqOpenConfiguration) ;

При этом передачу данных, разбивку больших данных на пакеты, разбор ответа сервера и т.д. нужно реализовывать самостоятельно.

Во вложении полный пример работы с Web-сервисами на C#.

Отдельное спасибо Александру Кравчуку за предоставленные примеры.

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

Добавление 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("Вася" ) ; Сообщение = Новый СообщениеПользователю; Сообщение. Текст = ТекстВС; Сообщение. Сообщить() ; КонецПроцедуры
 
Статьи по теме:
Как настроить роутер от компании Apple?
Сегодня рассмотрим как настроить WiFi роутера Apple. Всегда приятно рассказать о том, как настроить что-то от Apple. Помню, когда я впервые увидел роутер от Apple, я был в просто восторге! Дело в том, что нам даже не нужно заходить в настройки роутера веб
Ремонт HDD и «невидимость» диска Как проверить шлейф жесткого диска
Мы весьма подробно рассмотрели твердотельные накопители — флешки, карты памяти и SSD. В массовый обиход этот тип накопителей вошел недавно, всего 5-6 лет назад, и многие пользователи еще, к счастью, не столкнувшиеся с их поломками, довольно смутно предста
Для чего нужен сервер, какие серверы бывают
Что такое сервер? По своей сути, это мощный компьютер, который может бесперебойно выполнять разного характера задачи и обрабатывать информацию, которая поступает большим потоком. Зачастую серверные машины устанавливаются в крупных компаниях. По своей функ
Где находится главный офис
Мы выпустили новую книгу «Контент-маркетинг в социальных сетях: Как засесть в голову подписчиков и влюбить их в свой бренд». Подписаться Google – это поисковая система с дополнительными инструментами и сервисами. Можно сказать, что Google.com –