суббота, 6 октября 2012 г.

1С:Предприятие 8. Веб-сервисы. Классы Платформы 1С для вызова операций веб-сервиса

Содержание статей: 1С:Предприятие 8. Веб-сервисы
Предыдущая статья: 1С:Предприятие 8. Веб-сервисы. Публикация и тестирование

В платформе 1С для работы со сторонними с веб-сервисами существуют следующие объекты:
  • WSОпределения - класс, содержащий в себе описание веб-сервиса, по сути это WSDL. Данный класс можно создать на основе WSDL. WSОпределения реализуют механизм динамического вызова веб-сервиса;
  • WSСсылкиМенеджер - менеджер статистических ссылок на веб-сервис. Предоставляет доступ к WS-ссылкам дерева метаданных.  WSСсылкиМенеджер реализуют механизм статического вызова веб-сервисов;
  • WSПрокси - клиентский прокси для вызова веб-сервиса. Только с помощью данного класса можно обратиться к операциям веб-сервиса, независимо от того статическая это ссылка или динамическая.
  • XDTO - механизм XDTO позволяет создать модель представления данных (модель типов и значений), которая, с одной стороны, обеспечивает возможность просто и естественно манипулировать данными в среде 1С:Предприятия 8, а с другой стороны, данная модель хорошо приспособлена для прозрачного преобразования данных в другие форматы, главным образом XML.

Для наглядности попробую предоставить диаграмму классов приведенных выше классов. Прошу прощения если был неточен, просто ставил целью предоставление общей картины взаимосвязей классов.
Классы для работы с веб-сервисами 1с
Что же означают слова динамическая ссылка и статическая? Статистическая ссылка хранится в дереве метаданных (WS-ссылка) и задается на этапе конфигурирования, при ее создании подгружается определение веб-сервиса(описание WSDL) и сохраняется в конфигурации. Хранение определения веб-сервиса позволяет экономить время на его получении при обращении к веб-сервису. Минусом такого использования является изменение используемого веб-сервиса. При изменении веб-сервиса, в вашей конфигурации будет старое описание и вызов веб-сервиса просто перестанет работать. А для загрузки нового описания вам придется изменять конфигурацию.
Динамические ссылки напротив, подгружают актуальное описание при каждом создании класса WSОпределения.

Приведу пример обращения к веб-сервису по статической ссылке.
Для начало создадим WS-ссылку. Для этого откройте свою конфигурацию и найдите в окне конфигурации Общие-WSСсылка.

Классы для работы с веб-сервисами 1с

И нажмите Добавить. Платформа попросит ввести путь к WSDL.

Классы для работы с веб-сервисами 1с

Если вы публикуете веб-сервис средствами 1С то путь к WSDL будет такого вида:
http://домен_сайта/имя_публикации_базы/ws/имя_веб_сервиса?wsdl. Позже, когда мы будем создавать свой веб-сервис, я объясню подробнее откуда берутся эти имена.
Если на веб-сервис стоит ограничение, то введите логин и пароль. Если вы создавали веб-сервис в 1С то для авторизации используйте учетные данные пользователей БД, у которых есть право на использование операций веб-сервиса.

Классы для работы с веб-сервисами 1с

После ввода логина и пароля пройдет некоторое время на закачку WSDL и WS-ссылка будет создана.

Классы для работы с веб-сервисами 1с

Теперь можно обратиться к веб-сервису. Создадим процедуру с директивой &НаСервере:

&НаСервере
Процедура ОбращениеКВебСервисуПоСтатическойСсылкеСервер()
Прокси = WSСсылки.WSСсылка.СоздатьWSПрокси("http://xxx.xxx.xxx.xxx", "WebServices", "WebServicesSoap");
Прокси.Пользователь="admin";
Прокси.Пароль="admin";
РезультатВебОперации = Прокси.ListOfDevices();
КонецПроцедуры

В данном примере мы используем метод  СоздатьWSПрокси  типа  WSСсылкаМенеджер.WSСсылка, который создает объект WSПрокси. В  WSПрокси мы указываем логин и пароль для доступа к веб-сервису и уже после этого вызываем функцию веб-сервиса. В нашем случае это функция  ListOfDevices().


Теперь попробуем обратиться к той же самой операции веб-сервиса через динамическую ссылку. Для этого создадим процедуру с директивой &НаСервере:


&НаСервере
Процедура ОбращениеКВебСервисуПоДинамическойСсылкеСервер()

       WSОпределение = Новый WSОпределения("http://xxx.xxx.xxx.xxx/InfoBase/ws/WebServices?wsdl","admin" "admin");
       WSПрокси = Новый WSПрокси(WSОпределение,  "http://xxx.xxx.xxx.xxx"  "WebServices", "WebServicesSoap" );
       WSПрокси.Пользователь =  "admin" ;
       WSПрокси.Пароль =  "admin" ;
       РезультатВебОперации =  WSПрокси .ListOfDevices();
КонецПроцедуры

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

Ссылка на обработку WSReader: http://yadi.sk/d/X9GTmUw65zsGw

8 комментариев:

  1. Спасибо большое, все понятно и доходчиво.

    ОтветитьУдалить
  2. Где создадим эту процедуру ?? До конца сложно дописать все ? Обязателен ли прокси ? У меня локальная машина с сервером.

    ОтветитьУдалить
    Ответы
    1. Здравствуйте. Не важно где писать код, хоть в обработке. И наверно проще в обработке: создал форму, создал команду, щелкнул лупу в поле процедура вот и созданы процедуры. WSПрокси обязателен, через него идут обращения к операциям.

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

    А теперь очередные проблемы - понять суть которых я не могу.

    В фабрике XDTO определено 2 типа: Contr - это данные одного контрагента (наименование, ИНН, КПП...)
    и ContrList - это список контрагентов, элементы которого имеют тип Contr

    Веб-сервису передаем 2 параметра (входных-выходных): Contr и ContrList. Веб-сервис смотрит данные контрагента в передаваемом параметре Contr, и если такой контрагент в базе уже есть - то возвращает всех найденных контрагентов в параметре ContrList.
    Если смотреть работу веб-сервиса в SoapUI - то все работает - найденные контрагенты возвращаются.
    Если вызывать веб-сервис из 1С - то ContrList - не возвращает... Не пойму почему???

    Предполагаю - что-то с типами???? Или настройками типа ContrList? Или настройками этого параметра в веб-сервисе?
    Где копать? Куда глядеть?

    Изначально параметр ContrList был выходной. В SoapUI работает. В 1С возвращало Неопределено. Сделала параметр ContrList входной-выходной. В SoapUI опять работает. В 1С возвращает переданное мной пустой Element - без тех, что нашел веб-сервис.

    Подскажите - в чем тут хитрость? Спасибо!

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

      Еще как вариант я попробовал реализовать вашу задачу в самом простом виде, вернуть значение получилось. Посмотрите ДТшник, может мой код подтолкнет на решение проблемы. https://yadi.sk/d/thvPWft0tPjPk. В базе есть веб сервис (http://localhost/Test/ws/WebСервис?wsdl) и обработка которая его вызывает и получает наименование первого контрагента.

      Удалить
    2. Владимир! Ух... разобралась!
      В результате ошибка оказалась в том, что я в описание XDTO добавила поле, но не добавила код для заполнения этого поля. Хотя это поле настроено как "возможно пустое".

      А еще вопрос: в каком случае нужно заново публиковать веб-сервис? Если изменили типы? если изменили количество параметров веб-сервиса? Если изменили свойства параметров веб-сервиса? Изменили программный код веб-сервиса?

      Я еще заново опубликовала веб-сервис - может это тоже сказалось...

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

      Большое спасибо, что откликнулись... Думала буду долго сидеть ждать у моря погоды... Перерыла кучу сайтов... и вот на одном наткнулась про порядок элементов - что он должен быть таким же как в описании - давай проверять - и таким образом нашла!

      Удалить
    3. Рад что вы разобрались с проблемой)
      База публикуется один раз, дальше можно публикацию не делать. После применения изменений в БД веб сервис изменяется автоматически.

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

      Но это не касается клиента 1С. 1С при вызове тянет описание веб сервиса через WSОпределение.

      Удалить
    4. Ясно! Спасибо большое, Владимир!

      Удалить