8.х Бэкап регистра сведений.

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Bruno_it, 25 июн 2013.

  1. TopicStarter Overlay
    Bruno_it
    Offline

    Bruno_it

    Регистрация:
    16 авг 2012
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Добрый день! Хочу сделать бэкап регистра сведений, а затем его восстановить.
    Код обработки записи

    Код:
    
    Запись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, относится именно к этому узлу.
    В, общем вопрос такой как грамотно выгрузить регистр сведений, чтобы его потом можно было без проблем загрузить обратно?
  2. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    А не проше - сохранить его из формы списка в xls или mxl, а потом стандартной загрузкой табличных документов - восстановить
  3. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.991
    Симпатии:
    399
    Баллы:
    104
    Проще. Просто думаю, что автор не знает про это ))))
  4. TopicStarter Overlay
    Bruno_it
    Offline

    Bruno_it

    Регистрация:
    16 авг 2012
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Напишите, пожайлуста, подробнее как это сделать, я не очень много общался с 1с.
  5. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Открываете Ваш РС - (форму списка), на нем правой кнопкой - Вывести список - ставите все галочки и выводите его. Этот документ через Файл - Сохранить копию - сохраняете в xls или mxl.
    Затем в стандартных конфигурациях или на диске ИТС есть обработка "Загрузка данных из Табличного документа", ей при необходимости можно загрузить
  6. TopicStarter Overlay
    Bruno_it
    Offline

    Bruno_it

    Регистрация:
    16 авг 2012
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Вариант выглядит удобным. Но что если к примеру в регистре есть записи с одинаковым названием, но эти одинаковые названия являются ссылками на разные элементы справочника. Немного непонятно как в таком случае будет работать обработка. Будет искать перый элемент справочника с таким же названием как в таблице?
  7. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    ДА, есть такие ньюансы и будет искать так же. Но при загрузке - он вам на это сошлется. и укажет где именно он не мог однозначно определить.
    По этому есть второй вариант - это написать отчет - и выгрузить все что вам нужно с кодами, сфорировтаь отчет, сохранить его так же и загружать уже не по наименованию а по кодам
  8. TopicStarter Overlay
    Bruno_it
    Offline

    Bruno_it

    Регистрация:
    16 авг 2012
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Да, идея хорошая, тоже думал о кодах, но в справочниках в бд, с которой я работаю коды повторяются. Поэтому и принял решения сериализовать все объекты из регистра и засунуть их в 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="Конец"
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    
    Но очень нестройный вариант получается. Не покидает ощущение, что должен быть способ проще.
  9. TopicStarter Overlay
    Bruno_it
    Offline

    Bruno_it

    Регистрация:
    16 авг 2012
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Так не работает. Не для всех элементов почему-то определяет конец элемента. Вопрос остается открытым.
    Как последовательно считать xml файл и десериализовать его.
  10. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    зачем свой формат придумывать? есть обработка на диске итс "ВыгрузкаЗагрузкаДанныхXML". с помощью этой обработки можно выгрузить/загрузить регистр сведений.
  11. TopicStarter Overlay
    Bruno_it
    Offline

    Bruno_it

    Регистрация:
    16 авг 2012
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Я не в курсе был, сейчас попробую, спасибо за совет. А в этой стандартной обработке есть какие-нибудь подводные камни?Т.е. насколько точно она загружает данные?
    Данные в ней сериализуются, как я понял.
  12. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    у этой обработки есть серьезное ограничение - выгрузка/загрузка данных возможна только из идентичной конфигурации в идентичную. но в вашем случае, а думаю это некритично. вы же всегда можете 2 конфигурации "выровнять", чтобы они были идентичными..
  13. TopicStarter Overlay
    Bruno_it
    Offline

    Bruno_it

    Регистрация:
    16 авг 2012
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Попробовал выгрузить -загрузить регистр сведений. Создал несоколько элементов справочников с одинаковым названием - выгрузил, загрузил. Вроде ссылки на справочники записались в регистр правильно. Значит все таки данные сериализуются, это гуд. Да, регистр сведений вроде не планируется менять, значит в этой части конфигурации будут индентичны.
    Благодарю всех за помощь, особенно vartanet.

Поделиться этой страницей