Почему в КД 2.0 не срабатывает флаг «Не замещать существующие объекты» и как это исправить?

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

При настройке обмена данными в Конвертация данных 2.0 мы часто сталкиваемся с ситуацией, когда стандартная настройка Не замещать существующие объекты в ПКО (Правилах Конвертации Объектов) не приносит ожидаемого результата. Даже если флаг установлен, при загрузке данные в базе-приемнике перезаписываются. Давайте вместе разберем, почему это происходит и как взять процесс под контроль.

Причины сбоя механизма замещения

Прежде чем переходить к коду, проанализируем, почему штатный механизм может давать сбой:

  1. Некорректная идентификация: Если поиск объекта по полям поиска не дает однозначного результата (например, из-за дублей или невидимых символов в строковых ключах), система считает, что объект не найден, и создает новый или обновляет случайный элемент.
  2. Порядок событий: Код в обработчиках ПередЗагрузкой или ПослеЗагрузки может выполняться слишком поздно, когда свойства уже перенесены в объект в памяти.
  3. Отсутствие флага ОбъектНайден: В сложных сценариях при кастомной логике поиска движок КД 2.0 нуждается в явном подтверждении того, что объект был найден, иначе он игнорирует настройки замещения.

Способ 1: Явное управление флагом поиска

Если вы используете произвольный алгоритм для поиска объекта, обязательно сообщайте системе, что поиск прошел успешно. Как выяснилось в ходе практики, иногда достаточно просто явно указать переменной ОбъектНайден состояние поиска.

Попробуйте добавить в код ПКО (например, в обработчик поиска) следующую конструкцию:


Если Выборка.Количество() > 0 Тогда
    ОбъектНайден = Истина;
КонецЕсли;

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

Способ 2: Использование переменной НеЗамещатьОбъект

Если вам нужно не просто «положиться» на галочку, а программно решить судьбу документа или элемента справочника, воспользуйтесь обработчиком ПриЗагрузке. Здесь мы можем задать логику, при которой, например, проведенные документы не будут изменяться при обмене.

Рассмотрим пример реализации:


ПриЗагрузке
Если ОбъектНайден Тогда
    Если Объект.Проведен Тогда
        НеЗамещатьОбъект = Истина;
        Сообщить("Документ " + Объект + " проведен и не будет изменен!", СтатусСообщения.Важное);
    КонецЕсли;
Иначе
    Сообщить("Добавлен новый объект: " + Объект);
КонецЕсли;

Использование НеЗамещатьОбъект = Истина является наиболее надежным способом предотвратить перезапись, так как эта переменная напрямую влияет на внутренние флаги процесса загрузки КД 2.0.

Рекомендации по диагностике

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

Соблюдение этих рекомендаций позволит вам гибко управлять процессом загрузки данных и избежать нежелательного замещения существующих объектов в вашей базе 1С.

← На главную