Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

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

Сохранить ОбъектXDTO
Я
   alexei366
 
20.01.13 - 21:52
Мне необходимо хранить ОбъектXDTO  в базе, вроде всё просто: получаем xml строку ложим её в реквизит типа ХЗ, ну и в обратную сторону получаем объект через ФабрикуXDTO. Проблема следующая, ОбъектXDTO самописный и в нем есть обязательные свойства (обязательные теги я имею ввиду), но надо чтоб можно было сохранять как бы "черновик", который кстати нормально выгружается в строку xml но вот обратно ФабрикаXDTO считает что xml невалидный (что правда) и не создаёт ОбъектXDTO.

Вопрос такой можно ли какимто образом сохранить непосредственно ОбъектXDTO в базе.

P.S. единственное что пока придумал создавать в ПакетеXDTO клон объекта , у которого все поля необязательные.
 
 
   alexei366
 
1 - 20.01.13 - 21:58
АПП
   alexei366
 
2 - 21.01.13 - 09:35
Народ, поднимаю тему (к понедельнику)
   alexei366
 
3 - 21.01.13 - 12:20
Очередной раз поднимаю тему + ещё 1 вопросик : если во врем хранилище формы сохранен ОбъектXDTO, будет ли заметны задержки при серверных вызовах формы, если при каждом из них будет использован метод ПолучитьИзВременногоХранилища() данный объект и представим что в формате xml его размер будет составлять 10 мб
   Serginio1
 
4 - 21.01.13 - 12:26
Посмотри про Версионность в 1С. Там объекты сохраняются через сериализацию XDTO, а вот загружаются через ЧтениеXML
   alexei366
 
5 - 21.01.13 - 12:27
Данный Объект не является Объектом базы (не справочник не документ), так что Сериализатор мне не поможет
   Fragster
 
6 - 21.01.13 - 12:37
(0) нужно правильный тип при разворачивании обратно (и туда тоже). У тебя же пакет XDTO/WS схема описаны?
   Serginio1
 
7 - 21.01.13 - 12:38
Смотри РазборПредставленияОбъектаXML
(5) А какая разница У тебя есть объектXDTO. Объект XDTO прекрасно сериализуется в текст Фабрика.ЗаписатьXML(ЗаписьXML, Объект);.
 А вот обратно можно по аналогии с версионностью
   alexei366
 
8 - 21.01.13 - 12:39
Но он пока неиспользуется в WS, мож потом. Смысл в том что выгрузить в строку невалидный "черновик" (в плане наличия обязательных полей) объект я могу, а обратно в Объект в строку уже нет.
   Serginio1
 
9 - 21.01.13 - 12:43
(6) У него не все поля заполнены, поэтому при десериализации у него и выпадают. Для того, что бы поля не можно было не сериализовать нужно вроде как установить минимальное количество в 0.
http://www.lockator.com.ua/config1s/integration/77-xdto.html
   alexei366
 
10 - 21.01.13 - 12:44
Serginio1 ты попробуй посредством ФабрикиXDTO загрузить какойнить объект, удалив из его xml какой-нибудь обязательный элемент (к примеру наверно Ref-ссылка)
 
 Рекламное место пустует
   alexei366
 
11 - 21.01.13 - 12:45
Схема XSD внешняя, не я её придумал, и я уже в начале писал "P.S. единственное что пока придумал создавать в ПакетеXDTO клон объекта , у которого все поля необязательные.". Такчто хочу узнать есть ли другие варианты решения.
   AaNnDdRrEeYy
 
12 - 21.01.13 - 12:46
Собирай черновик сначало в другой тип данных например структуру или тз и сохраняй его хоть в хранилище значений, а когда собереш до конца заполниш XDTO, никак ты файл с помощью XDTO не прочитаешь если он не валидный, только используя чтение xml но это геморно.
   Serginio1
 
13 - 21.01.13 - 12:47
(10) Поэтому читай пост 7 и смотри функцию РазборПредставленияОбъектаXML.
   AaNnDdRrEeYy
 
14 - 21.01.13 - 12:49
(13) XDTO такая штука что она может без проблем записать такую  фигню что сама потом прочитать не сможет. Перед записью нужно вызывать метод Проверить() для предотврашения такой ситуаций.
   Serginio1
 
15 - 21.01.13 - 12:51
   alexei366
 
16 - 21.01.13 - 12:51
AaNnDdRrEeYy эт я знаю, думал насчет своего какогото гавна для хранения чернового варианта, но хотел всетаки хранить в xml строке созданной по xsd.
   alexei366
 
17 - 21.01.13 - 12:52
Serginio1 да я это уже и сам делал и использую, мне пока на лево от вопроса не надо.
   Serginio1
 
18 - 21.01.13 - 12:55
(17) А как ты объект в базе сохранишь, кроме как через сериализацию?
   alexei366
 
19 - 21.01.13 - 12:57
Ладно вопрос попроще. Я создаю ОбъектXDTO на остнове типа, и при выгрузке в строку имя корневого элемента устанавливается такое же как имя типа. Как мне правильно создать ОбъектXDTO на основе корневого свойства ПакетаXDTO (или только после создания ОбъектаXDTO сделать КорневойЭлемент.Наименование = "Корневой элемент";)
   alexei366
 
20 - 21.01.13 - 13:04
Serginio1 я храню стоку в ХЗ, а ХЗ в реквизите.
 ////////////////////  в строку
 
ЗаписьXML = Новый ЗаписьXML; 
        ЗаписьXML.УстановитьСтроку(Кодировка); 
        ЗаписьXML.ЗаписатьОбъявлениеXML(); 
        ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO); 
        СтрокаXML = ЗаписьXML.Закрыть();
 ////////////////////////// в объект
 
ЧтениеXML = Новый ЧтениеXML;
        ЧтениеXML.УстановитьСтроку(СокрЛП(Строка));
        ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипОбъекта);
   Serginio1
 
21 - 21.01.13 - 13:59
(20) Это понятно. Я так понимаю, что Для загрузки в клон, тебе нужно подменить тип объекта в строке.
Можно отдельно создать пакет,  полный клон только с необязательными свойствами, и выгрузить схему в файл.
И с объектом работать через фабрику с загруженной схемой
Фабрика = СоздатьФабрикуXDTO("ПутьКФайлу.xsd");
   alexei366
 
22 - 21.01.13 - 14:10
(21) А вот Фабрика = СоздатьФабрикуXDTO("ПутьКФайлу.xsd"); если каждый раз при получении объекта (или серверном вызове) мне xsd подгружать, то чувствую тормоза наверно будут. Я думал мож другой вариант есть преобразовать невалидный xml в ОбъектXDTO. Наверно придётся запариться и сделать как посоветовал (12) .
   Serginio1
 
23 - 21.01.13 - 14:36
(22) Проще работать со структурой. Она тоже прекрасно сериализуется.
   Serginio1
 
24 - 21.01.13 - 14:38
   AaNnDdRrEeYy
 
25 - 21.01.13 - 14:43
(22) а я чувствую что первая xsd схема не сможет прочитать файл созданный второй xsd схемой, простанства имен то у них разные
   Serginio1
 
26 - 21.01.13 - 14:46
(25) Почему разные, сделать клон в конфигурации и выгрузить в файл.
   AaNnDdRrEeYy
 
27 - 21.01.13 - 14:48
(26) ну если тока так, то да.
   Serginio1
 
28 - 21.01.13 - 15:11
(0) Структуру можешь создать 
Для каждого свойство из ОбъектXDTO.Свойства() Цикл
Резулт.Вставить(свойство.ИмяПоля,ОбъектXDTO[Свойство.Имя]);
КонецЦикла
   alexei366
 
29 - 21.01.13 - 15:44
(28) там не всё так просто. Там у меня получается Структура которая имеет значения типа структура или массив или какойто простой тип, и в свою очередь массив имеет в своих элементах структуру, и т.д.
   alexei366
 
30 - 21.01.13 - 15:47
(26) да на самом деле, можно хоть в том же пакете содать новый тип (черновик), единственное чем будут отличаться xml, так только названием корневого элемента, на что в свою очередь ФабрикеXDTO вообще   н а с р а т ь.
   Serginio1
 
31 - 21.01.13 - 16:41
(29) Ну можешь исследовать Свойство.Тип и рекурсивно вызывать для свойств массивов или структур.
   Serginio1
 
32 - 21.01.13 - 16:42
31 + По сути это аналог 15 только не на тексте, а на объекте XDTO


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует