Как перенести движения регистра между идентичными базами 1С и ускорить выгрузку XML?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Причины зависания и разрастания файла XML

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

  1. Флаг «Выгружать при необходимости»: По умолчанию в обработке включена опция выгрузки связанных ссылочных данных. XML-сериализатор рекурсивно анализирует каждую запись регистра и тянет за собой все ссылки — документы-регистраторы, справочники, элементы аналитики, субконто и связанные с ними объекты. В результате выгружается практически вся база данных.
  2. Ограничения оперативной памяти: Выгрузка крупных объемов через DOM-модель в XML задействует оперативную память. В 32-разрядных клиентах 1С это приводит к исчерпанию лимита памяти, работе с файлом подкачки и полному зависанию процесса.

Способ 1. Отключение выгрузки ссылочных данных в обработке XML

Если ссылки на регистраторы и справочники уже присутствуют в целевой базе (например, при переносе из бэкапа), тянуть их повторно не требуется. Разберем порядок действий для настройки обработки «Выгрузка и загрузка данных XML»:

  1. Запустим обработку в базе-источнике.
  2. Отметим флажками только те регистры, движения которых необходимо перенести.
  3. Установим отбор по периоду выгрузки.
  4. Обязательно снимем флажок «Выгружать при необходимости» (выгружать ссылочные данные по ссылкам) для всех неиспользуемых типов и связанных объектов.
  5. Запустим процесс выгрузки. В файл попадут исключительно наборы записей регистра, а при загрузке в приемник платформа автоматически сопоставит их с имеющимися ссылками по уникальным идентификаторам (GUID).

Способ 2. Использование плана обмена

Проанализируем ситуацию, когда необходимо перенести данные без использования XML-обработки. В идентичных конфигурациях наиболее быстрым инструментом является механизм планов обмена:

  1. В базе-источнике и базе-приемнике создадим или задействуем существующий план обмена (произвольный или РИБ).
  2. Зарегистрируем для узла обмена только нужные наборы записей с помощью метода ПланыОбмена.ЗарегистрироватьИзменения().
  3. Выполним сеанс обмена. Потоковый механизм обмена данными мигрирует наборы записей автономно и с высокой скоростью, недостижимой для универсальной XML-выгрузки.

Способ 3. Перенос движений через COM-соединение

Рассмотрим вариант прямого переноса движений с помощью внешнего подключения. Этот способ пригодится, если требуется программно прочитать движения из бэкапа и сразу записать их в приемник.

В коде обработки устанавливается флаг ОбменДанными.Загрузка = Истина. Это отключает проведение документа и подчинённые обработчики, позволяя записать набор записей напрямую:


// Подключение к базе-источнику
COMОбъект = Новый COMОбъект("V83.COMConnector");
БазаИсточник = COMОбъект.Connect("Srvr=""ServerName"";Ref=""BaseName"";usr=""Admin"";pwd=""123"";");

// Запрос к движениям регистра в источнике
Запрос = БазаИсточник.NewObject("Запрос");
Запрос.Текст = 
    "ВЫБРАТЬ
    |	*
    |ИЗ
    |	РегистрНакопления.Продажи КАК Продажи
    |ГДЕ
    |	Продажи.Период МЕЖДУ &ДатаНачала И &ДатаОкончания";

Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);

Выборка = Запрос.Выполнить().Выбрать();

// Запись наборов данных в приемнике
Пока Выборка.Следующий() Цикл
    НаборЗаписей = РегистрыНакопления.Продажи.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
    
    // Отключаем проверки и обработчики
    НаборЗаписей.ОбменДанными.Загрузка = Истина;
    
    // Заполнение и запись набора
    // ...
    НаборЗаписей.Записать();
КонецЦикла;

Способ 4. Потоковая запись в JSON или FastInfoset

Если объём движений измеряется миллионами записей, эффективным решением станет написание собственной потоковой выгрузки через ЗаписьJSON или ЗаписьXML в формате FastInfoset. Потоковые механизмы не формируют DOM-дерево в оперативной памяти, благодаря чему выгрузка выполняется порциями и не вызывает зависания системы.

← На главную