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

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

Перенос накопленного массива данных между двумя одинаковыми конфигурациями 1С — распространенная задача. Типичный сценарий: создание архивной копии базы для закрытия месяца, выверки учета и исправления ошибок с последующим возвратом накопленных в рабочей базе оперативных документов обратно в исправленную копию. Рассмотрим, какие механизмы платформы использовать для решения этой задачи, как избежать критического разрастания файлов обмена и защитить данные от повреждения.

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

Выясним причину долгой выгрузки и разрастания файлов XML

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

  1. Выгрузка движений регистров: записи регистров накопления, бухгалтерии и сведений составляют от 70% до 90% общего объема базы. Выгрузка документов вместе с их проводками и движениями многократно раздувает XML-файл и перегружает оперативную память при загрузке.
  2. Перенос присоединенных файлов: сканы документов и двоичные данные, хранящиеся в реквизитах типа ХранилищеЗначения, при сериализации кодируются в Base64, что увеличивает их размер на треть.
  3. Срабатывание событий бизнес-логики: если загрузка происходит без режима обмена данными, платформа выполняет все подписки на события ПередЗаписью и ПриЗаписи, повторно валидируя каждый реквизит.
  4. Затирание исправлений: при загрузке движений регистров из «грязной» рабочей базы в «исправленную» копию все результаты ручных корректировок и перепроведений будут полностью перезаписаны старыми некорректными данными.

Способ 1. Использование обработки «Выгрузка и загрузка данных XML»

Для конфигураций с полностью идентичной структурой метаданных базовым инструментом является внешняя обработка с диска ИТС «Выгрузка и загрузка данных XML» (ВыгрузкаЗагрузкаДанныхXML.epf). В отличие от обработки «Универсальный обмен данными XML», она не требует составления правил конвертации и оперирует прямыми структурами метаданных платформы.

Разберем по шагам правильную настройку выгрузки:

  1. Открываем обработку в базе-источнике на вкладке Выгрузка.
  2. Устанавливаем период для выборки документов (например, последние 2 месяца).
  3. Снимаем флаги со всех регистров! Выгружать необходимо только шапки и табличные части документов, а также новые элементы справочников.
  4. Для справочников активируем опцию выгрузки «Только при необходимости» (по ссылке), чтобы выгрузились лишь те контрагенты, договоры и номенклатура, которые реально задействованы в переносимых документах.
  5. В базе-приемнике при загрузке включаем опцию «Не замещать существующие объекты». Это защитит ранее исправленные в копии документы и справочники от перезаписи старыми данными из источника.
  6. После успешного завершения загрузки выполняем групповое проведение перенесенных документов непосредственно в целевой базе для автоматического формирования движений по регистрам.

Способ 2. Регистрация изменений и обмен через планы обмена

Если объем данных велик, а ручная выгрузка XML-файлов занимает много времени, рассмотрим механизм планов обмена. В платформе 1С сериализация данных через сообщения обмена оптимизирована на уровне ядра:

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

Посмотрим на пример программной регистрации документов по периоду:


УзелОбмена = ПланыОбмена.ОбменДанными.НайтиПоКоду("КопияБазы");

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

Способ 3. Прямой перенос данных через COM-соединение

Для автоматизации переноса без создания тяжелых промежуточных файлов на диске используем прямое подключение к базе через V83.COMConnector. Загрузка выполняется в контексте целевой базы порциями с управлением транзакциями.

Рассмотрим пример создания объектов с отключением проверок через свойство ОбменДанными.Загрузка:


Подключение = Новый COMОбъект("V83.COMConnector");
ПараметрыПодключения = "Srvr=""ServerName"";Ref=""SourceBase"";Usr=""Admin"";Pwd=""Password"";";

Попытка
    БазаИсточник = Подключение.Connect(ПараметрыПодключения);
Исключение
    ВызватьИсключение "Не удалось подключиться к базе-источнику: " + ОписаниеОшибки();
КонецПопытки;

Запрос = БазаИсточник.NewObject("Запрос");
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Реализация.Ссылка КАК Ссылка,
    |    Реализация.Номер КАК Номер,
    |    Реализация.Дата КАК Дата,
    |    Реализация.Организация.УникальныйИдентификатор КАК ОрганизацияGUID,
    |    Реализация.Контрагент.УникальныйИдентификатор КАК КонтрагентGUID
    |ИЗ
    |    Документ.РеализацияТоваровУслуг КАК Реализация
    |ГДЕ
    |    Реализация.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";

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

Результат = Запрос.Выполнить().Выгрузить();

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

Как избежать появления дубликатов справочников

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

Завершающие действия после загрузки

После окончания загрузки большого массива документов обязательно выполняем следующие технические регламенты:

  1. Обновление нумерации: чтобы избежать ошибок «Номер документа не уникален» при последующей работе пользователей, вызываем метод ОбновитьНумерациюОбъектов() для всех типов загруженных документов.
  2. Групповое перепроведение: запускаем перепроведение документов в хронологическом порядке для формирования корректных движений по регистрам учета.
← На главную