24 сент. 2012 г.

Работаем с WS-ссылками

Рассмотрим работу 1С со сторонними web-ресурсами на примере ЦБ РФ. Описание публикуемых web-сервисов можно найти здесь http://www.cbr.ru/scripts/root.asp.
Разработка будет вестись в новой конфигурации, в режиме управляемого приложения.
Мы можем подключиться к стороннему ресурсу, используя объект WSОпределения.
Новый WSПрокси(Новый WSОпределения("http://www.cbr.ru/dailyinfowebserv/dailyinfo.asmx?WSDL"), 
"http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap"); 
Так же, мы можем предварительно загрузить описание ws-ссылки в метаданные 1С. Для этого находим в дереве метаданных группу WS-ссылка, добавляем описание:

В итоге должно получиться следующее:

После этого можно обратиться к нашему сервису через менеджер WSСсылки:
WSСсылки.Daily.СоздатьWSПрокси("http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap"); 
Попробуем для начала получить справочник валют ЦБ и заполнить на его основании свой.
Создадим справочник "Валюты", реквизиты пока добавлять не будем, создаем форму списка, добавляем команду "ЗаполнитьСправочник", выносим ее на форму, пишем код:
&НаСервере
Процедура ЗаполнитьСправочникСервер()

 СервВалюты = WSСсылки.Daily.СоздатьWSПрокси("http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap");
 ТипБулево = СервВалюты.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "boolean");
 ЗначениеБулево = СервВалюты.ФабрикаXDTO.Создать(ТипБулево, Истина);
 //обращаемся к методу EnumValutes, передаем значение Истина, которое заранее привели к типу XDTO
 //если передать без преобразования, возникнет ошибка несоответствия типов
 ДанныеВалюта = СервВалюты.EnumValutes(ЗначениеБулево);

КонецПроцедуры // ЗаполнитьСправочникСервер()

&НаКлиенте
Процедура ЗаполнитьСправочник(Команда)
 
 ЗаполнитьСправочникСервер();
 
КонецПроцедуры 

Сохраняем конфигурацию, запускаем отладку и смотрим, какое значение у нас содержится в ДанныеВалюта.

Необходимые нам данные содержатся по следующему пути ДанныеВалюта.EnumValutesResult.diffgram.ValuteData.EnumValutes

Теперь можно внести дополнительные настройки в справочник Валюты. Поля Vcode, Vname пойдут в Код, Наименование справочника, для остальных добавим соответствующие реквизиты. Так же я отключил автонумерацию справочника.
Я сделал наименования реквизитов один в один как названия колонок, чтобы можно было воспользоваться методом ЗаполнитьЗначенияСвойств, а не приравнивать значения каждому реквизиту. Дописываем процедуры:
&НаСервере
Процедура ЗаполнитьСправочникСервер()

 СервВалюты = WSСсылки.Daily.СоздатьWSПрокси("http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap");
 ТипБулево = СервВалюты.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "boolean");
 ЗначениеБулево = СервВалюты.ФабрикаXDTO.Создать(ТипБулево, Истина);
 //обращаемся к методу EnumValutes, передаем значение Истина, которое заранее привели к типу XDTO
 //если передать без преобразования, возникнет ошибка несоответствия типов
 ДанныеВалюта = СервВалюты.EnumValutes(ЗначениеБулево);
 
 спВалюты = ДанныеВалюта.EnumValutesResult.diffgram.ValuteData.EnumValutes;
 Для Каждого элВалюта Из спВалюты Цикл
  
  спВалюта = Справочники.Валюты.НайтиПоКоду(СокрЛП(элВалюта.Vcode));
  Если спВалюта.Пустая() Тогда
   обВалюта = Справочники.Валюты.СоздатьЭлемент();
   обВалюта.Код = элВалюта.Vcode;
   обВалюта.Наименование = элВалюта.Vname;
  Иначе
   обВалюта = спВалюта.ПолучитьОбъект();
  КонецЕсли;
  
  ЗаполнитьЗначенияСвойств(обВалюта, элВалюта);
  обВалюта.Записать();
  
 КонецЦикла;
 
КонецПроцедуры // ЗаполнитьСправочникСервер()

&НаКлиенте
Процедура ЗаполнитьСправочник(Команда)
 
 ЗаполнитьСправочникСервер();
 Элементы.Список.Обновить();
 
КонецПроцедуры
 
Запускаем, переходим в справочник, запускаем нашу команду.

Файл конфигурации

2 комментария:

  1. Спасибо, хороший пример! С уважением Алексей.

    ОтветитьУдалить
  2. Когда Web-сервер на стороне SAP - так просто передать структуру даже из двух строковых полей не получится. К сожалению.

    ОтветитьУдалить