Имя: Пароль:
1C
1С v8
Сериализация Хранилища Значений
,
0 Zanzarchik
 
27.09.13
09:38
Всем привет. Подскажите, пожалуйста, как перенести из одной базы в другую данные типа "ХранилищеЗначений". Пробую через xml. Сначала записываю:

    ЗаписьХМЛ = Новый ЗаписьXML;
    ЗаписьХМЛ.ОткрытьФайл("D:\doc.xml");
    ЗаписьХМЛ.ЗаписатьОбъявлениеXML();
    
    ЗаписьХМЛ.ЗаписатьНачалоЭлемента("Корневой");
    
    Для Каждого Строка Из Выгрузка Цикл
        
        ЗаписьХМЛ.ЗаписатьНачалоЭлемента("Пользователь");
        ЗаписьХМЛ.ЗаписатьАтрибут("Пользователь", ЗначениеВСтрокуВнутр(Строка.Пользователь));
        ЗаписьХМЛ.ЗаписатьАтрибут("ИмяОбъекта",ЗначениеВСтрокуВнутр(Строка.ИмяОбъекта));
        ЗаписьХМЛ.ЗаписатьАтрибут("НаименованиеНастройки",ЗначениеВСтрокуВнутр(Строка.НаименованиеНастройки));
        ЗаписьХМЛ.ЗаписатьАтрибут("СохраненнаяНастройка", ЗначениеВСтрокуВнутр(Строка.СохраненнаяНастройка));
        ЗаписьХМЛ.ЗаписатьАтрибут("ИспользоватьПриОткрытии", ЗначениеВСтрокуВнутр(Строка.ИспользоватьПриОткрытии));
        ЗаписьХМЛ.ЗаписатьАтрибут("СохранятьАвтоматически", ЗначениеВСтрокуВнутр(Строка.СохранятьАвтоматически));
        ЗаписьХМЛ.ЗаписатьКонецЭлемента();
        
    КонецЦикла;
    
    ЗаписьХМЛ.ЗаписатьКонецЭлемента();


Потом считываю в другой базе:

ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.ОткрытьФайл("D:\doc.xml");
Пока ЧтениеХМЛ.Прочитать() Цикл
        
Если ЧтениеХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            
    Если ЧтениеХМЛ.Имя = "Корневой" Тогда
            Продолжить;
    КонецЕсли;
            
        Строка = тз.Добавить();
    Строка.Пользователь = ЗначениеИзСтрокиВнутр(ЧтениеХМЛ.ПолучитьАтрибут("Пользователь"));
    Строка.ИмяОбъекта = ЗначениеИзСтрокиВнутр(ЧтениеХМЛ.ПолучитьАтрибут("ИмяОбъекта"));
    Строка.НаименованиеНастройки = ЗначениеИзСтрокиВнутр(ЧтениеХМЛ.ПолучитьАтрибут("НаименованиеНастройки"));
    Строка.СохраненнаяНастройка = ЗначениеИзСтрокиВнутр(ЧтениеХМЛ.ПолучитьАтрибут("СохраненнаяНастройка"));
    Строка.ИспользоватьПриОткрытии = ЗначениеИзСтрокиВнутр(ЧтениеХМЛ.ПолучитьАтрибут("ИспользоватьПриОткрытии"));
    Строка.СохранятьАвтоматически = ЗначениеИзСтрокиВнутр(ЧтениеХМЛ.ПолучитьАтрибут("СохранятьАвтоматически"));
            
    КонецЕсли;    
        
КонецЦикла;

Выдает ошибку:
{Форма.Форма.Форма(24)}: Ошибка при вызове метода контекста (ЗначениеИзСтрокиВнутр)
            Строка.СохраненнаяНастройка = ЗначениеИзСтрокиВнутр(ЧтениеХМЛ.ПолучитьАтрибут("СохраненнаяНастройка"));
по причине:
Ошибка преобразования
по причине:
Ошибка формата потока

Что делать? Как перенести ХранилищеЗначений из одной базы в другую.
1 wowik
 
27.09.13
09:48
запись:
ЗаписьXML.ЗаписатьНачалоЭлемента(Пользователь);
ЗаписатьXML(ЗаписьXML,ЗначениеХранилища);
ЗаписьXML.ЗаписатьКонецЭлемента();

чтение:
Значение = ПрочитатьXML(Чтение);

как то так вроде.
2 Zanzarchik
 
27.09.13
09:49
Ок, спасибо (1). Сейчас попробую.
3 Maxus43
 
27.09.13
10:00
Если объект Сериализуется - не надо естественно самому ни атрибуты, ни элементы xml писать
4 Zanzarchik
 
27.09.13
10:11
(3) там идет выборка из ТаблицаЗначений. Она сериализуется. Значит, мне просто написать ЗаписатьXML(ЗаписьXML, МояТаблицаЗначений)?
5 Zanzarchik
 
27.09.13
10:13
(1) Записать - все ок, чтение:
    ЧтениеХМЛ = Новый ЧтениеXML;
    ЧтениеХМЛ.ОткрытьФайл("D:\doc.xml");
    Пока ЧтениеХМЛ.Прочитать() Цикл
        Значение = ПрочитатьXML(ЧтениеХМЛ);
        КонецЦикла;

выдает ошибку:
{Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (ПрочитатьXML)
        Значение =ПрочитатьXML(ЧтениеХМЛ);
по причине:
по причине:
Значения данного типа не могут быть представлены в XML

Что не так делаю? Подскажите, пожалуйста.
6 Serginio1
 
27.09.13
10:26
СтрокаXML=XMLСтрока(ХранилищеКартинки );


Хранилище = XMLЗначение(Тип("ХранилищеЗначения"), СтрокаXML);
7 Maxus43
 
27.09.13
10:32
ЕМНИП - был косяк в СП, хранилище не сериализуется может реально? или то ТЗ? не помню точно, но есть в СП очепятка
8 Zanzarchik
 
27.09.13
10:41
(6) Спасибо, сделал вот так:
Запись:

    ЗаписьХМЛ.ОткрытьФайл("D:\doc.xml");
    Объект = СериализаторXDTO.ЗаписатьXDTO(Выгрузка);
    ФабрикаXDTO.ЗаписатьXML(ЗаписьХМЛ, Объект);        

Чтение:

    ЧтениеХМЛ = Новый ЧтениеXML;
    ЧтениеХМЛ.ОткрытьФайл("D:\doc.xml");
    Выгрузка = СериализаторXDTO.ПрочитатьXML(ЧтениеХМЛ);

Вот так все получается, Выгрузка - это таблица значений, в нее содержится ХранилищеЗначений.
9 Zanzarchik
 
27.09.13
10:41
Спасибо Всем! Тема закрыта.
10 Serginio1
 
27.09.13
10:50
(8) Лучше сразу записывать
СериализаторXDTO.ЗаписатьXML(ЗаписьХМЛ,Выгрузка);

Просто были релизы которые по разному записывали ФабрикаXDTO и СериализаторXDTO
11 Zanzarchik
 
27.09.13
13:07
(10)Спасибо, учту!