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