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

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

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