Сохранить ОбъектXDTO #648196


#0 by alexei366
Мне необходимо хранить ОбъектXDTO  в базе, вроде всё просто: получаем xml строку ложим её в реквизит типа ХЗ, ну и в обратную сторону получаем объект через ФабрикуXDTO. Проблема следующая, ОбъектXDTO самописный и в нем есть обязательные свойства (обязательные теги я имею ввиду), но надо чтоб можно было сохранять как бы "черновик", который кстати нормально выгружается в строку xml но вот обратно ФабрикаXDTO считает что xml невалидный (что правда) и не создаёт ОбъектXDTO. Вопрос такой можно ли какимто образом сохранить непосредственно ОбъектXDTO в базе. P.S. единственное что пока придумал создавать в ПакетеXDTO клон объекта , у которого все поля необязательные.
#1 by alexei366
АПП
#2 by alexei366
Народ, поднимаю тему (к понедельнику)
#3 by alexei366
Очередной раз поднимаю тему + ещё 1 вопросик : если во врем хранилище формы сохранен ОбъектXDTO, будет ли заметны задержки при серверных вызовах формы, если при каждом из них будет использован метод ПолучитьИзВременногоХранилища данный объект и представим что в формате xml его размер будет составлять 10 мб
#4 by Serginio1
Посмотри про Версионность в 1С. Там объекты сохраняются через сериализацию XDTO, а вот загружаются через ЧтениеXML
#5 by alexei366
Данный Объект не является Объектом базы (не справочник не документ), так что Сериализатор мне не поможет
#6 by Fragster
нужно правильный тип при разворачивании обратно (и туда тоже). У тебя же пакет XDTO/WS схема описаны?
#7 by Serginio1
Смотри РазборПредставленияОбъектаXML А какая разница У тебя есть объектXDTO. Объект XDTO прекрасно сериализуется в текст Фабрика.ЗаписатьXML(ЗаписьXML, Объект);. А вот обратно можно по аналогии с версионностью
#8 by alexei366
Но он пока неиспользуется в WS, мож потом. Смысл в том что выгрузить в строку невалидный "черновик" (в плане наличия обязательных полей) объект я могу, а обратно в Объект в строку уже нет.
#9 by Serginio1
У него не все поля заполнены, поэтому при десериализации у него и выпадают. Для того, что бы поля не можно было не сериализовать нужно вроде как установить минимальное количество в 0.
#10 by alexei366
Serginio1 ты попробуй посредством ФабрикиXDTO загрузить какойнить объект, удалив из его xml какой-нибудь обязательный элемент (к примеру наверно Ref-ссылка)
#11 by alexei366
Схема XSD внешняя, не я её придумал, и я уже в начале писал "P.S. единственное что пока придумал создавать в ПакетеXDTO клон объекта , у которого все поля необязательные.". Такчто хочу узнать есть ли другие варианты решения.
#12 by AaNnDdRrEeYy
Собирай черновик сначало в другой тип данных например структуру или тз и сохраняй его хоть в хранилище значений, а когда собереш до конца заполниш XDTO, никак ты файл с помощью XDTO не прочитаешь если он не валидный, только используя чтение xml но это геморно.
#13 by Serginio1
Поэтому читай пост 7 и смотри функцию РазборПредставленияОбъектаXML.
#14 by AaNnDdRrEeYy
XDTO такая штука что она может без проблем записать такую  фигню что сама потом прочитать не сможет. Перед записью нужно вызывать метод Проверить для предотврашения такой ситуаций.
#15 by Serginio1
Посмотри
#16 by alexei366
AaNnDdRrEeYy эт я знаю, думал насчет своего какогото гавна для хранения чернового варианта, но хотел всетаки хранить в xml строке созданной по xsd.
#17 by alexei366
Serginio1 да я это уже и сам делал и использую, мне пока на лево от вопроса не надо.
#18 by Serginio1
А как ты объект в базе сохранишь, кроме как через сериализацию?
#19 by alexei366
Ладно вопрос попроще. Я создаю ОбъектXDTO на остнове типа, и при выгрузке в строку имя корневого элемента устанавливается такое же как имя типа. Как мне правильно создать ОбъектXDTO на основе корневого свойства ПакетаXDTO (или только после создания ОбъектаXDTO сделать КорневойЭлемент.Наименование = "Корневой элемент";)
#20 by alexei366
Serginio1 я храню стоку в ХЗ, а ХЗ в реквизите.
#21 by Serginio1
Это понятно. Я так понимаю, что Для загрузки в клон, тебе нужно подменить тип объекта в строке. Можно отдельно создать пакет,  полный клон только с необязательными свойствами, и выгрузить схему в файл. И с объектом работать через фабрику с загруженной схемой Фабрика = СоздатьФабрикуXDTO("ПутьКФайлу.xsd");
#22 by alexei366
А вот Фабрика = СоздатьФабрикуXDTO("ПутьКФайлу.xsd"); если каждый раз при получении объекта (или серверном вызове) мне xsd подгружать, то чувствую тормоза наверно будут. Я думал мож другой вариант есть преобразовать невалидный xml в ОбъектXDTO. Наверно придётся запариться и сделать как посоветовал .
#23 by Serginio1
Проще работать со структурой. Она тоже прекрасно сериализуется.
#24 by Serginio1
#25 by AaNnDdRrEeYy
а я чувствую что первая xsd схема не сможет прочитать файл созданный второй xsd схемой, простанства имен то у них разные
#26 by Serginio1
Почему разные, сделать клон в конфигурации и выгрузить в файл.
#27 by AaNnDdRrEeYy
ну если тока так, то да.
#28 by Serginio1
Структуру можешь создать Для каждого свойство из ОбъектXDTO.Свойства Цикл Резулт.Вставить(свойство.ИмяПоля,ОбъектXDTO[Свойство.Имя]); КонецЦикла
#29 by alexei366
там не всё так просто. Там у меня получается Структура которая имеет значения типа структура или массив или какойто простой тип, и в свою очередь массив имеет в своих элементах структуру, и т.д.
#30 by alexei366
да на самом деле, можно хоть в том же пакете содать новый тип (черновик), единственное чем будут отличаться xml, так только названием корневого элемента, на что в свою очередь ФабрикеXDTO вообще   н а с р а т ь.
#31 by Serginio1
Ну можешь исследовать Свойство.Тип и рекурсивно вызывать для свойств массивов или структур.
#32 by Serginio1
31 + По сути это аналог 15 только не на тексте, а на объекте XDTO
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

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