Выгрузка и загрузка данных XML. Ускоряем выгрузку регистров бухгалтерии

Ускоренная выгрузка проводок БУ, НУ

Введение

Обращалили вы внимание на то, что записи регистов бухгалтерии выгружаются нереально долго с помощью обработки Выгрузка-загрузка данных XML?

Все дело в том, что при получении структуры регистра (перечня колонок) используется виртуальная таблица ДвиженияССубконто без параметров.

 

Решение

В модуля обработки в процедуре ЗаписьЧерезНаборЗаписей() необходимо установить параметры периода при генерации текста запроса и отключить проверку на пустой результат запроса.

В итоге текст процедуры будет выглядеть следующим образом:

// Процедура записывает данные, доступ к которым осуществляется через набор записей
//
// Параметры
//   ЗаписьXML - объект, через которых происходит запись объектов ИБ
//   СтрокаДереваМетаданных - строка дерева метаданных, соответствующая регистру
//
Процедура ЗаписьЧерезНаборЗаписей(ЗаписьXML, МенеджерНабораЗаписей, ДляЗапроса, ИмяОбъекта,
СтрокаДереваМетаданных = Неопределено, ОбъектыВыгруженныеСОшибками, ТолькоПроверкаНедопустимыхСимволов, РегистрБухгалтерии = Ложь)

// получить состав колонок записи регистра и проверить наличие хотя бы одной записи
Если ДляЗапроса = "РегистрБухгалтерии." Тогда
ИмяТаблицыДляЗапроса = ДляЗапроса + ИмяОбъекта + ".ДвиженияССубконто(ДАТАВРЕМЯ(2012, 12, 21), ДАТАВРЕМЯ(2012, 12, 21), , , )"; // Моя вставка, Крынецкий. Установим параметры ВТ - так быстрее
Иначе
ИмяТаблицыДляЗапроса = ДляЗапроса + ИмяОбъекта;
КонецЕсли;

Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 * ИЗ " + ИмяТаблицыДляЗапроса + " КАК ТаблицаОбъекта_" + ИмяОбъекта);
РезультатЗапросаПоСоставу = Запрос.Выполнить();
// Моя вставка, Крынецкий. Это отключим - результат теперь всегда для РБ будет пустой
//Если РезультатЗапросаПоСоставу.Пустой() Тогда
// Возврат;
//КонецЕсли;
// Конец моей вставки

ТаблицаДвижений = РезультатЗапросаПоСоставу.Выгрузить();
МассивКолонок = ПолучитьМассивКолонокДвижения(ТаблицаДвижений, РегистрБухгалтерии);

// выгрузка регистров осуществляется через его набор записей
НаборЗаписей = МенеджерНабораЗаписей.СоздатьНаборЗаписей();

Отбор = НаборЗаписей.Отбор;
СтрокаПолейОтбора = "";
Для Каждого ЭлементОтбора Из Отбор Цикл
Если Не ПустаяСтрока(СтрокаПолейОтбора) Тогда
СтрокаПолейОтбора = СтрокаПолейОтбора + ",";
КонецЕсли;
СтрокаПолейОтбора = СтрокаПолейОтбора + ЭлементОтбора.Имя;
КонецЦикла;

ПостроительОтчета = ПодготовитьПостроительДляВыгрузки(СтрокаДереваМетаданных, СтрокаПолейОтбора);
ПостроительОтчета.Выполнить();
РезультатЗапросаПоЗначениямОтбора = ПостроительОтчета.Результат;
ВыборкаИзРезультата = РезультатЗапросаПоЗначениямОтбора.Выбрать();

ОкноИсполненияОбщееКоличество = ВыборкаИзРезультата.Количество();
ОкноИсполненияОбработано = 0;
ОкноИсполнения.ОбновитьВерхнююГраницу();

КоличествоПолейОтбора = НаборЗаписей.Отбор.Количество();

// читаем наборы записей с различным составом отбора и записываем их
Пока ВыборкаИзРезультата.Следующий() Цикл

// Отбор устанавливаем для регистров, у которых есть хотя бы один отбор (измерение)
Если КоличествоПолейОтбора <> 0 Тогда

Для Каждого Колонка Из РезультатЗапросаПоЗначениямОтбора.Колонки Цикл
Отбор[Колонка.Имя].Значение = ВыборкаИзРезультата[Колонка.Имя];
Отбор[Колонка.Имя].ВидСравнения = ВидСравнения.Равно;
Отбор[Колонка.Имя].Использование = Истина;
КонецЦикла;

КонецЕсли;

НаборЗаписей.Прочитать();

Если мНаличиеВыгрузкиПодчиненныхОбъектов Тогда

// проверяем все записанные в наборе значения на необходимость записи "по ссылке"
ВыгрузитьПодчиненныеЗначенияНабора(ЗаписьXML, НаборЗаписей, МассивКолонок, ОбъектыВыгруженныеСОшибками, ТолькоПроверкаНедопустимыхСимволов);

КонецЕсли;

ВсегоОбработаноОбъектов = ВсегоОбработанныхЗаписей();
Попытка

ВыполнитьВспомогательныеДействияДляЗаписиXML(ВсегоОбработаноОбъектов, ЗаписьXML, ТолькоПроверкаНедопустимыхСимволов);

ЗаписатьXML(ЗаписьXML, НаборЗаписей);

Исключение

СтрокаОписанияОшибки = ОписаниеОшибки();
//не смогли записать в XML
// возможно проблема с недопустимыми символами в XML
Если ТолькоПроверкаНедопустимыхСимволов Тогда

НовыйНабор = МенеджерНабораЗаписей.СоздатьНаборЗаписей();

Для Каждого СтрокаОтбора Из НаборЗаписей.Отбор Цикл

СтрокаОтбораФормы = НовыйНабор.Отбор.Найти(СтрокаОтбора.Имя);

Если СтрокаОтбораФормы = Неопределено Тогда
Продолжить;
КонецЕсли;

СтрокаОтбораФормы.Использование = СтрокаОтбора.Использование;
СтрокаОтбораФормы.ВидСравнения = СтрокаОтбора.ВидСравнения;
СтрокаОтбораФормы.Значение = СтрокаОтбора.Значение;

КонецЦикла;

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

Иначе

ИтоговаяСтрокаСообщения = "Ошибка при выгрузке набора записей регистра: " + ДляЗапроса + ИмяОбъекта + "
|" + СтрокаОписанияОшибки;

Сообщить(ИтоговаяСтрокаСообщения);

ВызватьИсключение ИтоговаяСтрокаСообщения;

КонецЕсли;

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

ОбработанныхНаборовЗаписей = ОбработанныхНаборовЗаписей + 1;
ОкноИсполненияОбработано = ОкноИсполненияОбработано + 1;

ПоказатьПользователюИнформациюОСостоянииВыгрузки(ТолькоПроверкаНедопустимыхСимволов, ВсегоОбработаноОбъектов, ОбъектыВыгруженныеСОшибками);

КонецЦикла;

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

Leave a Comment

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