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

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

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

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

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

Этот метод является наиболее простым и быстрым для идентичных конфигураций. Данная обработка (обычно она входит в состав состава Библиотеки стандартных подсистем (БСП) или поставляется на диске ИТС) работает напрямую с объектами метаданных, сохраняя их внутренние уникальные идентификаторы (GUID).

Рассмотрим пошагово процесс работы с этим инструментом:

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

Проанализируем важный нюанс: свойство Проведен является булевым реквизитом самого документа. Если в исходной базе документ был проведен, то в XML-файле значение этого реквизита будет равно Истина. При загрузке в новую базу документ отобразится с иконкой проведенного (с «зеленой галочкой»), но движений (остатков) у него не будет. Это состояние называется «битым проведением».

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

  1. Откроем стандартную обработку «Групповое изменение реквизитов».
  2. Выберем загруженные документы.
  3. Найдем реквизит Проведен и установим ему значение Ложь. Поскольку движений в регистрах и так нет, эта операция пройдет мгновенно, и документы станут просто «записанными».

Способ 2. Конвертация данных 2.1 и «Универсальный обмен данными XML»

Если нам нужно более гибкое решение (например, автоматическое снятие признака проведения прямо в момент загрузки), стоит обратиться к конфигурации «Конвертация данных 2.1».

Разберем алгоритм настройки правил обмена:

  1. Выгрузим описания структур метаданных из обеих баз (даже если они одинаковые).
  2. В «Конвертации данных» создадим новый проект и настроим Правила Обмена Данными (ПОД).
  3. Для каждого Правила Конвертации Объекта (ПКО) документа перейдем в обработчики событий.

Чтобы документы загружались непроведенными, в обработчике ПередЗагрузкой или ПриЗагрузке на стороне целевой базы мы можем прописать принудительную установку режима записи. Посмотрим на пример кода в КД 2.1:


// В обработчике "ПриЗагрузке" объекта
Объект.Проведен = Ложь;
РежимЗаписи = "Запись";

Такой подход позволяет не использовать групповую обработку после загрузки. Кроме того, в КД 2.1 мы можем точно настроить поиск. Убедимся, что установлен флаг «Поиск по уникальному идентификатору». Это предотвратит создание дублей, если вы будете выполнять выгрузку повторно — система просто обновит уже существующие объекты по их GUID.

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

Если базы находятся в одной сети, и объем данных велик (десятки или сотни тысяч документов), создание огромных XML-файлов может привести к ошибкам нехватки памяти. В этом случае эффективнее использовать COM-соединение.

Суть метода заключается в том, что мы из целевой базы подключаемся к источнику и «читаем» данные напрямую. Рассмотрим упрощенный пример логики переноса документа через COM:


// Инициализация подключения
COMConnector = Новый COMОбъект("V83.COMConnector");
БазаИсточник = COMConnector.Connect("Srvr='ServerName';Ref='SourceBase';Usr='Admin';Pwd='123'");

// Выборка документов в источнике
Выборка = БазаИсточник.Документы.РеализацияТоваровУслуг.Выбрать(ДатаНачала, ДатаКонца);

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

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

Важные рекомендации по обеспечению целостности данных

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

  1. Сохранение ссылок (GUID): Всегда стремитесь переносить справочники вместе с документами. Если в новой базе уже есть справочник Контрагенты, созданный вручную, но с другими GUID, то при загрузке документов через XML они могут не «подцепиться» к существующим записям, и создадутся дубли.
  2. Отключение итогов: Если вы все же решили загружать документы с проведением (для сверки остатков), перед массовой загрузкой рекомендуется отключить режим использования итогов в регистрах накопления и бухгалтерии. Это ускорит процесс записи в несколько раз.
  3. Разбиение на транзакции: При программном переносе (через COM или КД) не стоит пытаться записать все данные в одной транзакции. Оптимально фиксировать изменения каждые 1000–5000 объектов.
  4. Версионность: Убедитесь, что версии платформы и, желательно, релизы конфигураций совпадают. Даже в «идентичных» базах небольшое различие в типах реквизитов (например, увеличение длины строки) может привести к ошибке разбора XML-пакета.

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

← На главную