Как устранить проблему «Объект не найден» при конвертации данных через планы обмена

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

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

Почему возникает «Объект не найден»?

Рассмотрим механику процесса. Когда мы настраиваем ПКО для справочника и устанавливаем флаг «Не создавать новый объект, если не найден», мы ожидаем, что система просто оставит поле пустым. Однако на уровне XML-пакета ссылка (УИД объекта) все равно передается. Проанализируем, что происходит в базе-приемнике:

  1. Загрузчик считывает уникальный идентификатор (GUID) из файла обмена.
  2. Система пытается найти объект в справочнике приемника сначала по GUID, а затем по полям поиска (если это указано в настройках).
  3. Если объект не найден, срабатывает флаг «Не создавать новый». Физический элемент в таблице справочника не создается.
  4. При этом в документе, который ссылается на это подразделение, в поле записывается тот самый GUID из файла. С точки зрения платформы 1С, ссылка существует, но она ведет «в пустоту», поэтому в интерфейсе мы видим «Объект не найден».

Способ 1. Программная очистка «битых» ссылок при загрузке

Самый надежный способ избавиться от некрасивых надписей в интерфейсе — это принудительно очищать поле, если объект в базе-приемнике не существует. Для этого мы можем использовать обработчик «После загрузки» в правилах конвертации объекта (ПКО) документа или в правилах конвертации свойств (ПКС) конкретного реквизита.

Рассмотрим пример кода, который можно разместить в обработчике ПослеЗагрузки для реквизита Подразделение:


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

Если в вашей конфигурации используются библиотеки стандартных подсистем (БСП), можно написать более элегантный код, используя методы общего назначения:


Если ЗначениеЗаполнено(Объект.Подразделение) Тогда
    Если НЕ ОбщегоНазначения.СсылкаСуществует(Объект.Подразделение) Тогда
        Объект.Подразделение = Справочники.Подразделения.ПустаяСсылка();
    КонецЕсли;
КонецЕсли;

Способ 2. Использование параметра ТолькоПолучитьУзелСсылки

При использовании планов обмена движок выгрузки работает специфически. Если объект не зарегистрирован на узле плана обмена, он может выгрузиться только как ссылка. Выясним причину, почему иногда флаги поиска работают некорректно. В некоторых случаях помогает использование специального параметра ТолькоПолучитьУзелСсылки.

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

ТолькоПолучитьУзелСсылки = Истина;

Что это дает? Система не будет пытаться выгрузить структуру всего объекта (все его реквизиты), а передаст только ссылку. В сочетании с флагом «Не создавать», это гарантирует, что поиск будет производиться строго по идентификатору, и если объект в приемнике отсутствует, система не будет пытаться инициализировать его создание из неполных данных XML-узла.

Способ 3. Управление регистрацией в Планах обмена

Важно помнить, что при обмене через планы обмена ссылочные данные по умолчанию могут переноситься не полностью. Если справочник Подразделения не зарегистрирован к обмену для конкретного узла, то при выгрузке документа ссылка на него уйдет, а сам объект — нет.

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

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

Если же политика обмена подразумевает, что справочники в базе-приемнике ведутся эталонно и новые элементы появляться не должны, то единственным верным решением будет Способ 1 (программная очистка ссылки).

Важные нюансы настройки поиска

Разберем типичную ошибку в настройках поиска, упомянутую в обсуждении:

Посмотрим на логику совместной работы этих флагов: если вы установили «Не создавать новый объект», но при этом у вас не настроены поля поиска (или настроены неверно), то любая рассинхронизация по УИД приведет к появлению «Объект не найден». Проверьте, что в ПКО на закладке «Настройки поиска» отмечены ключевые поля (например, Код или Наименование) и для них установлены галочки «Поле поиска» в ПКС.

Резюме

Для решения проблемы «Объект не найден» мы рекомендуем придерживаться следующего алгоритма:

  1. Определитесь, должен ли объект создаваться. Если нет — используйте обработчик ПослеЗагрузки для очистки «битых» ссылок.
  2. Если обмен идет через планы обмена, проверьте параметр ТолькоПолучитьУзелСсылки в ПКО.
  3. Проверьте корректность настройки полей поиска. Помните, что поиск по УИД первичнее поиска по полям.
← На главную