Добрый день! Хочу сделать бэкап регистра сведений, а затем его восстановить. Код обработки записи Код: ЗаписьXml=Новый ЗаписьXML; ЗаписьXml.ОткрытьФайл(путь+ "\data.xml"); ЗаписьXml.ЗаписатьОбъявлениеXML(); ЗаписьXml.ЗаписатьНачалоЭлемента ("koren"); Запрос=Новый Запрос; Запрос.Текст="ТекстЗапроса " ; СпособВыборки=ОбходРезультатаЗапроса.Прямой; Результат=Запрос.Выполнить(); Выборка=Результат.Выбрать(СпособВыборки); сч=0; НовыйСериализатор = Новый СериализаторXDTO(ФабрикаXDTO); Пока Выборка.Следующий() цикл записьxml.ЗаписатьНачалоЭлемента( "record"); записьxml.ЗаписатьНачалоЭлемента( "period"); НовыйСериализатор.ЗаписатьXML(ЗаписьXML, Выборка.Период, НазначениеТипаXML.Явное); записьxml.ЗаписатьКонецЭлемента(); записьxml.ЗаписатьНачалоЭлемента( "doc"); НовыйСериализатор.ЗаписатьXML(ЗаписьXML,Выборка.Регистратор , НазначениеТипаXML.Явное); записьxml.ЗаписатьКонецЭлемента(); записьxml.ЗаписатьНачалоЭлемента( "act"); НовыйСериализатор.ЗаписатьXML(ЗаписьXML, Выборка.Активность, НазначениеТипаXML.Явное); записьxml.ЗаписатьКонецЭлемента(); записьxml.ЗаписатьНачалоЭлемента( "people"); НовыйСериализатор.ЗаписатьXML(ЗаписьXML,Выборка.Объект , НазначениеТипаXML.Явное); записьxml.ЗаписатьКонецЭлемента(); записьxml.ЗаписатьНачалоЭлемента( "LS"); НовыйСериализатор.ЗаписатьXML(ЗаписьXML, Выборка.ЛицевойСчет, НазначениеТипаXML.Явное); записьxml.ЗаписатьКонецЭлемента(); записьxml.ЗаписатьКонецЭлемента(); конеццикла; ЗаписьXml.ЗаписатьКонецЭлемента(); //koren Как теперь из этого файла прочитать сериализованные данные таким образом, чтобы было понятно, что они относятся к конкретной записи регистра сведений? Пробовал читать с помощью Dom - Код: НовыйСериализаторXDTO.XMLЗначение.Прочитать(УзелDom) , но это не работает - ругается на несоответствие параметра. Пробовал читать с помощью ЧтениеXML в цикле. Код: НовыйСериализаторXDTO.ПрочитатьXML(ЧтениеXML) Но таким образом можно только последовательно прочитать все xml теги. Но как извлечь при этом структуру record непонятно. Т.е. при таком способе непонятно, что Сериализованный тег внутри к примеру узла LS, относится именно к этому узлу. В, общем вопрос такой как грамотно выгрузить регистр сведений, чтобы его потом можно было без проблем загрузить обратно?
А не проше - сохранить его из формы списка в xls или mxl, а потом стандартной загрузкой табличных документов - восстановить
Открываете Ваш РС - (форму списка), на нем правой кнопкой - Вывести список - ставите все галочки и выводите его. Этот документ через Файл - Сохранить копию - сохраняете в xls или mxl. Затем в стандартных конфигурациях или на диске ИТС есть обработка "Загрузка данных из Табличного документа", ей при необходимости можно загрузить
Вариант выглядит удобным. Но что если к примеру в регистре есть записи с одинаковым названием, но эти одинаковые названия являются ссылками на разные элементы справочника. Немного непонятно как в таком случае будет работать обработка. Будет искать перый элемент справочника с таким же названием как в таблице?
ДА, есть такие ньюансы и будет искать так же. Но при загрузке - он вам на это сошлется. и укажет где именно он не мог однозначно определить. По этому есть второй вариант - это написать отчет - и выгрузить все что вам нужно с кодами, сфорировтаь отчет, сохранить его так же и загружать уже не по наименованию а по кодам
Да, идея хорошая, тоже думал о кодах, но в справочниках в бд, с которой я работаю коды повторяются. Поэтому и принял решения сериализовать все объекты из регистра и засунуть их в xml. И здесь тоже было бы все просто, если бы функции десириализации могли работать с DOМ. Сейчас с методом ЧтениеXML извращаюсь. Проверяю открыт ли родительский элемент, и если открыт записываю в ТЗ значение. Вот кусок кода, еще не дописал. Код: Пока ЧтениеXML .Прочитать() Цикл Если ЧтениеXml.ТипУзла=ТипУзлаXML.НачалоЭлемента тогда Если ЧтениеXml.Имя = "Record" тогда Нстр=Тз.Добавить(); нстр.RecordS="Начало" КонецЕсли; Если ЧтениеXML.ИМЯ="Period" тогда ОткрытЭЛПериод=1; КонецЕсли; Если ЧтениеXML.имя="datereg" тогда ОткрытЭЛДата=1; КонецЕсли; КонецЕсли; Если ЧтениеXml.ТипУзла=ТипУзлаXML.КонецЭлемента тогда Если ЧтениеXML.ИМЯ="Period" тогда ОткрытЭЛПериод=2; КонецЕсли; КонецЕсли; Если ЧтениеXML.имя="datereg" тогда ОткрытЭЛДата=2; КонецЕсли; Если ЧтениеXML.Имя="dateTime" тогда Если ОткрытЭЛПериод=1 тогда нстр.Период=НовыйСериализаторXDTO.ПрочитатьXML(ЧтениеXML); КонецЕсли; Если ОткрытЭЛДата=1 тогда нстр.Дата=НовыйСериализаторXDTO.ПрочитатьXML(ЧтениеXML); КонецЕсли; // Если ЧтениеXml.Имя = "CatalogRef.КВП_Проживающие" тогда // СсылкаНаСправочник= НовыйСериализаторXDTO.ПрочитатьXML(ЧтениеXML); // нстр.Проживающий= СсылкаНаСправочник; //КонецЕсли; Если ЧтениеXml.ТипУзла=ТипУзлаXML.КонецЭлемента тогда Если ЧтениеXml.Имя = "Record" тогда нстр.RecordF="Конец" КонецЕсли; КонецЕсли; КонецЦикла; Но очень нестройный вариант получается. Не покидает ощущение, что должен быть способ проще.
Так не работает. Не для всех элементов почему-то определяет конец элемента. Вопрос остается открытым. Как последовательно считать xml файл и десериализовать его.
зачем свой формат придумывать? есть обработка на диске итс "ВыгрузкаЗагрузкаДанныхXML". с помощью этой обработки можно выгрузить/загрузить регистр сведений.
Я не в курсе был, сейчас попробую, спасибо за совет. А в этой стандартной обработке есть какие-нибудь подводные камни?Т.е. насколько точно она загружает данные? Данные в ней сериализуются, как я понял.
у этой обработки есть серьезное ограничение - выгрузка/загрузка данных возможна только из идентичной конфигурации в идентичную. но в вашем случае, а думаю это некритично. вы же всегда можете 2 конфигурации "выровнять", чтобы они были идентичными..
Попробовал выгрузить -загрузить регистр сведений. Создал несоколько элементов справочников с одинаковым названием - выгрузил, загрузил. Вроде ссылки на справочники записались в регистр правильно. Значит все таки данные сериализуются, это гуд. Да, регистр сведений вроде не планируется менять, значит в этой части конфигурации будут индентичны. Благодарю всех за помощь, особенно vartanet.