Выгрузка и загрузка данных XML с отбором по регистрации на узле обмена

Доработанная обработка с примером кода

Задача: необходимо загрузить в свернутую копию базы все изменения из рабочей базы, сделанные за время свертки.

Для этого перед сверткой создали новый узел обмена в полном плане обмена, чтобы на нем регистрировались все изменения.

В штатной обработке «Выгрузка и загрузка данных XML» есть практически готовый блок, который позволяет сделать отбор данных по регистрации на узле обмена.

Команда «Недопустимые символы в плане обмена» фактически формирует нужный нам файл, но не записывает его.

Вот листинг новой процедуры по выгрузке, а во вложении уже изменная типовая обработка.

Процедура ВыполнитьВыгрузкуОбъектовИзПланаОбмена(СсылкаНаУзел, ИмяФайла) Экспорт

ОбъектыВыгруженныеСОшибками = Новый Соответствие;
ВсегоОбработаноОбъектов = 0;
КоличествоОшибок = 0;
Если СтрДлина(ИмяФайла) = 0 Тогда

#Если Клиент Тогда
Предупреждение("Не задано имя файла выгрузки");
#КонецЕсли
Возврат;

КонецЕсли;

СоставВыгрузки();
Если СоставПолнойВыгрузки.Количество() = 0
И ДополнительныеОбъектыДляВыгрузки.Количество() = 0 Тогда

#Если Клиент Тогда
Предупреждение("Не задан состав выгрузки");
#КонецЕсли
Возврат;

КонецЕсли;

Если Не ИспользоватьФорматFastInfoSet Тогда

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");

Иначе

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

КонецЕсли;

ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("_1CV8DtUD", "http://www.1c.ru/V8/1CV8DtUD/");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("V8Exch", "http://www.1c.ru/V8/1CV8DtUD/");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8",  "http://v8.1c.ru/data");
ЗаписьXML.ЗаписатьНачалоЭлемента("V8Exch:Data");

#Если Клиент Тогда
Сообщить("Начало выгрузки:   " + ТекущаяДата());
#КонецЕсли


МассивМетаданныхДляВыгрузки = Новый Массив();

Для Каждого СтрокаТаблицыВыгрузки Из СоставПолнойВыгрузки Цикл

СтрокаДереваМетаданных = СтрокаТаблицыВыгрузки.СтрокаДерева;

МассивМетаданныхДляВыгрузки.Добавить(СтрокаДереваМетаданных.ОбъектМД);

КонецЦикла;

Если МассивМетаданныхДляВыгрузки.Количество() = 0 Тогда
МассивМетаданныхДляВыгрузки = Неопределено;
КонецЕсли;

ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(СсылкаНаУзел, СсылкаНаУзел.НомерОтправленного + 1, МассивМетаданныхДляВыгрузки);
Пока ВыборкаИзменений.Следующий() Цикл

// имененный элемент
Данные = ВыборкаИзменений.Получить();

// данные должны быть
Если Данные = Неопределено Тогда
Продолжить;
КонецЕсли;

ЭтоУдаление = (мТипДанныхУдаления = ТипЗнч(Данные));

Если ЭтоУдаление Тогда
Продолжить;
КонецЕсли;

ВсегоОбработаноОбъектов = ВсегоОбработаноОбъектов + 1;

МетаданныеОбъекта = Данные.Метаданные();

Попытка

ВыполнитьВспомогательныеДействияДляЗаписиXML(ВсегоОбработаноОбъектов, ЗаписьXML, Истина);

ЗаписатьXML(ЗаписьXML, Данные);


Исключение

КоличествоОшибок = КоличествоОшибок + 1;

СтрокаОписанияОшибки = ОписаниеОшибки();

// для ссылочных добавляем ссылку, а для не ссылочных сам объект
ЭтоНеСсылка = Метаданные.РегистрыСведений.Содержит(МетаданныеОбъекта)
ИЛИ Метаданные.РегистрыНакопления.Содержит(МетаданныеОбъекта)
ИЛИ Метаданные.РегистрыБухгалтерии.Содержит(МетаданныеОбъекта)
ИЛИ Метаданные.Константы.Содержит(МетаданныеОбъекта);

Если ЭтоНеСсылка Тогда

ОбъектыВыгруженныеСОшибками.Вставить(Данные, СтрокаОписанияОшибки);

Иначе

Если ОбъектыВыгруженныеСОшибками.Получить(Данные.Ссылка) = Неопределено Тогда
ОбъектыВыгруженныеСОшибками.Вставить(Данные.Ссылка, СтрокаОписанияОшибки);
КонецЕсли;

КонецЕсли;

КонецПопытки;

#Если Клиент Тогда
Если ВсегоОбработаноОбъектов % 100 = 0 Тогда
Состояние("Выгруженных объектов - " + ВсегоОбработаноОбъектов + ", ошибок при выгрузке - " + КоличествоОшибок);
КонецЕсли;
#КонецЕсли

КонецЦикла;

ЗаписьXML.ЗаписатьКонецЭлемента(); //V8Exc:Data
ЗаписьXML.ЗаписатьКонецЭлемента(); //V8Exc:_1CV8DtUD

КонецПроцедуры

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *