При настройке обмена данными в Конвертация данных 2.0 мы часто сталкиваемся с ситуацией, когда стандартная настройка Не замещать существующие объекты в ПКО (Правилах Конвертации Объектов) не приносит ожидаемого результата. Даже если флаг установлен, при загрузке данные в базе-приемнике перезаписываются. Давайте вместе разберем, почему это происходит и как взять процесс под контроль.
Прежде чем переходить к коду, проанализируем, почему штатный механизм может давать сбой:
ПередЗагрузкой или ПослеЗагрузки может выполняться слишком поздно, когда свойства уже перенесены в объект в памяти.ОбъектНайден: В сложных сценариях при кастомной логике поиска движок КД 2.0 нуждается в явном подтверждении того, что объект был найден, иначе он игнорирует настройки замещения.Если вы используете произвольный алгоритм для поиска объекта, обязательно сообщайте системе, что поиск прошел успешно. Как выяснилось в ходе практики, иногда достаточно просто явно указать переменной ОбъектНайден состояние поиска.
Попробуйте добавить в код ПКО (например, в обработчик поиска) следующую конструкцию:
Если Выборка.Количество() > 0 Тогда
ОбъектНайден = Истина;
КонецЕсли;
Этот простой шаг заставляет механизм КД корректно обработать флаг Не замещать существующие объекты, так как теперь движок «понимает», что объект был успешно идентифицирован в базе данных.
НеЗамещатьОбъектЕсли вам нужно не просто «положиться» на галочку, а программно решить судьбу документа или элемента справочника, воспользуйтесь обработчиком ПриЗагрузке. Здесь мы можем задать логику, при которой, например, проведенные документы не будут изменяться при обмене.
Рассмотрим пример реализации:
ПриЗагрузке
Если ОбъектНайден Тогда
Если Объект.Проведен Тогда
НеЗамещатьОбъект = Истина;
Сообщить("Документ " + Объект + " проведен и не будет изменен!", СтатусСообщения.Важное);
КонецЕсли;
Иначе
Сообщить("Добавлен новый объект: " + Объект);
КонецЕсли;
Использование НеЗамещатьОбъект = Истина является наиболее надежным способом предотвратить перезапись, так как эта переменная напрямую влияет на внутренние флаги процесса загрузки КД 2.0.
Чтобы окончательно решить проблему, рекомендуем выполнить следующие проверки:
ОбменДанными.Загрузка: Убедитесь, что во всех модулях объектов, которые участвуют в обмене, в процедурах ПередЗаписью и ПриЗаписи стоит проверка: Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли;. Это предотвращает срабатывание лишней логики при записи, которая может имитировать обновление объекта.БИН или другие уникальные поля не содержат лишних пробелов, которые могут мешать поиску. Используйте функцию СокрЛП() перед сравнением.ПКС (Правилах Конвертации Свойств), помните, что это выполняется независимо от флага замещения объекта в целом. Если нужно запретить замещение только конкретного свойства, используйте флаг Не замещать значение св-ва прямо в настройках ПКС.Соблюдение этих рекомендаций позволит вам гибко управлять процессом загрузки данных и избежать нежелательного замещения существующих объектов в вашей базе 1С.