Имя: Пароль:
1C
1С v8
Проблема с параметром метода веб-сервиса
0 dudell
 
19.12.14
00:56
Здравствуйте, форумчане. Уперся в проблемку с присвоением значения параметру метода веб-службы.
Ситуация следующая. Делаю выгрузку заказов через веб-сервис из 1С во внешнюю систему. Известен адрес wsdl сервера. По этому адресу сформировал в 1С объект ws-ссылку. Соответственно, в него подставились данные: модель данных и все свойства, методы. Сформировал по нему ws-прокси, затем по этому прокси - xdto-фабрику.
Теперь пытаюсь запустить метод createOrder, описанный в объекте ws-ссылки. Но у параметра этого метода (orders) тип - не простой, а объектный. И как ему присвоить значение ума не приложу.
По отдельному описанию этот параметр состоит из нескольких узлов, описанных в  типах объекта модели данных объекта ws-ссылки. Т. е. их можно собрать, формируя пакеты, но они все должны быть обернуты в xml-узел orders. Это получается головной тег и он выступает в роли единственного параметра метода, который я использую. И у этого параметра тип не простой, а объектный.
Это первый опыт у меня с веб-сервисами, поэтому может не совсем адекватно излагаю мысли, прошу прощения за это. Кажется все как-то просто должно бытть, но не могу догнать, как таким объектным типам присваивать значения?
1 Записьдампа
 
19.12.14
01:08
1) Получить из определения сервиса ФабрикуXDTO
2) Получить при помощи этой фабрики по пространству имен и имени типа ТипXDTO
3) Создать при помощи этой фабрики и этого типа ОбъектXDTO (или ЗначениеXDTO)
4) Напихать в реквизиты объекта значений. Если значения тоже объектного типа, то см. п2
5) Скормить полученный объект параметром в вызов сервиса
2 Записьдампа
 
19.12.14
01:23
4.5) Если это список (верхнее ограничение количества = -1), то:

Список = ОбъектВладелец.ПолучитьСписок(<Имя владеющего свойства>);
ЭлементСписка = <Созданный по пп 2-4 объект>;
Список.Добавить(ЭлементСписка);

Похоже с твоим orders как-то так будет
3 BOZKURT
 
19.12.14
01:54
Функция СоздатьНовыйОбъектВебСервиса(wsUriNamespace, wsПрокси, ИмяТипа)
    
    тип = wsПрокси.ФабрикаXDTO.Тип(wsUriNamespace, ИмяТипа);
    значение = wsПрокси.ФабрикаXDTO.Создать(тип, Неопределено);    
    Возврат значение;

КонецФункции

Функция СоздатьПараметрВебСервиса(wsUriNamespace, wsПрокси, ИмяМетода, ИмяПараметра, ЗначениеПараметра)
    
    ТипПараметра = wsПрокси.ФабрикаXDTO.Пакеты.Получить(wsUriNamespace).Получить(ИмяМетода);
    Параметр = wsПрокси.ФабрикаXDTO.Создать(ТипПараметра);
    Параметр[ИмяПараметра] = ЗначениеПараметра;
    Возврат Параметр;
    
КонецФункции

wsОпределения = Новый WSОпределения(URL);
wsПрокси = Новый WSПрокси(wsОпределения, UriNamespace, "MyService", "MyServiceSoap");

orders = СоздатьНовыйОбъектВебСервиса(UriNamespace, wsПрокси, "orders");
//... заполняем orders
//создаем параметр
Параметр = СоздатьПараметрВебСервиса(UriNamespace, wsПрокси, "createOrder", "orders", orders);

//дергаем метод
wsПрокси.createOrder(Параметр);
4 dudell
 
20.12.14
19:16
(1) Можно поподробнее на пункте 4. У меня получается что у объектаXDTO реквизит некого объектного типа. (К слову говоря, в отладчике его тип обозначен как Неопределен). Этому реквизиту я не могу ничего присвоить - на этом месте вылетает ошибка. Как можно в данном случае вернуться на пункт 2 ?
5 Записьдампа
 
21.12.14
11:39
Надо создать еще один объект нужного типа, как написано в п2, и присвоить его нужному реквизиту. Покажи wsdl - на конкретном примере понятней будет.
6 hhhh
 
21.12.14
12:01
7 dudell
 
22.12.14
16:02
(5) Спасибо. Разобрался. Изначально не обратил внимание, что в модели данных WS-ссылки - подтянулись все возможные типы для работы с фабрикой. В том числе мой "непонятный" объектный тип там тоже есть. Соответственно, к нему можно создать xdto-объект. Все правильно.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.