Имя: Пароль:
1C
1С v8
Ошибка при вызове метода web-сервиса.
0 shushik
 
07.02.13
14:21
В вкратце суть проблемы: есть веб-сервис из внешней системы. Там реализован метод с входным параметром и при вызове этого метода возникает ошибка: «Ошибка преобразования данных XDTO. Структура объекта не соответствует типу». Веб-сервис с которым возникает проблема реализован на стороне SAP.  До этого я работала с аналогичными веб-сервисами реализованными на Java и никогда таких проблем не возникало. Не понимаю в чем дело, может быть кто-то сталкивался с подобным.
Вот сохраненная wsdl данного сервиса: http://rusfolder.com/34890963

А теперь по порядку, как и что, делаю:
1.    Веб-сервис добавлен в конфигуратор в WS-ссылки.  
2.    Подключаю веб-сервис следующим образом
Процедура ПодключитьВебСервис()
   ИмяСервиса="z_service";
   ИмяПортаСервиса="z_service_bind";
   ПространствоИмен="urn:sap-com:document:sap:soap:functions:mc-style";
   ВебСервис=WSСсылки.WSintegrationSAP.СоздатьWSПрокси(ПространствоИмен,ИмяСервиса,ИмяПортаСервиса);
КонецПроцедуры
3.    Затем заполняю входной параметр для вызываемого метода
Функция ВходнойПараметр()
   ТипTableOfZmaraTab = ВебСервис.ФабрикаXDTO.Тип(ПространствоИмен, "TableOfZmaraTab");
   TableOfZmaraTab  = ВебСервис.ФабрикаXDTO.Создать(ТипTableOfZmaraTab);
   ТипZmaraTab = ВебСервис.ФабрикаXDTO.Тип(ПространствоИмен, "ZmaraTab");
   ZmaraTab    = ВебСервис.ФабрикаXDTO.Создать(ТипZmaraTab);
   ТипChar18  = ВебСервис.ФабрикаXDTO.Тип(ПространствоИмен, "char18");
   ТипChar18  = ВебСервис.ФабрикаXDTO.Тип(ПространствоИмен, "char18");
   ТипChar2   = ВебСервис.ФабрикаXDTO.Тип(ПространствоИмен, "char2");
   ТипChar40  = ВебСервис.ФабрикаXDTO.Тип(ПространствоИмен, "char40");
   ТипChar4000= ВебСервис.ФабрикаXDTO.Тип(ПространствоИмен, "char4000");
   ТипChar9   = ВебСервис.ФабрикаXDTO.Тип(ПространствоИмен, "char9");
   ТипUnit3   = ВебСервис.ФабрикаXDTO.Тип(ПространствоИмен, "unit3");
   ZmaraTab.Matnr = ВебСервис.ФабрикаXDTO.Создать(ТипChar18,  "Код");
   ZmaraTab.Maktx = ВебСервис.ФабрикаXDTO.Создать(ТипChar40,  "Наименование");
   ZmaraTab.Ferth = ВебСервис.ФабрикаXDTO.Создать(ТипChar18,  "Марка");
   ZmaraTab.Meins = ВебСервис.ФабрикаXDTO.Создать(ТипUnit3,   "Ед.");
   ZmaraTab.Matkl = ВебСервис.ФабрикаXDTO.Создать(ТипChar9,   "Группа");
   ZmaraTab.Attyp = ВебСервис.ФабрикаXDTO.Создать(ТипChar2,   "Тп");
   ZmaraTab.Lname = ВебСервис.ФабрикаXDTO.Создать(ТипChar4000,"Полное наименование");
   TableOfZmaraTab.item.Add(ZmaraTab);
   Возврат TableOfZmaraTab;
КонецФункции
4.    Затем вызываю метод с входным параметром
Процедура ПолучитьДанные()
   ПодключитьВебСервис();
   ВхПараметр = ВходнойПараметр();
   РезультатСервиса = ВебСервис.ZMatnrKug(ВхПараметр);
КонецПроцедуры

5.    В момент обращения к методу возникает вот такая ошибка
Ошибка при вызове метода контекста (ZMatnrKug): Ошибка вызова операции сервиса:  {urn:sap-com:document:sap:soap:functions:mc-style}:z_service:ZMatnrKug() РезультатСервиса = ВебСервис.ZMatnrKug(ВхПараметр);
по причине:
Ошибка вызова операции сервиса:  {urn:sap-com:document:sap:soap:functions:mc-style}:z_service:ZMatnrKug()
по причине:
Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {urn:sap-com:document:sap:soap:functions:mc-style}TableOfZmaraTab - [1,227]
Проверка дополнительного свойства:
   форма: Элемент
   имя: item
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {urn:sap-com:document:sap:soap:functions:mc-style}TableOfZmaraTab - [1,227]
Проверка дополнительного свойства:
   форма: Элемент
   имя: item
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {urn:sap-com:document:sap:soap:functions:mc-style}TableOfZmaraTab
1 shushik
 
07.02.13
15:23
Пожалуйста, помогите.
2 AndyR
 
07.02.13
15:47
1. У тебя переменная ВебСервис глобальная? Потому как в ПолучитьДанные() ее не видно.
2. Похоже, что доблестные сапёры поменяли тип ZmaraTab, а wsdl не обновили. Или шлют в ответ пакет с не соответствующей определению структурой ZmaraTab. Можно поставить сниффер, посмотреть что от них прилетает.
3 shushik
 
07.02.13
17:17
(2)1. Да, переменная ВебСервис глобальная. В ПолучитьДанные() ее видно, просто я не вставила в сообщение объявление переменных.
2. Говорят ничего не меняли. Похоже все-таки какая-то беда с типами. Ведь входной параметр с типом TableOfZmaraTab, прекрасно создается. А при передаче его методу оказывается, что у него не тот тип, хотя как он может быть не тот, когда создаю вроде именно такой тип, не понятно.
А подскажите, чем можно посмотреть что от них прилетает? Я обычно сервисы через soapUI смотрю, но сейчас в нем все работает, проблема возникает именно при обращении через 1С.
4 AndyR
 
07.02.13
17:21
Судя по ошибке. она возникает в момент возврата данных из САП-а, т.е. это они вам ерунду шлют. а не ваш параметр криво сформирован.
Посмотреть сниффером (сетевым монитором), это софт такой, который может пакеты сетевые перехватывать. На вскидку Microsoft Network Monitor, например
5 AndyR
 
07.02.13
17:22
А можно и soapUI на этот сервис направить, посмотреть что вернется и насколько соответствует структуре TableOfZmaraTab. Кстати, вариант, да.
6 shushik
 
07.02.13
18:59
Через soapUI структура вроде такая же как в описание. Но похоже все-таки 1С ее по другому воспринимает.Дальше хуже, саперы решили со своей стороны сделать преобразование типов через какую-то интеграционную шину и прислали новую ссылку. Но это ссылка не на wsdl, потому что когда я ее в браузере открываю пишет
Message Servlet is in Status OK
Status information:
Servlet com.sap.aii.af.mp.soap.web.MessageServlet (Version $Id: //tc/xi/NW04S_27_REL/src/_adapters/_soap/java/com/sap/aii/af/mp/soap/web/MessageServlet.java#1 $) bound to /MessageServlet
Classname ModuleProcessor: null
Lookupname for localModuleProcessorLookupName: localejbs/ModuleProcessorBean
Lookupname for remoteModuleProcessorLookupName: null
ModuleProcessorClass not instantiated
ModuleProcessorLocal is Instance of com.sap.aii.af.mp.processor.ModuleProcessorLocalLocalObjectImpl0_0
ModuleProcessorRemote not instantiated