Имя: Пароль:
1C
 
ЗаписатьXML и последующее изменение структуры метаданных
0 0xFFFFFF
 
19.01.16
14:34
Пытаюсь прикрутить простенькое версионирование, чтобы не тащить целую подсистему. Сохраняю объект через ЗаписатьXML, потом через ПрочитатьXML сравниваю. Все чудно работает, несколько строк кода, можно открыть старую версию, можно сравнить с новой и т.п. НО.
Если меняем структуру метаданных, естественно, через ПрочитатьXML объект не открывается.
Как преобразовать XML под новый вариант метаданных, используя значения старой версии?
1 ДенисЧ
 
19.01.16
14:37
не делай штатную сериализацию.
Нарисуй свой велосипед
2 Господин ПЖ
 
19.01.16
14:37
взять кусок из бсп
3 0xFFFFFF
 
19.01.16
14:37
Можно конечно написать преобразование самому - типа читаем пустой объект, обходим узлы сохраненного ХМЛ для чтения значений и заполняем "пустой" хмл. Но не комильфо, думаю есть более простые способы.
4 0xFFFFFF
 
19.01.16
14:38
(1) да ладно...
5 0xFFFFFF
 
24.01.16
15:50
Ну так что, красивых вариантов нет?
6 ДенисЧ
 
24.01.16
17:05
(5) Ну, я красивый... Но для тебя я не вариант...
7 Garykom
 
гуру
24.01.16
17:11
(5) прикрутить https://ru.wikipedia.org/wiki/XSLT ?
8 Записьдампа
 
24.01.16
17:49
(3) А ты сохраняешь версию объекта в XML с указанием пространства имен или без?
9 Serginio1
 
24.01.16
18:04
(0) Можно сохранять старую версию xsd и по ней десериализовыть.
10 0xFFFFFF
 
24.01.16
18:36
(9) Точняк, уже начитался, осталось понять, как выгрузить XSD схему отдельного объекта метаданных? Есть метод такой?
11 Serginio1
 
24.01.16
20:16
(10) Ну можно просто скопировать то что нужно. Либо удалить ненужное
12 0xFFFFFF
 
24.01.16
20:19
(11) Не... Я ведь с данными должен схему выгрузить - а схема должна быть актуальна на момент выгрузки. Если метаданные изменятся - то новая схема уже не подойдет.
13 Serg_1960
 
24.01.16
20:31
Те же проблемы и в стандартном в типовых конфигурациях версионировании: что делать с версиями, когда обновление изменяет метаданные?

Если особо не задумываться, то: загрузить версии из хранилища; обновить конфигурацию; выгрузить версии в хранилище. На первый и не только взгляд - абсурдное решение. Хотя с другой стороны... а что делать-то? Обновление не только метаданные изменяет, оно новые реквизиты - заполняет, существующие - может изменить значения.
14 Serginio1
 
24.01.16
20:38
(12) Схему выгрузил. Но она огромная. А из всей этой схемы тебе нужно несколько документов.

Можно держать 1 схему и её изменения.
15 Serg_1960
 
24.01.16
20:43
Схемы или правила конвертации - решение? Нет. Допустим, со временем произошло три обновления с изменением метаданных. И? И у вас в хранилище полно версий трех различных схем.
16 Serginio1
 
24.01.16
21:01
(15) При сохранении указывай нужную версию, а после изменения сохраняй схему и назначей ей версию. К сожалению это будет в ручном режиме
17 Serg_1960
 
24.01.16
21:23
Не выход. Даже если будешь знать информацию о версии конфигурации. Через пару/тройку обновлений с изменениями метаданных, эта информация будет уже ни о чём.

Не станешь же ты версию, времен Адама и Евы, последовательно прогонят через все изменения метаданных (всё это как-то и где-то хранить).

В типовых конфигурация последовательно процедуры обновления используются, когда "перескакиваешь" через версии - их тоже хранить будешь? Имхо, через чур замороченное решение получается :(
18 Serginio1
 
24.01.16
22:12
(17) Если ты будешь выгружать и сохранять в XSD каждую версию
то для десериализации используешь свою версию XSD.
19 vvp91
 
24.01.16
22:21
Сохраняй версию как структуру с полями, соответствующими реквизитам объекта, таб.части сохраняй как реквизиты типа массив структур.
Восстановление объекта из такой структуры проводи через создание объекта и заполнение значений свойств, таб. части восстанавливай через создание строк и заполнение значений свойств.

Кода получается мало и работает быстро (сопоставимо с XML сериализацией).
Функция копирования объекта в структуру занимает 33 строки, включая пустые строки разделители.
- для объекта из метаданных получаем стандартные реквизитов, реквизиты как поля структуры-копии;
- заполняем структуру-копию из объекта;
- для табчасти из списка табчастей из метаданных получаем стандартные реквизиты и реквизиты как поля структуры-строки, в структуру-копию добавляем поле с названием табчасти и типом Массив;
- для каждой строки текущей табчасти добавляем в массив структуру-строку с заполнением этой структуры из строки.
Функция восстановления объекта из структуры занимает те же 33 строки.
Версию храни в хранилище значения со сжатием данных.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан