Имя: Пароль:
1C
1С v8
Веб-сервис не воспринимает свой же тип входящего параметра :(
0 siggoron
 
23.04.12
22:29
Написан веб-сервис который имеет одну процедуру с одним входящим объектом. Входящий объект описан в XDТO пакете и имеет  2 свойства, одно строкового значение, другое число.
Вот в чем проблема: если в процедуру сервиса передавать  XDТO объект с указанием необходимого типа – всегда появляется ошибка «не соответствие типов», а если данному объекту указать тип по умолчанию, то проблем никаких, только вот все свойства получают строковый тип, что не есть хорошо.
Может, кто сталкивался с данной проблемой – помогите очень надо.
Вот куски кода:
Определения = Новый WSОпределения("http://localhost/CRM/ws/Mediaplan.1cws?wsdl", 1, 1);
   WS      = Новый WSПрокси(Определения, "http://www.sntex.1c.ru", "Mediaplan", "MediaplanSoap");
   WS.Пользователь = 1;
   WS.Пароль = 1;
   
   ИмяФайла = "D:\Kontragent.xml";
   МойXML = Новый ЧтениеXML;
   МойXML.ОткрытьФайл(ИмяФайла);
   //--//
   ФайлыXSD = Новый Массив();
   ФайлыXSD.Добавить("D:\M.xsd");
   МояФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD);
   адресТип = МояФабрикаXDTO.Тип("http://www.sntex.1c.ru", "Kontragent");
   //--//
   //Kontragent = МояФабрикаXDTO.ПрочитатьXML(МойXML, адресТип);  - так веб сервис выдает ошибку
   //Kontragent = МояФабрикаXDTO.ПрочитатьXML(МойXML);  - так веб-сервис работает но все значение приобретают строковый тип
   МойXML.Закрыть();
   
   Сообщить(""+WS.SetKontragent(Kontragent));
1 acsent
 
23.04.12
22:43
зачем через файл все делать?
2 siggoron
 
23.04.12
22:43
(1) какая разница, факт в том, что входной параметр не понимает свой родной тип
3 acsent
 
23.04.12
22:46
(2) значит файл не правильный
4 siggoron
 
23.04.12
22:56
(3) 100 правильный, т.к объект до вызова процедуры создается и без ошибок и с типами которые надо
5 acsent
 
23.04.12
22:57
и где же он создается? что то не видно
6 siggoron
 
23.04.12
23:02
Процедура ОсновныеДействияФормыСформироватьXMLКонтрагент(Кнопка)
   
   ФайлыXSD = Новый Массив();
   ФайлыXSD.Добавить("D:\M.xsd");
   МояФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD);
   адресТип = МояФабрикаXDTO.Тип("http://www.sntex.1c.ru", "Kontragent");
   
   Kontragent = МояФабрикаXDTO.Создать(адресТип);
   Kontragent.ID   = "id001";
   Kontragent.Type = 2;
   Kontragent.Name = "test1";
   Kontragent.INN  = "111111111";
   Kontragent.KPP  = "222222222";
   Kontragent.OGRN = "333333333";

   ИмяФайла = "D:\Kontragent.xml";
   МойXML = Новый ЗаписьXML;
   ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
   МойXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML);
   МойXML.ЗаписатьОбъявлениеXML();
   МояФабрикаXDTO.ЗаписатьXML(МойXML, Kontragent);
   МойXML.Закрыть();
   
КонецПроцедуры


А схема получена экспортом средствами конфы
7 siggoron
 
23.04.12
23:33
Всё нашел проблему, а вот что помогло:
Каждый клиентский прокси (клиентская часть web-сервиса - объект WSПрокси) содержит ссылку на фабрику XDTO, которая может использоваться для создания объектов и значений XDTO для передачи в качестве параметров и возвращаемых значений операций web-сервисов. Заметим, что глобальная XDTO фабрика (получаемая через свойство глобального контекста ФабрикаXDTO) не может быть использована для создания объектов и значений для передачи через прокси, даже если она содержит типы с такой же структурой и именами. Эти типы все равно будут считаться несовместимыми с типами данных web-сервиса.

Каждая реализация веб-сервиса (серверная часть web-сервиса) может использовать глобальную XDTO фабрику (получаемую через свойство глобального контекста ФабрикаXDTO) для создания объектов и значений web-сервиса.
8 siggoron
 
23.04.12
23:36
Вот рабочий код:


Процедура SetKontragentНажатие(Элемент)
   
   Определения = Новый WSОпределения("http://localhost/CRM/ws/Mediaplan.1cws?wsdl", 1, 1);
   WS      = Новый WSПрокси(Определения, "http://www.sntex.1c.ru", "Mediaplan", "MediaplanSoap");
   WS.Пользователь = 1;
   WS.Пароль = 1;
   
   ИмяФайла = "D:\Kontragent.xml";
   МойXML = Новый ЧтениеXML;
   МойXML.ОткрытьФайл(ИмяФайла);
   
   WSТип = WS.ФабрикаXDTO.Тип("http://www.sntex.1c.ru", "Kontragent");
   
   Kontragent = WS.ФабрикаXDTO.ПрочитатьXML(МойXML, WSТип);
   МойXML.Закрыть();
   
   Сообщить(""+WS.SetKontragent(Kontragent));
   
КонецПроцедуры