Каталог решений - Инструменты обмена данными через xml используя сериализацию объектов

Инструменты обмена данными через xml используя сериализацию объектов

Инструменты обмена данными через xml используя сериализацию объектов

В наличии

Восстановление справочников, документов, регистров сведений из копии через xml, используя сериализацию объектов.
Выгрузка/загрузка объектов базы данных в xml, используя сериализацию.
Выгрузка/загрузка таблицы значений в xml, используя сериализацию.

Категория:

Описание

Предыстория: 

Конфигурация 1С на платформе 8.3. В ней есть замечательный механизм "поиск и замена ссылок". Переносил данные из нескольких баз на платформе 7.7 в одну базу на платформе 8.3. Элементы некоторые справочников задублировались (ключевые поля имели незначительные отличия в базах, хотя описывали одну сущность). Использовав механизм "поиска и замены" свернул эти справочники. Через несколько рабочих дней выяснилось, что пропало одно подразделение. Восстановил копию, проверил, на это подразделение в копии более 7 тысяч ссылок. Предприятие отработало на свернутой базе уже несколько дней, восстанавливаться из копии не вариант.

1) С чего начал: Функция НайтиПоСсылкам(МассивСсылок) — возвращает таблицу значений, содержащую Описание метаданных и ссылку на объект, содержащий искомую ссылку. Не все прошло гладко, поэтому некоторые документы догружал, получив выборку ссылок запросом. Вначале перенес элементы справочников, которые сворачивались, и которые содержались в документах со ссылкой на восстанавливаемое подразделение. 

Для выгрузки использовал вот такой кусок кода:

//Выгрузка объектов (справочников, документов) в xml используя сериализацию

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);
   ЗаписьXML.ЗаписатьНачалоЭлемента("Root");

       // допустим у нас есть Выборка из запроса, которая содержит ссылки на объекты
       Пока Выборка.Следующий() Цикл
          ЗаписьXML.ЗаписатьНачалоЭлемента("НовыйОбъект");
             лОбъект = Выборка.Ссылка.ПолучитьОбъект();
             ЗаписатьXML(ЗаписьXML,лОбъект);
          ЗаписьXML.ЗаписатьКонецЭлемента();
       КонецЦикла;
   ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();

 

Для загрузки:

 //Загрузка объектов (справочников, документов) из файла xml используя сериализацию

ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.ОткрытьФайл(ИмяФайла); 
ЧтениеХМЛ.Прочитать();   // получили Root   

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

2) Перепровел документы, но не все записи регистров сведений формируются при проведении документов. 

Регистры сведений переносил через сериализацию таблицы значений.

В чем плюсы:

1) в копии выбрал данные из регистра запросом по определенному фильтру и результат выгрузил в таблицу значений (в примере тз), тз выгрузил в xml. 

Код для выгрузки:

//Выгрузка таблицы значений в xml используя сериализацию

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);
СериализаторXDTO.ЗаписатьXML(ЗаписьXML,тз);
ЗаписьXML.Закрыть();

 

2) в базе получателе (напоминаю, что это наследник копии, из которой идет перенос данных, т.е. объекты по-умолчанию существуют) загрузил данные в таблицу значений. 

//Загрузка таблицы значений из xml используя сериализацию

ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяФайла);               

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстовыйДокумент.ПолучитьТекст());

ТипОбъектаXDTO = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/core","ValueTable");
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипОбъектаXDTO);
ОбъектXDTO.Проверить();

ЧтениеXML.Закрыть();

тз = СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO);

 

Таблица значений содержит уже ссылки на объекты текущей базы, ничего не нужно искать или сопоставлять. Ну, а дальше перебирал строки таблицы значений и по фильтру через МенеджерЗаписей считывал данные из текущей базы и подменял их на данные из копии, которые у меня содержались с строках таблицы значений.

has been added to your cart:
Оформление заказа