Имя: Пароль:
1C
1С v8
Десериализация XDTO в web-сервисе
,
0 thezos
 
29.04.13
15:19
Сделал тестовый веб-сервис, создал метод, получающий в качестве параметра объект типа CatalogObject.Контрагенты, опубликовал, всё нормально. Использую SoapUI для тестов. Конфигурация БП2.0, контрагентов  десериализует и записывает нормально. А вот договоры не хочет, причем ругается на тег Parent. Это вроде бы родитель и я указываю пустую ссылку (00000000-0000-0000-0000-000000000000). Что я делаю не так?

Вот код метода сервиса:

Функция SendContract(Contract)
   
   // Создать сериализатор XDTO для глобальной фабрики XDTO
   НовыйСериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO);
       
   // Сериализовать ссылку из XML    
   ДоговорСсылка = НовыйСериализаторXDTO.ПрочитатьXDTO(Contract);
   
   Попытка
       ДоговорСсылка.Записать();
       Возврат "Success!!";
   Исключение
       Возврат ОписаниеОшибки();
   КонецПопытки;
   
КонецФункции

А вот входящие данные:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:uri="www.uri.com" xmlns:cur="http://v8.1c.ru/8.1/data/enterprise/current-config">
  <soap:Header/>
  <soap:Body>
     <uri:SendContract>
        <uri:Contract>
           <cur:IsFolder>false</cur:IsFolder>
           <cur:Ref>71602BEA-1BEA-4FB8-B03F-6C2E3390C999</cur:Ref>
           <cur:DeletionMark>False</cur:DeletionMark>
           <cur:Owner>71602BEA-1BEA-4FB8-B03F-6C2E3390C748</cur:Owner>
           <cur:Parent>00000000-0000-0000-0000-000000000000</cur:Parent>
           <cur:Code>1234567</cur:Code>
           <cur:Description>Dogovorrrrr</cur:Description>
           <!--Optional:-->
           <cur:ВалютаВзаиморасчетов>00000000-0000-0000-0000-000000000000</cur:ВалютаВзаиморасчетов>
           <!--Optional:-->
           <cur:Комментарий>Comment</cur:Комментарий>
           <!--Optional:-->
           <cur:Организация>00000000-0000-0000-0000-000000000000</cur:Организация>
           <!--Optional:-->
           <cur:ПроцентКомиссионногоВознаграждения>0</cur:ПроцентКомиссионногоВознаграждения>
           <!--Optional:-->
           <cur:СпособРасчетаКомиссионногоВознаграждения>НеРассчитывается</cur:СпособРасчетаКомиссионногоВознаграждения>
           <!--Optional:-->
           <cur:ТипЦен>00000000-0000-0000-0000-000000000000</cur:ТипЦен>
           <!--Optional:-->
           <cur:ВидДоговора>Прочее</cur:ВидДоговора>
           <!--Optional:-->
           <cur:УчетАгентскогоНДС>False</cur:УчетАгентскогоНДС>
           <!--Optional:-->
           <cur:ВидАгентскогоДоговора></cur:ВидАгентскогоДоговора>
           <!--Optional:-->
           <cur:РасчетыВУсловныхЕдиницах>False</cur:РасчетыВУсловныхЕдиницах>
           <!--Optional:-->
           <cur:РеализацияНаЭкспорт>False</cur:РеализацияНаЭкспорт>
           <!--Optional:-->
           <cur:ВидВзаиморасчетов>00000000-0000-0000-0000-000000000000</cur:ВидВзаиморасчетов>
           <!--Optional:-->
           <cur:Дата>2013-01-01T00:00:00.1Z</cur:Дата>
           <!--Optional:-->
           <cur:Номер>123</cur:Номер>
           <!--Optional:-->
           <cur:СрокДействия>2014-01-01T00:00:00.1Z</cur:СрокДействия>
           <!--Optional:-->
           <cur:УстановленСрокОплаты>False</cur:УстановленСрокОплаты>
           <!--Optional:-->
           <cur:СрокОплаты>0</cur:СрокОплаты>
           <!--Optional:-->
           <cur:НаименованиеДляСчетаФактурыНаАванс>00000000-0000-0000-0000-000000000000</cur:НаименованиеДляСчетаФактурыНаАванс>
           <!--Optional:-->
           <cur:ПорядокРегистрацииСчетовФактурНаАвансПоДоговору>НаВсеАвансы</cur:ПорядокРегистрацииСчетовФактурНаАвансПоДоговору>
           <!--Optional:-->
           <cur:НалоговыйАгентПоОплате>False</cur:НалоговыйАгентПоОплате>
           <!--Optional:-->
           <cur:ИспользуетсяПриОбменеДанными>True</cur:ИспользуетсяПриОбменеДанными>
        </uri:Contract>
     </uri:SendContract>
  </soap:Body>
</soap:Envelope>
1 Dethmont
 
29.04.13
15:23
А текст ошибки?
2 thezos
 
29.04.13
15:24
а да точно))

вот ответ сервиса:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Header/>
  <soap:Body>
     <soap:Fault>
        <soap:Code>
           <soap:Value>soap:Sender</soap:Value>
        </soap:Code>
        <soap:Reason>
           <soap:Text xml:lang="ru_RU">Неизвестная ошибка. {WebСервис.testws.Модуль(71)}: Ошибка при вызове метода контекста (ПрочитатьXDTO)
по причине:
{WebСервис.testws.Модуль(71)}: Ошибка при вызове метода контекста (ПрочитатьXDTO)
по причине:

по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: {http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogObject.ДоговорыКонтрагентов    Форма: Элемент    Тип: {http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogObject.ДоговорыКонтрагентов
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: Parent    Форма: Элемент    Тип: {http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogRef.ДоговорыКонтрагентов</soap:Text>;
        </soap:Reason>
     </soap:Fault>
  </soap:Body>
</soap:Envelope>
3 thezos
 
29.04.13
15:37
я уже и не знаю что думать, пустое значение тоже не принимает, ссылку на уже существующую группу тоже..
куда копать то?
4 AaNnDdRrEeYy
 
29.04.13
15:38
Договора подчинены контрагентам? если да то нельзя записать подчиненный элемент справочника без указания владельца. Это не в сервисе дело а в записи в базу
5 AaNnDdRrEeYy
 
29.04.13
15:40
+(4) пустую ссылку тоже нельзя указывать вместо
00000000-0000-0000-0000-000000000000
укажи нормальный гуид контрагента
6 thezos
 
29.04.13
15:42
(4) Всё верно, договора подчинены контрагентам, ссылку на владельца я указываю в теге owner.
(5) Parent - родитель, тип CatalogObject.ДоговорыКонтрагентов, пробовал указывать GUID уже созданной группы, но все равно ошибка та же
7 thezos
 
29.04.13
15:44
(5) Кстати, со справочником номенклатуры, например, если я гружу товар в корень, указывая пустую ссылку - нормально прожевывает...
8 AaNnDdRrEeYy
 
29.04.13
15:48
Родитель элемента "договора" подчинен тому же контрагенту что и элемент?
9 thezos
 
29.04.13
15:53
(8) да, я его создавал прямо в режиме предприятия в через карточку контрагента
10 Широкий
 
29.04.13
15:56
(8) Порядок реквизитов верный?
У тебя сначала идет IsFolder, потом Ref..

Должно наоборот
11 Широкий
 
29.04.13
15:58
+ у владельца обязательно дожен быть тип прописан
12 thezos
 
29.04.13
16:03
(10) Порядок такой как и при загрузке контрагентов, вообще структура входящих данных создана как раз утилиткой soapUI на основании wsdl описания сервиса.
(11) У владельца (тэг Owner) стоит AnyRef, ну такое описание платформа выгрузила - посмотрел xmlpad'ом. А вот у родителя (тэг Parent) - тип CatalogRef.ДоговорыКонтрагентов.
13 Serginio1
 
29.04.13
16:06
Для проверки сначала выгрузи реальный объект и посмотри.
Может у него нет иерархии и родитель не нужен.
(11) Если несколько владельцев то нужно указывать тип. Если один то нет.
14 Serginio1
 
29.04.13
16:10
Процедура ПоказатьОбъект(Объект)
   ЗаписьХМЛ= новый ЗаписьXML;
   ЗаписьХМЛ.УстановитьСтроку();
   записатьXML(ЗаписьХМЛ,Объект);
   текст=Новый ТекстовыйДокумент;
   Текст.УстановитьТекст(ЗаписьХМЛ.Закрыть());
   Текст.Показать();
   
КонецПроцедуры

А Contract это у тебя ОбъектXDTO или текст?
15 thezos
 
29.04.13
16:20
(14) ОбъектXDTO
16 Serginio1
 
29.04.13
16:24
А что говорит Contract.Проверить();
И зачем  НовыйСериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO);

Если есть СериализаторXDTO
17 Serginio1
 
29.04.13
16:29
У меня была проблема с чтением регистров сведений. Но со справочником проблем не было
18 Serginio1
 
29.04.13
16:35
Проверь через сериализацию Десериализацию объекта
ОбъектXDTO=СериализаторXDTO.ЗаписатьXDTO(Тз);
        ЗаписьХМЛ= Новый ЗаписьXML;
       ЗаписьХМЛ.УстановитьСтроку();

     ФабрикаXDTO.ЗаписатьXML(ЗаписьХМЛ, ОбъектXDTO);
   Стр=ЗаписьХМЛ.Закрыть();
   Сообщить(Стр);
   
   ЧтениеXML = Новый ЧтениеXML;
   
   ЧтениеXML.УстановитьСтроку(стр);
   ЧтениеXML.ПерейтиКСодержимому();
   ТипОбъектаXDTO=ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя);
   
   ОбъектXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипОбъектаXDTO);
   ОбъектXDTO.Проверить();
   
   Тз=СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO);
19 thezos
 
29.04.13
16:39
(16) Проверку проходит без ошибок. Всегда спотыкается на СериализаторXDTO.ПрочитатьXDTO(Contract);

(18) Спасибо, щас попробую
20 thezos
 
29.04.13
16:51
(18) Сериализация-десереализация тоже проходит без ошибок. Как же узнать что нужно ставить в поле Parent?
21 Serginio1
 
29.04.13
16:57
Сравни тексты
Стр=ЗаписьХМЛ.Закрыть();
22 Serginio1
 
29.04.13
16:58
Процедура ПоказатьОбъект(ОбъектXDTO)
   ЗаписьХМЛ= новый ЗаписьXML;
   ЗаписьХМЛ.УстановитьСтроку();
   ФабрикаXDTO.записатьXML(ЗаписьХМЛ,ОбъектXDTO);

   текст=Новый ТекстовыйДокумент;
   Текст.УстановитьТекст(ЗаписьХМЛ.Закрыть());
   Текст.Показать();
   
КонецПроцедуры
23 thezos
 
29.04.13
17:37
(22) Тексты почти одинаковые, в тэге Parent существующего договора стоит пустая ссылка из нулей..
Единственное отличие - у тега Owner явно указан тип "CatalogRef.Контрагенты", но когда пытаюсь указать его в soapUI - ругается на несоответствие, ведь в описании стоит тип "AnyRef".
24 Serginio1
 
29.04.13
17:42
Ну в это делается через указание тип
Например
Фабрика.Создать(Фабрика.Тип(пространствоимен,ТипСтр),Строка(ТекОбъект.ДокументОснованиеУИД));
25 Serginio1
 
29.04.13
17:44
Фабрика.Создать(Фабрика.Тип(пространствоимен,"CatalogRef.Контрагенты"),ВладелецУИД));

URIПространстваИмен="http://v8.1c.ru/8.1/data/enterprise/current-config";
26 thezos
 
29.04.13
17:44
(24) то есть придется еще доводить до ума полученный XDTO объект в модуле метода? чето неоптимально как то..
27 Serginio1
 
29.04.13
17:49
25+ То есть на клиенте должно быть что то такого
Объект.Owner=Фабрика.Создать(Фабрика.Тип(пространствоимен,"CatalogRef.Контрагенты"),ВладелецУИД));
28 Serginio1
 
29.04.13
17:51
Если поле имеет составной тип и значение не задано то нужно присваивать СсылкаNull
ТипNull=ФабрикаДляКомплексной.Тип("http://www.w3.org/2001/XMLSchema","anySimpleType");
       СсылкаNull=ФабрикаДляКомплексной.Создать(ТипNull);
29 thezos
 
29.04.13
18:06
(27) ВладелецУИД - это строка с гуидом?
30 Serginio1
 
29.04.13
18:11
(29) Да.
31 thezos
 
29.04.13
18:18
(30) Спасибо! Наконец всё получилось. Я бы и не догадался, что надо явно указывать тип, что в этом всё дело.. хотя это очевидно, меня сбило с толку, что он ругался на родителя
32 Serginio1
 
29.04.13
18:25
(31) А он родителя не может разобрать. Поэтому при ошибках нужно смотреть на предыдущий реквизит