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