|
Десериализация 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) А он родителя не может разобрать. Поэтому при ошибках нужно смотреть на предыдущий реквизит
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |