При попытке перенести движения регистров за небольшой период из архивной копии в рабочую базу с помощью стандартной обработки «Выгрузка и загрузка данных XML» пользователи часто сталкиваются с проблемой зависания процесса. Файл выгрузки разрастается до десятков гигабайт, а прогресс передачи данных останавливается. Рассмотрим, почему это происходит, и проанализируем эффективные способы быстрого переноса движений регистров.
Выясним причину, по которой обработка генерирует массивный файл и зависает при выгрузке всего двух регистров за полмесяца:
Если ссылки на регистраторы и справочники уже присутствуют в целевой базе (например, при переносе из бэкапа), тянуть их повторно не требуется. Разберем порядок действий для настройки обработки «Выгрузка и загрузка данных XML»:
Проанализируем ситуацию, когда необходимо перенести данные без использования XML-обработки. В идентичных конфигурациях наиболее быстрым инструментом является механизм планов обмена:
ПланыОбмена.ЗарегистрироватьИзменения().Рассмотрим вариант прямого переноса движений с помощью внешнего подключения. Этот способ пригодится, если требуется программно прочитать движения из бэкапа и сразу записать их в приемник.
В коде обработки устанавливается флаг ОбменДанными.Загрузка = Истина. Это отключает проведение документа и подчинённые обработчики, позволяя записать набор записей напрямую:
// Подключение к базе-источнику
COMОбъект = Новый COMОбъект("V83.COMConnector");
БазаИсточник = COMОбъект.Connect("Srvr=""ServerName"";Ref=""BaseName"";usr=""Admin"";pwd=""123"";");
// Запрос к движениям регистра в источнике
Запрос = БазаИсточник.NewObject("Запрос");
Запрос.Текст =
"ВЫБРАТЬ
| *
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
|ГДЕ
| Продажи.Период МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Выборка = Запрос.Выполнить().Выбрать();
// Запись наборов данных в приемнике
Пока Выборка.Следующий() Цикл
НаборЗаписей = РегистрыНакопления.Продажи.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
// Отключаем проверки и обработчики
НаборЗаписей.ОбменДанными.Загрузка = Истина;
// Заполнение и запись набора
// ...
НаборЗаписей.Записать();
КонецЦикла;
Если объём движений измеряется миллионами записей, эффективным решением станет написание собственной потоковой выгрузки через ЗаписьJSON или ЗаписьXML в формате FastInfoset. Потоковые механизмы не формируют DOM-дерево в оперативной памяти, благодаря чему выгрузка выполняется порциями и не вызывает зависания системы.