В практике администратора или разработчика 1С часто возникает задача переноса документов из одной информационной базы в другую, когда конфигурации этих баз абсолютно идентичны. Типичный пример: создание новой «чистой» базы и наполнение её документами за определенный период без переноса итогов и регистров накопления. Основная сложность здесь заключается в том, чтобы перенести объекты «как есть», сохранив их связи, но при этом оставить документы в состоянии «Записан», а не «Проведен», чтобы избежать искажения остатков в целевой базе.
В этой статье мы подробно разберем несколько эффективных способов решения этой задачи, проанализируем нюансы работы с GUID, а также выясним, как избежать «битых» ссылок и лишних движений по регистрам.
Этот метод является наиболее простым и быстрым для идентичных конфигураций. Данная обработка (обычно она входит в состав состава Библиотеки стандартных подсистем (БСП) или поставляется на диске ИТС) работает напрямую с объектами метаданных, сохраняя их внутренние уникальные идентификаторы (GUID).
Рассмотрим пошагово процесс работы с этим инструментом:
Проанализируем важный нюанс: свойство Проведен является булевым реквизитом самого документа. Если в исходной базе документ был проведен, то в XML-файле значение этого реквизита будет равно Истина. При загрузке в новую базу документ отобразится с иконкой проведенного (с «зеленой галочкой»), но движений (остатков) у него не будет. Это состояние называется «битым проведением».
Чтобы исправить ситуацию, после загрузки данных в целевую базу выполним следующие действия:
Проведен и установим ему значение Ложь. Поскольку движений в регистрах и так нет, эта операция пройдет мгновенно, и документы станут просто «записанными».Если нам нужно более гибкое решение (например, автоматическое снятие признака проведения прямо в момент загрузки), стоит обратиться к конфигурации «Конвертация данных 2.1».
Разберем алгоритм настройки правил обмена:
Чтобы документы загружались непроведенными, в обработчике ПередЗагрузкой или ПриЗагрузке на стороне целевой базы мы можем прописать принудительную установку режима записи. Посмотрим на пример кода в КД 2.1:
// В обработчике "ПриЗагрузке" объекта
Объект.Проведен = Ложь;
РежимЗаписи = "Запись";
Такой подход позволяет не использовать групповую обработку после загрузки. Кроме того, в КД 2.1 мы можем точно настроить поиск. Убедимся, что установлен флаг «Поиск по уникальному идентификатору». Это предотвратит создание дублей, если вы будете выполнять выгрузку повторно — система просто обновит уже существующие объекты по их GUID.
Если базы находятся в одной сети, и объем данных велик (десятки или сотни тысяч документов), создание огромных XML-файлов может привести к ошибкам нехватки памяти. В этом случае эффективнее использовать COM-соединение.
Суть метода заключается в том, что мы из целевой базы подключаемся к источнику и «читаем» данные напрямую. Рассмотрим упрощенный пример логики переноса документа через COM:
// Инициализация подключения
COMConnector = Новый COMОбъект("V83.COMConnector");
БазаИсточник = COMConnector.Connect("Srvr='ServerName';Ref='SourceBase';Usr='Admin';Pwd='123'");
// Выборка документов в источнике
Выборка = БазаИсточник.Документы.РеализацияТоваровУслуг.Выбрать(ДатаНачала, ДатаКонца);
Пока Выборка.Следующий() Цикл
// Создаем документ в текущей базе
НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Устанавливаем идентификатор, чтобы сохранить связи
УникальныйИдентификатор = Новый УникальныйИдентификатор(Строка(Выборка.УникальныйИдентификатор()));
НовыйДок.УстановитьСсылкуНового(Документы.РеализацияТоваровУслуг.ПолучитьСсылку(УникальныйИдентификатор));
// Заполняем реквизиты (можно автоматизировать через Метаданные)
НовыйДок.Дата = Выборка.Дата;
НовыйДок.Номер = Выборка.Номер;
// ... заполнение остальных реквизитов ...
НовыйДок.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
Преимущество этого метода в том, что мы можем реализовать любую сложную логику фильтрации и трансформации данных «на лету».
При любом способе переноса необходимо учитывать следующие технические аспекты:
Контрагенты, созданный вручную, но с другими GUID, то при загрузке документов через XML они могут не «подцепиться» к существующим записям, и создадутся дубли.Подводя итог, можно сказать: для разового и быстрого переноса в пустую базу лучше всего подходит обработка «Выгрузка и загрузка данных XML» с последующим снятием признака проведения. Если же задача регулярная или требует сложной очистки данных — стоит один раз настроить правила в Конвертации данных 2.1.