Как перенести данные в идентичную конфигурацию 1С без объектов, помеченных на удаление?

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

При переносе данных между базами 1С с идентичной структурой конфигурации часто возникает задача очистки информационной базы: требуется выгрузить только актуальные данные, исключив все элементы и документы, помеченные на удаление. Стандартная обработка ВыгрузкаЗагрузкаДанныхXML.epf выгружает метаданные целиком в соответствии с установленными фильтрами по периоду или типам объектов, но не позволяет гибко отсекать ссылки на помеченные на удаление элементы, что приводит к появлению неразрешенных ссылок (<Объект не найден...>). Разберем по шагам, почему возникает эта проблема и какие существуют надежные варианты ее решения.

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

Вариант 1. Предварительная очистка исходной базы данных

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

  1. Отключение фоновых механизмов: перед запуском очистки отключим регламентные задания и регламентный полнотекстовый поиск. Индексация при массовом удалении создает критическую нагрузку на СУБД.
  2. Пакетное удаление: вместо попытки удалить все объекты за один сеанс выполним удаление порциями (например, по 500–1000 элементов за транзакцию). Это позволит своевременно очищать оперативную память и сбрасывать блокировки СУБД.
  3. Прямое программное удаление: если в базе есть заведомо изолированные справочники или документы (например, временные объекты загрузок, не связанные с движениями регистров), их можно удалить напрямую через метод Объект.Удалить(), минуя тяжелый вызов НайтиПоСсылкам():
    
    Выборка = Справочники.ВременныеДанные.Выбрать();
    Пока Выборка.Следующий() Цикл
        Если Выборка.ПометкаУдаления Тогда
            Попытка
                Объект = Выборка.ПолучитьОбъект();
                Объект.Удалить();
            Исключение
                // Обработка ошибки блокировки или прав
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;
    

После удаления объектов в базе-источнике выгрузка через ВыгрузкаЗагрузкаДанныхXML.epf пройдет без ошибок и не создаст битых ссылок.

Вариант 2. Использование конфигурации «Конвертация данных»

Если удалить объекты в исходной базе невозможно, настроим перенос с помощью конфигурации «Конвертация данных» (КД). Это позволит программно управлять выгрузкой каждого реквизита и ссылки.

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

Вариант 3. Выборочная выгрузка через планы обмена

Рассмотрим еще один практичный подход: использование механизма регистрации изменений на узле плана обмена. Этот метод гарантирует перенос только нужного состава данных.

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

Устранение битых ссылок после переноса

Если перенос данных уже выполнен без помеченных объектов и в целевой базе появились неразрешенные ссылки, устраним их следующими методами:

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