Введение
Обращалили вы внимание на то, что записи регистов бухгалтерии выгружаются нереально долго с помощью обработки Выгрузка-загрузка данных XML?
Все дело в том, что при получении структуры регистра (перечня колонок) используется виртуальная таблица ДвиженияССубконто без параметров.
Решение
В модуля обработки в процедуре ЗаписьЧерезНаборЗаписей() необходимо установить параметры периода при генерации текста запроса и отключить проверку на пустой результат запроса.
В итоге текст процедуры будет выглядеть следующим образом:
// Процедура записывает данные, доступ к которым осуществляется через набор записей
//
// Параметры
// ЗаписьXML - объект, через которых происходит запись объектов ИБ
// СтрокаДереваМетаданных - строка дерева метаданных, соответствующая регистру
//
Процедура ЗаписьЧерезНаборЗаписей(ЗаписьXML, МенеджерНабораЗаписей, ДляЗапроса, ИмяОбъекта,
СтрокаДереваМетаданных = Неопределено, ОбъектыВыгруженныеСОшибками, ТолькоПроверкаНедопустимыхСимволов, РегистрБухгалтерии = Ложь)
// получить состав колонок записи регистра и проверить наличие хотя бы одной записи
Если ДляЗапроса = "РегистрБухгалтерии." Тогда
ИмяТаблицыДляЗапроса = ДляЗапроса + ИмяОбъекта + ".ДвиженияССубконто(ДАТАВРЕМЯ(2012, 12, 21), ДАТАВРЕМЯ(2012, 12, 21), , , )"; // Моя вставка, Крынецкий. Установим параметры ВТ - так быстрее
Иначе
ИмяТаблицыДляЗапроса = ДляЗапроса + ИмяОбъекта;
КонецЕсли;
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 * ИЗ " + ИмяТаблицыДляЗапроса + " КАК ТаблицаОбъекта_" + ИмяОбъекта);
РезультатЗапросаПоСоставу = Запрос.Выполнить();
// Моя вставка, Крынецкий. Это отключим - результат теперь всегда для РБ будет пустой
//Если РезультатЗапросаПоСоставу.Пустой() Тогда
// Возврат;
//КонецЕсли;
// Конец моей вставки
ТаблицаДвижений = РезультатЗапросаПоСоставу.Выгрузить();
МассивКолонок = ПолучитьМассивКолонокДвижения(ТаблицаДвижений, РегистрБухгалтерии);
// выгрузка регистров осуществляется через его набор записей
НаборЗаписей = МенеджерНабораЗаписей.СоздатьНаборЗаписей();
Отбор = НаборЗаписей.Отбор;
СтрокаПолейОтбора = "";
Для Каждого ЭлементОтбора Из Отбор Цикл
Если Не ПустаяСтрока(СтрокаПолейОтбора) Тогда
СтрокаПолейОтбора = СтрокаПолейОтбора + ",";
КонецЕсли;
СтрокаПолейОтбора = СтрокаПолейОтбора + ЭлементОтбора.Имя;
КонецЦикла;
ПостроительОтчета = ПодготовитьПостроительДляВыгрузки(СтрокаДереваМетаданных, СтрокаПолейОтбора);
ПостроительОтчета.Выполнить();
РезультатЗапросаПоЗначениямОтбора = ПостроительОтчета.Результат;
ВыборкаИзРезультата = РезультатЗапросаПоЗначениямОтбора.Выбрать();
ОкноИсполненияОбщееКоличество = ВыборкаИзРезультата.Количество();
ОкноИсполненияОбработано = 0;
ОкноИсполнения.ОбновитьВерхнююГраницу();
КоличествоПолейОтбора = НаборЗаписей.Отбор.Количество();
// читаем наборы записей с различным составом отбора и записываем их
Пока ВыборкаИзРезультата.Следующий() Цикл
// Отбор устанавливаем для регистров, у которых есть хотя бы один отбор (измерение)
Если КоличествоПолейОтбора <> 0 Тогда
Для Каждого Колонка Из РезультатЗапросаПоЗначениямОтбора.Колонки Цикл
Отбор[Колонка.Имя].Значение = ВыборкаИзРезультата[Колонка.Имя];
Отбор[Колонка.Имя].ВидСравнения = ВидСравнения.Равно;
Отбор[Колонка.Имя].Использование = Истина;
КонецЦикла;
КонецЕсли;
НаборЗаписей.Прочитать();
Если мНаличиеВыгрузкиПодчиненныхОбъектов Тогда
// проверяем все записанные в наборе значения на необходимость записи "по ссылке"
ВыгрузитьПодчиненныеЗначенияНабора(ЗаписьXML, НаборЗаписей, МассивКолонок, ОбъектыВыгруженныеСОшибками, ТолькоПроверкаНедопустимыхСимволов);
КонецЕсли;
ВсегоОбработаноОбъектов = ВсегоОбработанныхЗаписей();
Попытка
ВыполнитьВспомогательныеДействияДляЗаписиXML(ВсегоОбработаноОбъектов, ЗаписьXML, ТолькоПроверкаНедопустимыхСимволов);
ЗаписатьXML(ЗаписьXML, НаборЗаписей);
Исключение
СтрокаОписанияОшибки = ОписаниеОшибки();
//не смогли записать в XML
// возможно проблема с недопустимыми символами в XML
Если ТолькоПроверкаНедопустимыхСимволов Тогда
НовыйНабор = МенеджерНабораЗаписей.СоздатьНаборЗаписей();
Для Каждого СтрокаОтбора Из НаборЗаписей.Отбор Цикл
СтрокаОтбораФормы = НовыйНабор.Отбор.Найти(СтрокаОтбора.Имя);
Если СтрокаОтбораФормы = Неопределено Тогда
Продолжить;
КонецЕсли;
СтрокаОтбораФормы.Использование = СтрокаОтбора.Использование;
СтрокаОтбораФормы.ВидСравнения = СтрокаОтбора.ВидСравнения;
СтрокаОтбораФормы.Значение = СтрокаОтбора.Значение;
КонецЦикла;
ОбъектыВыгруженныеСОшибками.Вставить(НовыйНабор, СтрокаОписанияОшибки);
Иначе
ИтоговаяСтрокаСообщения = "Ошибка при выгрузке набора записей регистра: " + ДляЗапроса + ИмяОбъекта + "
|" + СтрокаОписанияОшибки;
Сообщить(ИтоговаяСтрокаСообщения);
ВызватьИсключение ИтоговаяСтрокаСообщения;
КонецЕсли;
КонецПопытки;
ОбработанныхНаборовЗаписей = ОбработанныхНаборовЗаписей + 1;
ОкноИсполненияОбработано = ОкноИсполненияОбработано + 1;
ПоказатьПользователюИнформациюОСостоянииВыгрузки(ТолькоПроверкаНедопустимыхСимволов, ВсегоОбработаноОбъектов, ОбъектыВыгруженныеСОшибками);
КонецЦикла;
КонецПроцедуры