При переносе данных между базами 1С с идентичной структурой конфигурации часто возникает задача очистки информационной базы: требуется выгрузить только актуальные данные, исключив все элементы и документы, помеченные на удаление. Стандартная обработка ВыгрузкаЗагрузкаДанныхXML.epf выгружает метаданные целиком в соответствии с установленными фильтрами по периоду или типам объектов, но не позволяет гибко отсекать ссылки на помеченные на удаление элементы, что приводит к появлению неразрешенных ссылок (<Объект не найден...>). Разберем по шагам, почему возникает эта проблема и какие существуют надежные варианты ее решения.
Проанализируем природу проблемы: если мы исключаем объект из выгрузки, но выгружаем связанный с ним документ или регистр, платформа 1С все равно сохраняет в XML-файл уникальный идентификатор (GUID) связанного объекта. В базе-приемнике такой реквизит превратится в «битую» ссылку. Поэтому перенос без помеченных объектов требует обеспечения логической целостности данных.
Самый надежный способ избежать нарушения ссылочной целостности — удалить все помеченные объекты непосредственно перед выгрузкой. Если штатная процедура удаления зависает или выполняется слишком долго из-за колоссального объема данных, применим оптимизацию процесса очистки:
Объект.Удалить(), минуя тяжелый вызов НайтиПоСсылкам():
Выборка = Справочники.ВременныеДанные.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ПометкаУдаления Тогда
Попытка
Объект = Выборка.ПолучитьОбъект();
Объект.Удалить();
Исключение
// Обработка ошибки блокировки или прав
КонецПопытки;
КонецЕсли;
КонецЦикла;
После удаления объектов в базе-источнике выгрузка через ВыгрузкаЗагрузкаДанныхXML.epf пройдет без ошибок и не создаст битых ссылок.
Если удалить объекты в исходной базе невозможно, настроим перенос с помощью конфигурации «Конвертация данных» (КД). Это позволит программно управлять выгрузкой каждого реквизита и ссылки.
ПриВыгрузке пропишем проверку признака пометки на удаление:
Если Объект.ПометкаУдаления Тогда
Отказ = Истина;
КонецЕсли;
Рассмотрим еще один практичный подход: использование механизма регистрации изменений на узле плана обмена. Этот метод гарантирует перенос только нужного состава данных.
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Пока Выборка.Следующий() Цикл
Если Не Выборка.ПометкаУдаления Тогда
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
Если перенос данных уже выполнен без помеченных объектов и в целевой базе появились неразрешенные ссылки, устраним их следующими методами: