Имя: Пароль:
1C
 
Не могу заставить работать Web сервис, ошибка XDTO
0 Balansse
 
21.01.10
16:14
Здравствуйте!
Надеюсь на вашу помощь, бьюсь безрезультатно уже который день, как в стену уперся (
Ситуация такая. Есть сайт, предоставляющий веб сервис рассылки смс, адрес WSDL пакета таков:
http://promotion.md:8080/ecm/services/soap?wsdl

Создаю в конфигурации объект "WS-Ссылка", все создается без проблем.

Необходимо реализовать работу с этим сервисом из 1С.
Написал простенькую обработочку, которая обращается к функции GetCurrentCredit этого веб сервиса.

   Прокси = WSСсылки.SMS.СоздатьWSПрокси("http://soap.ecm.emotion.com/","EcmService","EcmServicePort");
   Фабрика = Прокси.ФабрикаXDTO;
   
   ПараметрТип = Фабрика.Тип("http://soap.ecm.emotion.com/","GetCurrentCredit");
   ЛогинТип = Фабрика.Тип("http://soap.ecm.emotion.com/","auth");
   Логин = Фабрика.Создать(ЛогинТип);    
   Логин.username = "username";
   Логин.password = "password";
   
   РезультатТип = Фабрика.Тип("http://soap.ecm.emotion.com/","result");
   Результат = Фабрика.Создать(РезультатТип);
   Результат = Прокси.GetCurrentCredit(Логин);

После запуска 1С думает и выкидывает вот такую вот ошибку:

{Обработка.Обработка2.Форма.Форма(90)}: Ошибка при вызове метода контекста (GetCurrentCredit): Ошибка вызова операции сервиса:  {http://soap.ecm.emotion.com/}:EcmService:GetCurrentCredit()
   Результат = Прокси.GetCurrentCredit(Логин);
по причине:
Ошибка вызова операции сервиса:  {http://soap.ecm.emotion.com/}:EcmService:GetCurrentCredit()
по причине:
Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://soap.ecm.emotion.com/}result - [1,179]
Проверка дополнительного свойства:
   форма: Элемент
   имя: amount
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://soap.ecm.emotion.com/}result - [1,179]
Проверка дополнительного свойства:
   форма: Элемент
   имя: amount
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://soap.ecm.emotion.com/}result

Причем ошибка не зависит от того, присваиваю ли я возвращаемый результат чему-то (в данном случае переменной Результат) или нет. Не зависит и от того, какие логин и пароль передаю. Возникает впечатление, что 1С просто не может обработать ответ с сервера... Что-то можно сделать? Может я что-то делаю не так? Очень прошу помощи, не первый день уже бьюсь с этой дрянью :(
1 Balansse
 
22.01.10
09:45
up
2 Mitriy
 
22.01.10
09:49
ошибка в веб-сервисе у тебя скорее всего... проверь, какой тип возвращает и как он описан в пакете...
3 Mitriy
 
22.01.10
09:51
млин... невнимательно прочитал сабж...
4 Balansse
 
22.01.10
09:51
Web сервис не мой, он предоставляется извне, и менять я его не могу. Разработчики заявляют что с C# он работает без проблем.
Может я что то не так определяю в обработке? Или это кривые руки девелоперов сервиса?
Сразу говорю, сервис не 1Совский.
5 Mitriy
 
22.01.10
09:57
а зачем вот это?
ПараметрТип = Фабрика.Тип("http://soap.ecm.emotion.com/","GetCurrentCredit");
ты ничего больше не забыл?
и это тоже непонятно
РезультатТип = Фабрика.Тип("http://soap.ecm.emotion.com/","result");
Результат = Фабрика.Создать(РезультатТип);
6 Balansse
 
22.01.10
10:11
Это просто я делал много попыток, чтобы заработало, забыл убрать. ДА и объявление результата тоже не нужно, но это не влияет на результат. Просто пытался уже подходить со всех сторон.
7 Balansse
 
22.01.10
11:15
Up
8 Mitriy
 
22.01.10
11:20
(7) через прокси работаешь? у меня было похожее, прокси мешал...
9 Balansse
 
22.01.10
12:40
А как обойти проблему? Интернет в офисе раздается через прокси, это да.
Пробовал дома, дома прокси нет (интернет раздается через рутер), возникла та же проблема. Может тогда дело не в прокси?
10 Balansse
 
22.01.10
14:35
Up
11 sergeystav
 
22.01.10
14:52
Что-то достучаться до http://promotion.md:8080/ecm/services/soap?wsdl
не могу
12 sergeystav
 
22.01.10
14:56
Результат = Прокси.GetCurrentCredit(Логин);

функция имеет параметры? может их больше или меньше? тип параметра - строка?
13 Balansse
 
22.01.10
15:06
Функция GetCurrentCredit() имеет один параметр auth.
Это структура со строчными параметрами username и password.
Система не ругается на недопустимый параметр, она почему то ругается на возвращаемое значение этой функции, которое имеет тип result.
14 sergeystav
 
22.01.10
15:17
при выполнении функции сервиса, может возникать внутренняя ошибка.
тут сервис в натуре пощупать надо, а доступа к нему нету
15 Balansse
 
22.01.10
16:02
У них похоже сервак лежал. Уже есть доступ.
Работал с этим сервисом через сайт http://www.soapclient.com/soaptest.html - все работает. Через 1с - не хочет.
16 Balansse
 
22.01.10
16:26
Up
17 AquaKosh
 
22.01.10
16:37
(16) Раньше 1С-ка не дружила с web-сервисами на Java...
18 Balansse
 
22.01.10
16:48
Разработчик заявляет, что сервис писался на .NET
19 acsent
 
22.01.10
16:58
Попробуй ответный xml сохранить в файл. И открыть его в фабрике
20 acsent
 
22.01.10
16:59
чтениеХМЛ = Новый ЧтениеXML;
чтениеХМЛ.УстановитьСтроку(СокрЛП(XML));

хдто = ФабрикаXDTO.ПрочитатьXML(чтениеХМЛ);
21 Balansse
 
22.01.10
17:09
А как сохранить ответ в файл? Ваш код, я так понимаю, читает уже сохраненный XML.
22 Balansse
 
22.01.10
17:41
Up
23 Balansse
 
23.01.10
11:48
Up
24 Balansse
 
25.01.10
14:07
Up
25 Balansse
 
26.01.10
14:56
Нужна помощь, не знаю в какую сторону копать. Если это глюк 1С (несостыковка со сторонним сервисом), как реализовать работу с этим веб сервисом сторонними средствами? Главное чтобы работало все через 1С
26 Vugluskr
 
26.01.10
15:08
Скорее глюк этого вебсервиса, проверь получится ли у тебя вебсервисом аэрофлота работать.
27 Balansse
 
26.01.10
15:39
С вебсервисом могу работать через сторонние средства, например такие как http://www.soapclient.com/soaptest.html

Аэрофлот проверить не могу, надо просить админа добавить мне его в разрешенный список... Даже если он заработает, что это мне даст?

Может можно как то сохранить ответный XML в файл, и вручную его обрабатыватть? Или вручную формировать XML и отправлять на сервер. Только как это реализовать? Вопрос критичен, к сожалению, в пятницу уже надо сдать рабочую версию, а решения все нет :(
28 Vugluskr
 
26.01.10
15:53
В браузере по ссылке http://promotion.md:8080/ecm/services/soap?wsdl ничего не вижу. А должен был получить wsdl. Не работает вебсервис?
29 Vugluskr
 
26.01.10
15:56
Упс.. нагнал - ff все показал, хром меня ввел в заблуждение.
30 DmitrO
 
26.01.10
16:42
хм.. а у меня выдает это:
Ошибка проверки данных XDTO: Структура объекта не соответствует типу: {http://soap.ecm.emotion.com/}result
Ошибка преобразования данных XDTO: Чтение объекта типа: {http://soap.ecm.emotion.com/}result - [1,217] Проверка дополнительного свойства: форма: Элемент имя: comment
Неизвестная ошибка. Ошибка преобразования данных XDTO: Чтение объекта типа: {http://soap.ecm.emotion.com/}result - [1,217] Проверка дополнительного свойства: форма: Элемент имя: comment
Ошибка вызова операции сервиса: {http://soap.ecm.emotion.com/}:EcmService:GetCurrentCredit()
Ошибка вызова операции сервиса: {http://soap.ecm.emotion.com/}:EcmService:GetCurrentCredit()
Ошибка при вызове метода контекста (GetCurrentCredit): Ошибка вызова операции сервиса: {http://soap.ecm.emotion.com/}:EcmService:GetCurrentCredit()
31 DmitrO
 
26.01.10
16:53
Вобщем 1С не может принять результат потому что он не соответствует схеме.
Элемент amount (на который 1С ругается в (0)) находится раньше значит его проверка проходит нормально.
Элемент comment задан в схеме как не обязательный и тип у него простая строка.

Вобщем без SOAP отладчика тут неразобраться (на худой конец просто сниффер пакетов).. :) надо смотреть голый xml который приходит с сервера.

В отладочных целях можно также сэмулировать SOAP запрос объектом HTTPСоединение и собственно получить сырой ответ от сервака.

Вобщем до ответа в виде XML добраться надо.
32 Balansse
 
26.01.10
16:54
вот какой должен быть ответ в сыром виде с сервера:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:GetCurrentCreditResponse xmlns:ns2="http://soap.ecm.emotion.com/"><return type="ok"><amount>10.0</amount></return></ns2:GetCurrentCreditResponse></soap:Body></soap:Envelope>
33 DmitrO
 
26.01.10
17:03
(32) В приведенном примере ответа отсутствует элемент recipient. По схеме он должен быть хотя бы один.
34 Balansse
 
26.01.10
17:08
Ну так не на него же ругается... Да и зачем в итоге серверу возвращать пустую инфу, если он просто возвращает то, что у него попросили?
35 DmitrO
 
26.01.10
17:12
Да, не на него. А то что в (32) это именно то что возвращает сервер по твоему запросу?

А тут логику искать не надо, надо просто чтобы все соответствовало схеме.
36 Широкий
 
26.01.10
17:22
(34) У тебя код остался таким же как и в (0)?
37 Balansse
 
26.01.10
17:25
Тот сырой XML текст, что я привел, это ответ сервера на функцию GetCurrentCredit(). Получено с помощью сайта, что я приводил выше.
38 Balansse
 
27.01.10
11:41
Up
39 Balansse
 
27.01.10
14:07
>>Может можно как то сохранить ответный XML в файл, и вручную его обрабатыватть? Или вручную формировать XML и отправлять на сервер. Только как это реализовать? Вопрос критичен, к сожалению, в пятницу уже надо сдать рабочую версию, а решения все нет :(
40 Balansse
 
27.01.10
16:35
Up
41 Serginio1
 
27.01.10
18:35
У меня была проблема с отладкой Вэб сервиса при передаче структуры. Если объявить через LocflHOST на сервере, то структура проходит. Если с другого компютера через глобальный адрес то метод ложится с ошибкой преобразования во втором байте чего то там.
42 Balansse
 
28.01.10
14:05
Up
43 Serginio1
 
28.01.10
16:47
Сделай на тоже Net или нативе Delphi или С++  Оле Объект который будет обращаться к серверу
44 xzorkiix
 
28.01.10
17:08
много букв. как я курил веб сервисы и их дружбу с 1С.

шаг первый - проверить сервис на одыкватность - использую soapUI 3.0 бесплатное. Удобное

шаг второй - при условии что выполнен первый - начинаем курить 1С.

импортируем в 1С сервис (это раз). Даже на этом этапе можно увидеть дружит 1С или нет с этим сервисом. Хоть и стандарт обще принятый, но то что курят одни системы 1С на отказ не курит.

домой приду попробую курнуть.
45 xzorkiix
 
28.01.10
17:18
кстати тож не могу получить тот самы wdsl =/

 Proxy Encountered Error
Connection Timeout: Could not contact the remote server. Possible causes include mistyped URL, transient network problems, overloaded remote server, and misconfigured proxy server.

хотя может и рабочая прокся пьет. так что с дому гляну
46 xzorkiix
 
28.01.10
22:55
Ошибка при вызове метода контекста (GetCurrentCredit): Ошибка вызова операции сервиса:  {http://soap.ecm.emotion.com/}:EcmService:GetCurrentCredit()


Есть нормальное описание работы сервиса и методов, а не только вашего представления ?

код для затравки (wdsl принят в конфу как ws-ссылка "WS")

Функция СоздатьПрокси(знач ИмяWS = "WS",
                     знач URI = "http://soap.ecm.emotion.com/",
                     знач ИмяСервис = "EcmService",
                     знач ИмяПорт = "EcmServicePort",
                     знач ИмяПользователяR3 = "",
                     знач ПарольR3 = "") Экспорт
   Попытка
       Прокси = WSСсылки[ИмяWS].СоздатьWSПрокси(URI, ИмяСервис, ИмяПорт);
       Прокси.Пользователь = ИмяПользователяR3;
       Прокси.Пароль       = ПарольR3;    
   Исключение
       Сообщить(ОписаниеОшибки());
       Прокси = Неопределено;
   КонецПопытки;
   
   возврат Прокси;
КонецФункции // СоздатьПрокси()
Функция СоздатьОписаниеТипаДанныхSOAP(ПространствоИмен = "http://soap.ecm.emotion.com/",
                                     ТипSOAP = "auth",
                                     Прокси = Неопределено)
                                     
   Если Прокси = Неопределено Тогда Прокси = СоздатьПрокси();
   КонецЕсли;
   
   ТипДанныхЭлементаSOAP = Неопределено;
   
   Если не Прокси = Неопределено Тогда
       Попытка
           ТипДанныхЭлементаSOAP = Прокси.ФабрикаXDTO.Пакеты.Получить(ПространствоИмен).Получить(ТипSOAP);
       Исключение
           возврат Неопределено;
       КонецПопытки;
   КонецЕсли;
   
   возврат ТипДанныхЭлементаSOAP;
КонецФункции

Процедура ТестSOAP() Экспорт
   Прокси = Неопределено;
   ТипДанныхЭлементаSOAP = СоздатьОписаниеТипаДанныхSOAP("http://soap.ecm.emotion.com/", "auth", Прокси);
   
   Логин = Прокси.ФабрикаXDTO.Создать(ТипДанныхЭлементаSOAP);
   Логин.username = "username";
   Логин.password = "password";
   
   Попытка
       РезультатSOAP = Прокси.GetCurrentCredit(Логин);
       Сообщить(РезультатSOAP);
   Исключение
       Сообщить(ОписаниеОшибки());
   КонецПопытки;
КонецПроцедуры
47 xzorkiix
 
28.01.10
22:59
Спалил малость свои переменный =)
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший