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