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