Почему в Конвертации данных не заполняется ссылочный реквизит при переносе и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При настройке правил обмена в конфигурации «Конвертация данных 2.0» разработчики нередко сталкиваются с ситуацией, когда данные из источника успешно выгружаются в файл XML, однако в базе-приемнике определенный ссылочный реквизит (например, Валюта справочника карт-счетов) остается незаполненным или содержит пустую ссылку. Разберем детально, почему возникает подобное поведение платформы и как по шагам восстановить корректное сопоставление и запись данных.

1. Явное указание правила конвертации (ПКО) в свойствах реквизита (ПКС)

Если для одного и того же типа данных в правилах обмена существует несколько Правил Конвертации Объектов (ПКО), механизм обмена может не определить автоматически, по какому именно правилу следует обрабатывать ссылочный реквизит. В таком случае конвертация свойства не завершается созданием или поиском ссылки.

Проанализируем порядок действий для устранения проблемы:

  1. Откроем конфигурацию «Конвертация данных» и найдем ПКО справочника-источника (например, КартСчета).
  2. Перейдем на закладку «Правила конвертации свойств» (ПКС) и выберем строку проблемного реквизита (Валюта).
  3. В колонке «Правило конвертации» явно укажем соответствующее ПКО для справочника валют (например, Валюты), не оставляя поле пустым.

2. Проверка настроек поиска и сопоставления в ПКО ссылочного справочника

Если справочник в приемнике уже содержит нужные элементы, но ссылка не подставляется, проблема чаще всего кроется в алгоритме сопоставления объекта. Если поиск не находит объект, а флаг создания выключен, платформа вернет пустую ссылку.

Рассмотрим ключевые параметры поиска в ПКО сопоставляемого объекта (Валюты):

  1. Флаг «Не создавать новый объект в приемнике, если он не найден»: Если данный флаг включен, а алгоритм поиска по ключевым полям не нашел элемент, объект не будет создан, а реквизит останется пустым.
  2. Свойства поиска: Проверим, какие поля отмечены галочкой «Искать объект приемника по свойству». Для справочников обычно используются Код или Наименование. Если коды в базе-источнике и приемнике отличаются по длине (например, содержат ведущие нули), поиск по точному совпадению завершится неудачей.
  3. Поиск по идентификатору (GUID): Если включен поиск по внутреннему идентификатору, но справочники в базах создавались независимо, поиск по GUID не сработает. Убедимся, что включен поиск по полям поиска.
  4. Стандартные реквизиты: Убедимся, что реквизиты ПометкаУдаления и ЭтоГруппа выгружаются корректно и не блокируют сопоставление.

3. Проверка флагов перезаписи в ПКС

Если элемент карт-счета уже существовал в базе-приемнике с пустой валютой, при повторном переносе реквизит может не обновиться из-за настроек перезаписи:

  1. Откроем настройки ПКС реквизита Валюта.
  2. Проверим состояние флага «Не замещать значение свойства у существующих объектов». Если флаг установлен, платформа сознательно пропускает обновление этого поля для ранее созданных записей. Снимем флаг при необходимости актуализации данных.
  3. Убедимся, что случайно не включен флаг «Получить из входящих данных», если данные передаются напрямую из объекта-источника, а не через структуру ВходящиеДанные.

4. Влияние кода конфигурации базы-приемника и подписок на события

Иногда значение успешно загружается правилами конвертации, но очищается логикой самой конфигурации базы-приемника в событиях ПередЗаписью или ПриЗаписи модуля объекта или в подписках на события. Типовой код может перезаполнять валюту по умолчанию или сбрасывать ее при изменении других реквизитов.

Чтобы исключить влияние сторонней логики конфигурации при загрузке, убедимся, что в модулях проверяется режим загрузки данных:


Если ОбменДанными.Загрузка Тогда
    Возврат;
КонецЕсли;

5. Программное сопоставление и заполнение через обработчики событий

Если стандартный механизм сопоставления по полям поиска не дает нужного результата из-за различий в форматах хранения, применим программное заполнение ссылки.

Вариант А: Переопределение полей поиска в ПКО «Валюты»

В ПКО справочника Валюты в обработчике «Поля поиска» укажем точный алгоритм поиска:


Если СвойстваПоиска["Код"] <> Неопределено Тогда
    СтрокаКода = СокрЛП(СвойстваПоиска["Код"]);
    // Приведем код к нужному формату приемника
    СвойстваПоискаВременные = Новый Структура("Код", СтрокаКода);
КонецЕсли;

Вариант Б: Ручное заполнение в обработчике «После загрузки» ПКО «КартСчета»

Если сопоставление через ПКС вызывает сложности, заполним валюту напрямую при загрузке карт-счета, найдя нужный элемент в базе-приемнике:


Если Не ЗначениеЗаполнено(Объект.Валюта) Тогда
    // Предположим, код валюты был передан в ПараметрыОбъекта или получен из структуры
    НайденнаяВалюта = Справочники.Валюты.НайтиПоКоду("643");
    Если ЗначениеЗаполнено(НайденнаяВалюта) Тогда
        Объект.Валюта = НайденнаяВалюта;
    КонецЕсли;
КонецЕсли;

6. Диагностика с помощью встроенной отладки обработчиков

Для гарантированного выявления этапа, на котором теряется значение, используем механизм отладки выгрузки и загрузки:

  1. В конфигурации «Конвертация данных» откроем меню «Сервис» -> «Настройка отладки обработчиков».
  2. Сформируем модуль отладки для загрузки данных и подключим его через внешнюю обработку или конфигуратор базы-приемника.
  3. Установим точку останова в процедурах ПриЗагрузке, ПослеЗагрузки и в коде сопоставления объектов, чтобы пошагово отследить значение переменной Объект.Валюта до момента его сохранения в базу данных.
← На главную