Имя: Пароль:
1C
 
v8: WS-ссылки и WebService Java - не скрестить ((
0 ShurupINC
 
19.03.10
16:41
Здравствуйте все!

Проблема такова: на жабе (IDE NetBeans 6.8) написал веб сервис, опубликовал, в 1С создал WS-ссылку, вызываю метод сервиса - выпадает с ошибкой ...

Что делал:
1. Сделал метод вот так
public String getPrices(String code, int a) и в дереве WS-ссылки всё красиво и работает
2. стоит сделать вот так
public String[] getPrices(String code, int a) - всё ... и в дереве WS-ссылки параметры метода getPrices сменяются с arg0 и arg1 на parameters, и вызвать уже я не могу просто Прокси.getPrice(param1, param2) - в рантайме вываливается - неверный тип параметра "1", приходится делать так:
   ТипGetPrices = СЦены.ФабрикаXDTO.Пакеты.Получить("http://TestWSpackage/").Получить("getPrices");
   Парам = СЦены.ФабрикаXDTO.Создать(ТипGetPrices);
   Парам.arg0 = Артикул;
   Парам.arg1 = 2;
   рез = СЦены.getPrices(Парам);

Но при этом в сервис приходят пустые переменные (под отладчиком смотрел) ... не знаю куда копать ... ПАМАГИТЕ =))) Я даже не знаю как мне посмотреть какое сообщение от 1С приходит, может подскажете чем )
1 ShurupINC
 
19.03.10
16:44
Забыл добавить - платформа 8.1.12.101
Где-то тут я читал, что у неё были проблемы с вебсервисами ... может и правда просто надо платформу обновить?
2 ShurupINC
 
19.03.10
19:18
Up
3 Fragster
 
гуру
19.03.10
19:23
а зачем ты делаешь так: lic String[] g?
4 ShurupINC
 
20.03.10
12:01
На самом деле это просто как пример написано, но в любом случае у меня getPrices будет возвращать не базовый тип, а структуру, где будет разнородная информация, в частности как вариант массив или какой-нить свой класс-обертка. А это я просто показываю, что если тип возвращаемого значения сделать сложным - например массивом, то начинается ерунда. CommView подсмотрел запросы от 1С при разных вариантах объявления сервиса.

При объявлении метода сервиса так:

public String getPrices(String code, int a)

и при вызове в 1С так:

рез = СЦены.getPrices(Артикул, 2);

Запрос сервису приходит такой

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Header/>
   <soap:Body> <m:getPrices xmlns:m="http://TestWSpackage/">
   <arg0 xmlns=""
           xmlns:xsd="http://www.w3.org/2001/XMLSchema"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">cam15</arg0>
   <arg1 xmlns=""
           xmlns:xsd="http://www.w3.org/2001/XMLSchema"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2</arg1>
</m:getPrices></soap:Body>
</soap:Envelope>

и параметры метода инициализируются правильно. При этом в 1С нормально возвращается строка. вот ответ от сервиса (дословно =) ):

6e
<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body>
7d
<ns2:getPricesResponse xmlns:ns2="http://TestWSpackage/"><return>cam15</return></ns2:getPricesResponse></S:Body></S:Envelope>
0


А при объявлении метода так:

public String[] getPrices(String code, int a)

в 1С приходится вызывать по другому
Парам = СЦены.ФабрикаXDTO.Создать(ТипGetPrices);
Парам.arg0 = Артикул;
Парам.arg1 = 2;
рез = СЦены.getPrices(Парам);

и запрос сервису такой получается:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Header/>
   <soap:Body> <getPrices xmlns="http://TestWSpackage/"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <arg0>cam15</arg0>
   <arg1>2</arg1>
</getPrices></soap:Body>
</soap:Envelope>

и параметры в методе сервиса не инициализируются, и при при выходе из метода 1С валится с ошибкой:

Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://TestWSpackage/}getPricesResponse - [1,176]
Проверка дополнительного свойства:
   форма: Элемент
   имя: return

а ответ от сервиса приходит такой:

6e
<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body>
8f
<ns2:getPricesResponse xmlns:ns2="http://TestWSpackage/"><return>Hello</return><return>0</return></ns2:getPricesResponse></S:Body></S:Envelope>
0

Такое ощущение, что 1С то ли неправильно разбирает WSDL, то ли не правильно формирует запросы. Я пока не разобрался ещё с XML-схемами, поэтому мне сложно понять в чем тут дело =) Может знающие люди сразу увидят в этом объеме данных какой-то косяк?
5 Asmody
 
20.03.10
13:14
не работает 1С с веб-сервисами на java. точнее, неверно разбирает wsdl. а еще точнее, 1C "заточена" на веб-сервисы .net, а у них и у java'ских веб-сервисов wsdl разный!
проверяли - брали идентичный код на java и c#, собирали и смотрели. с c# работает, с java - нет
6 ShurupINC
 
20.03.10
13:29
Спасибо большое за ответ ... подозревал, но до последнего надеялся ...

Вот косяк ... а на более свежих релизах платформы? 8.1.15.хх или даже 8.2 тоже самое? И как обходят Жаберы эти грабли? Просто у меня на жабе написаны модули которые с сайтов поставщиков инфу тянут, вот думал к 1С её прикрутить через web-сервис ... Как теперь быть?
7 Asmody
 
20.03.10
13:45
(6) как вариант - "чуть" подправлять wsdl и прочие ответы сервиса. В теории все понятно, но до практического решения ни у кого руки не доходят
8 ShurupINC
 
20.03.10
14:07
Ок, понятно ... но допустим ответы сервиса наверное можно подправить ... а вот запросы как подправить? ведь по сути и запрос не верны - параметры метода ведь не иницализируются ... Как вариант конечно можно написать некую проксю, которая будет транслировать запрос/ответ серверу/клиенту, приводя их в "соответствие", но видимо это надо делать не на жабе, а тогда хрень получается - кусок на одном, ку сок на другом ... =)
Ошибка? Это не ошибка, это системная функция.