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