Десериализация XDTO в web-сервисе #663259


#0 by thezos
Сделал тестовый веб-сервис, создал метод, получающий в качестве параметра объект типа CatalogObject.Контрагенты, опубликовал, всё нормально. Использую SoapUI для тестов. Конфигурация БП2.0, контрагентов  десериализует и записывает нормально. А вот договоры не хочет, причем ругается на тег Parent. Это вроде бы родитель и я указываю пустую ссылку (00000000-0000-0000-0000-000000000000). Что я делаю не так? Вот код метода сервиса: А вот входящие данные: <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">
#1 by Dethmont
А текст ошибки?
#2 by thezos
а да точно)) вот ответ сервиса:            <soap:Text xml:lang="ru_RU">Неизвестная ошибка. {WebСервис.testws.Модуль}: Ошибка при вызове метода контекста (ПрочитатьXDTO) по причине: {WebСервис.testws.Модуль}: Ошибка при вызове метода контекста (ПрочитатьXDTO) по причине: по причине: Ошибка преобразования данных XDTO: НачалоСвойства: {    Форма: Элемент    Тип: { по причине: Ошибка преобразования данных XDTO: НачалоСвойства: Parent    Форма: Элемент    Тип: {;
#3 by thezos
я уже и не знаю что думать, пустое значение тоже не принимает, ссылку на уже существующую группу тоже.. куда копать то?
#4 by AaNnDdRrEeYy
Договора подчинены контрагентам? если да то нельзя записать подчиненный элемент справочника без указания владельца. Это не в сервисе дело а в записи в базу
#5 by AaNnDdRrEeYy
+ пустую ссылку тоже нельзя указывать вместо 00000000-0000-0000-0000-000000000000 укажи нормальный гуид контрагента
#6 by thezos
Всё верно, договора подчинены контрагентам, ссылку на владельца я указываю в теге owner. Parent - родитель, тип CatalogObject.ДоговорыКонтрагентов, пробовал указывать GUID уже созданной группы, но все равно ошибка та же
#7 by thezos
Кстати, со справочником номенклатуры, например, если я гружу товар в корень, указывая пустую ссылку - нормально прожевывает...
#8 by AaNnDdRrEeYy
Родитель элемента "договора" подчинен тому же контрагенту что и элемент?
#9 by thezos
да, я его создавал прямо в режиме предприятия в через карточку контрагента
#10 by Широкий
Порядок реквизитов верный? У тебя сначала идет IsFolder, потом Ref.. Должно наоборот
#11 by Широкий
+ у владельца обязательно дожен быть тип прописан
#12 by thezos
Порядок такой как и при загрузке контрагентов, вообще структура входящих данных создана как раз утилиткой soapUI на основании wsdl описания сервиса. У владельца (тэг Owner) стоит AnyRef, ну такое описание платформа выгрузила - посмотрел xmlpad'ом. А вот у родителя (тэг Parent) - тип CatalogRef.ДоговорыКонтрагентов.
#13 by Serginio1
Для проверки сначала выгрузи реальный объект и посмотри. Может у него нет иерархии и родитель не нужен. Если несколько владельцев то нужно указывать тип. Если один то нет.
#14 by Serginio1
А Contract это у тебя ОбъектXDTO или текст?
#15 by thezos
ОбъектXDTO
#16 by Serginio1
А что говорит Contract.Проверить; И зачем  НовыйСериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO); Если есть СериализаторXDTO
#17 by Serginio1
У меня была проблема с чтением регистров сведений. Но со справочником проблем не было
#18 by Serginio1
Проверь через сериализацию Десериализацию объекта
#19 by thezos
Проверку проходит без ошибок. Всегда спотыкается на СериализаторXDTO.ПрочитатьXDTO(Contract); Спасибо, щас попробую
#20 by thezos
Сериализация-десереализация тоже проходит без ошибок. Как же узнать что нужно ставить в поле Parent?
#21 by Serginio1
#22 by Serginio1
#23 by thezos
Тексты почти одинаковые, в тэге Parent существующего договора стоит пустая ссылка из нулей.. Единственное отличие - у тега Owner явно указан тип "CatalogRef.Контрагенты", но когда пытаюсь указать его в soapUI - ругается на несоответствие, ведь в описании стоит тип "AnyRef".
#24 by Serginio1
Ну в это делается через указание тип Например Фабрика.Создать(Фабрика.Тип(пространствоимен,ТипСтр),Строка(ТекОбъект.ДокументОснованиеУИД));
#25 by Serginio1
#26 by thezos
то есть придется еще доводить до ума полученный XDTO объект в модуле метода? чето неоптимально как то..
#27 by Serginio1
25+ То есть на клиенте должно быть что то такого Объект.Owner=Фабрика.Создать(Фабрика.Тип(пространствоимен,"CatalogRef.Контрагенты"),ВладелецУИД));
#28 by Serginio1
Если поле имеет составной тип и значение не задано то нужно присваивать СсылкаNull
#29 by thezos
ВладелецУИД - это строка с гуидом?
#30 by Serginio1
Да.
#31 by thezos
Спасибо! Наконец всё получилось. Я бы и не догадался, что надо явно указывать тип, что в этом всё дело.. хотя это очевидно, меня сбило с толку, что он ругался на родителя
#32 by Serginio1
А он родителя не может разобрать. Поэтому при ошибках нужно смотреть на предыдущий реквизит
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С