Содержание статей: 1С:Предприятие 8. Веб-сервисы
Предыдущая статья: 1С:Предприятие 8. Веб-сервисы. Публикация и тестирование
В платформе 1С для работы со сторонними с веб-сервисами существуют следующие объекты:
Для наглядности попробую предоставить диаграмму классов приведенных выше классов. Прошу прощения если был неточен, просто ставил целью предоставление общей картины взаимосвязей классов.
Что же означают слова динамическая ссылка и статическая? Статистическая ссылка хранится в дереве метаданных (WS-ссылка) и задается на этапе конфигурирования, при ее создании подгружается определение веб-сервиса(описание WSDL) и сохраняется в конфигурации. Хранение определения веб-сервиса позволяет экономить время на его получении при обращении к веб-сервису. Минусом такого использования является изменение используемого веб-сервиса. При изменении веб-сервиса, в вашей конфигурации будет старое описание и вызов веб-сервиса просто перестанет работать. А для загрузки нового описания вам придется изменять конфигурацию.
Динамические ссылки напротив, подгружают актуальное описание при каждом создании класса WSОпределения.
Приведу пример обращения к веб-сервису по статической ссылке.
Для начало создадим WS-ссылку. Для этого откройте свою конфигурацию и найдите в окне конфигурации Общие-WSСсылка.
И нажмите Добавить. Платформа попросит ввести путь к WSDL.
Если вы публикуете веб-сервис средствами 1С то путь к WSDL будет такого вида:
http://домен_сайта/имя_публикации_базы/ws/имя_веб_сервиса?wsdl. Позже, когда мы будем создавать свой веб-сервис, я объясню подробнее откуда берутся эти имена.
Если на веб-сервис стоит ограничение, то введите логин и пароль. Если вы создавали веб-сервис в 1С то для авторизации используйте учетные данные пользователей БД, у которых есть право на использование операций веб-сервиса.
После ввода логина и пароля пройдет некоторое время на закачку WSDL и WS-ссылка будет создана.
Теперь можно обратиться к веб-сервису. Создадим процедуру с директивой &НаСервере:
&НаСервере
Процедура ОбращениеКВебСервисуПоСтатическойСсылкеСервер()
Прокси = 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
Предыдущая статья: 1С:Предприятие 8. Веб-сервисы. Публикация и тестирование
В платформе 1С для работы со сторонними с веб-сервисами существуют следующие объекты:
- WSОпределения - класс, содержащий в себе описание веб-сервиса, по сути это WSDL. Данный класс можно создать на основе WSDL. WSОпределения реализуют механизм динамического вызова веб-сервиса;
- WSСсылкиМенеджер - менеджер статистических ссылок на веб-сервис. Предоставляет доступ к WS-ссылкам дерева метаданных. WSСсылкиМенеджер реализуют механизм статического вызова веб-сервисов;
- WSПрокси - клиентский прокси для вызова веб-сервиса. Только с помощью данного класса можно обратиться к операциям веб-сервиса, независимо от того статическая это ссылка или динамическая.
- XDTO - механизм XDTO позволяет создать модель представления данных (модель типов и значений), которая, с одной стороны, обеспечивает возможность просто и естественно манипулировать данными в среде 1С:Предприятия 8, а с другой стороны, данная модель хорошо приспособлена для прозрачного преобразования данных в другие форматы, главным образом XML.
Для наглядности попробую предоставить диаграмму классов приведенных выше классов. Прошу прощения если был неточен, просто ставил целью предоставление общей картины взаимосвязей классов.
Что же означают слова динамическая ссылка и статическая? Статистическая ссылка хранится в дереве метаданных (WS-ссылка) и задается на этапе конфигурирования, при ее создании подгружается определение веб-сервиса(описание WSDL) и сохраняется в конфигурации. Хранение определения веб-сервиса позволяет экономить время на его получении при обращении к веб-сервису. Минусом такого использования является изменение используемого веб-сервиса. При изменении веб-сервиса, в вашей конфигурации будет старое описание и вызов веб-сервиса просто перестанет работать. А для загрузки нового описания вам придется изменять конфигурацию.
Динамические ссылки напротив, подгружают актуальное описание при каждом создании класса WSОпределения.
Приведу пример обращения к веб-сервису по статической ссылке.
Для начало создадим WS-ссылку. Для этого откройте свою конфигурацию и найдите в окне конфигурации Общие-WSСсылка.
И нажмите Добавить. Платформа попросит ввести путь к WSDL.
Если вы публикуете веб-сервис средствами 1С то путь к WSDL будет такого вида:
http://домен_сайта/имя_публикации_базы/ws/имя_веб_сервиса?wsdl. Позже, когда мы будем создавать свой веб-сервис, я объясню подробнее откуда берутся эти имена.
Если на веб-сервис стоит ограничение, то введите логин и пароль. Если вы создавали веб-сервис в 1С то для авторизации используйте учетные данные пользователей БД, у которых есть право на использование операций веб-сервиса.
После ввода логина и пароля пройдет некоторое время на закачку WSDL и WS-ссылка будет создана.
Теперь можно обратиться к веб-сервису. Создадим процедуру с директивой &НаСервере:
&НаСервере
Процедура ОбращениеКВебСервисуПоСтатическойСсылкеСервер()
Прокси = 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
Спасибо большое, все понятно и доходчиво.
ОтветитьУдалитьГде создадим эту процедуру ?? До конца сложно дописать все ? Обязателен ли прокси ? У меня локальная машина с сервером.
ОтветитьУдалитьЗдравствуйте. Не важно где писать код, хоть в обработке. И наверно проще в обработке: создал форму, создал команду, щелкнул лупу в поле процедура вот и созданы процедуры. WSПрокси обязателен, через него идут обращения к операциям.
УдалитьДобрый день, Владимир! Сколько пришлось работать с веб-сервисами - каждый раз какие-то проблемы... ноги которых найти крайне сложно.. и каждый раз возвращаюсь к вашему сайту - перечитываю его... Спасибо! На мой взгляд - это лучший ресурс на данную тему!
ОтветитьУдалитьА теперь очередные проблемы - понять суть которых я не могу.
В фабрике XDTO определено 2 типа: Contr - это данные одного контрагента (наименование, ИНН, КПП...)
и ContrList - это список контрагентов, элементы которого имеют тип Contr
Веб-сервису передаем 2 параметра (входных-выходных): Contr и ContrList. Веб-сервис смотрит данные контрагента в передаваемом параметре Contr, и если такой контрагент в базе уже есть - то возвращает всех найденных контрагентов в параметре ContrList.
Если смотреть работу веб-сервиса в SoapUI - то все работает - найденные контрагенты возвращаются.
Если вызывать веб-сервис из 1С - то ContrList - не возвращает... Не пойму почему???
Предполагаю - что-то с типами???? Или настройками типа ContrList? Или настройками этого параметра в веб-сервисе?
Где копать? Куда глядеть?
Изначально параметр ContrList был выходной. В SoapUI работает. В 1С возвращало Неопределено. Сделала параметр ContrList входной-выходной. В SoapUI опять работает. В 1С возвращает переданное мной пустой Element - без тех, что нашел веб-сервис.
Подскажите - в чем тут хитрость? Спасибо!
Здравствуйте. Я предлагаю вам сбросить вашу базу мне на ящик, я в ней покапаюсь. Понимаю что там могут быть данные или код которые не хотелось бы распространять, мне лишнего не надо, урежьте все, что я не должен видеть. Просто вот так я не могу понять причин, надо воспроизвести проблему.
УдалитьЕще как вариант я попробовал реализовать вашу задачу в самом простом виде, вернуть значение получилось. Посмотрите ДТшник, может мой код подтолкнет на решение проблемы. https://yadi.sk/d/thvPWft0tPjPk. В базе есть веб сервис (http://localhost/Test/ws/WebСервис?wsdl) и обработка которая его вызывает и получает наименование первого контрагента.
Владимир! Ух... разобралась!
УдалитьВ результате ошибка оказалась в том, что я в описание XDTO добавила поле, но не добавила код для заполнения этого поля. Хотя это поле настроено как "возможно пустое".
А еще вопрос: в каком случае нужно заново публиковать веб-сервис? Если изменили типы? если изменили количество параметров веб-сервиса? Если изменили свойства параметров веб-сервиса? Изменили программный код веб-сервиса?
Я еще заново опубликовала веб-сервис - может это тоже сказалось...
Но.. честно... очень сложно понять в чем проблема... я частично успела переписать веб-сервис.... и вернулась снова к исходной ошибке... а оказалось... и так каждый раз.
Большое спасибо, что откликнулись... Думала буду долго сидеть ждать у моря погоды... Перерыла кучу сайтов... и вот на одном наткнулась про порядок элементов - что он должен быть таким же как в описании - давай проверять - и таким образом нашла!
Рад что вы разобрались с проблемой)
УдалитьБаза публикуется один раз, дальше можно публикацию не делать. После применения изменений в БД веб сервис изменяется автоматически.
Проблемы могут быть на стороне клиента, клиент может держать в памяти прошлую структуру операций веб сервиса и не знать что вы, допустим, удалили один параметр, и тогда произойдет ошибка.
Но это не касается клиента 1С. 1С при вызове тянет описание веб сервиса через WSОпределение.
Ясно! Спасибо большое, Владимир!
Удалить