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