Имя: Пароль:
1C
1С v8
Сериализация ссылочных значений.
,
0 H A D G E H O G s
 
02.04.14
15:45
День добрый.

Столкнулся со следующим эффектом - при сериализации ссылки на объекты преобразуются в полноценные данные, как пример:

    СтруктураСДанными=Новый Структура;
    СтруктураСДанными.Вставить("Данные","Мама мыла раму");
    ТаблицаСДанными=Новый ТаблицаСДаннымиЗначений;
    ТаблицаСДанными.Колонки.Добавить("КолонкаДанных");
    ТаблицаСДанными.Добавить().КолонкаДанных=СтруктураСДанными;
    ТаблицаСДанными.Добавить().КолонкаДанных=СтруктураСДанными;
    ТаблицаСДанными.Добавить().КолонкаДанных=СтруктураСДанными; //Ссылка на структуру
    ТаблицаСДанными[2].КолонкаДанных.Вставить("Данные","Мама НЕ мыла раму"); //Данное значение уставиться во всех "структурах" таблицы
    Сообщить(ТаблицаСДанными[0].КолонкаДанных.Данные);
    
    Хранилище=Новый ХранилищеЗначения(ТаблицаСДанными);
    Константы.Хранилище.Установить(Хранилище);
    ТаблицаСДанными.Очистить();
    ТаблицаСДанными=Константы.Хранилище.Получить().Получить();
    
    ТаблицаСДанными[2].Данные.Вставить("Данные","Мама мыла раму"); //Данное значение уставиться только в данной "структуре" таблицы
    Сообщить(ТаблицаСДанными[0].Данные.Данные);
1 H A D G E H O G s
 
02.04.14
15:47
И завис.

Есть какие-то комментарии от 1С, типа - так и должно быть, используйте "плоские" объекты данных и не извращайтесь с нормализацией.
2 МихаилМ
 
02.04.14
15:49
что такое "ТаблицаСДаннымиЗначений" ?

в какой версии есть такое ?
3 Lama12
 
02.04.14
15:52
(2) Скорее всего, ТаблицаЗначений
4 H A D G E H O G s
 
02.04.14
15:52
(2) пардон.
Замена текста криво сработала, момент

    СтруктураСДанными=Новый Структура;
    СтруктураСДанными.Вставить("Данные","Мама мыла раму");
    ТаблицаСДанными=Новый ТаблицаЗначений;
    ТаблицаСДанными.Колонки.Добавить("КолонкаДанных");
    ТаблицаСДанными.Добавить().КолонкаДанных=СтруктураСДанными;
    ТаблицаСДанными.Добавить().КолонкаДанных=СтруктураСДанными;
    ТаблицаСДанными.Добавить().КолонкаДанных=СтруктураСДанными; //Ссылка на структуру
    ТаблицаСДанными[2].КолонкаДанных.Вставить("Данные","Мама НЕ мыла раму"); //Данное значение уставиться во всех "структурах" таблицы
    Сообщить(ТаблицаСДанными[0].КолонкаДанных.Данные);
    
    Хранилище=Новый ХранилищеЗначения(ТаблицаСДанными);
    Константы.Хранилище.Установить(Хранилище);
    ТаблицаСДанными.Очистить();
    ТаблицаСДанными=Константы.Хранилище.Получить().Получить();
    
    ТаблицаСДанными[2].КолонкаДанных.Вставить("Данные","Мама мыла раму"); //Данное значение уставиться только в данной "структуре" таблицы
    Сообщить(ТаблицаСДанными[0].КолонкаДанных.Данные);


Вот cf с примером, в единственной обработке
http://webfile.ru/0e569289fcfb9ef6902ac2e520c7db75
5 Serginio1
 
02.04.14
16:00
6 Infsams654
 
02.04.14
16:00
(0) это еще что. Можно в колонку не структуру, а еще ТЗ воткнуть, внутри, которой то же есть колонки с ТЗ. И так далее
7 H A D G E H O G s
 
02.04.14
16:03
(5) По этим причинам некоторые перегрузки конструктора DataContractSerializer имеют параметр preserveObjectReferences (по умолчанию ему задано значение false).Если этому параметру задано значение true, используется специальный метод кодирования ссылок на объект, который поддерживается только WCF.Если задано значение true, пример XML-кода выглядит следующим образом.


Это можно как то записать в параметры Записи XML ?
8 Serginio1
 
02.04.14
16:10
(7) Нет это только на .Net и их формат не совместим не поддерживает возможность взаимодействия с какими-либо другими технологиями


•XML-код, создаваемый сериализатором DataContractSerializer с помощью preserveObjectReferences  с заданным значением true, не поддерживает возможность взаимодействия с какими-либо другими технологиями, доступ к нему может осуществлять только другой экземпляр DataContractSerializer, для preserveObjectReferences которого также задано значение true.
9 alexei366
 
02.04.14
16:15
(0) Наскоко я понял, то когда ты первоначально создаешь таблицу и структуру, то у объекта структура имеется какойто свой идентификатор объекта, который собственно во все строки и подставляется.
Ну а при сохранении когда проходит сериализация , он естественно сериализует только данные идентификатор объекта в сериализации не участвует.
При востановлении таблицы он при востановлении структуры создает новые структуры со своими идентификаторами для каждой строки
10 H A D G E H O G s
 
02.04.14
16:18
(9) Ты все правильно понял.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан