Как исправить ошибку «Элемент не выбран!» при обмене данными между 1С:Бухгалтерия и 1С:Управление торговлей?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При выполнении обмена данными через встроенные правила или обработку ОбменДаннымиXML пользователь может столкнуться со следующей ошибкой в приемнике:

Ошибка при загрузке данных: {Обработка.ОбменДаннымиXML.МодульОбъекта(6773)}: Ошибка при вызове метода контекста (ПолучитьОбъект): Элемент не выбран!

Рассмотрим подробно причины возникновения этой проблемы, методы отладки и способы быстрого поиска некорректного объекта в информационной базе.

Выясним техническую причину ошибки

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

В контексте обмена данными через Конвертацию данных это происходит по следующим причинам:

  1. Некорректная проверка поиска в обработчиках правил: В событиях «При загрузке», «После загрузки» или «После поиска» написан код получения объекта. При отсутствии элемента методы поиска (такие как НайтиПоКоду() или НайтиПоНаименованию()) возвращают не Неопределено, а пустую ссылку. Если в обработчике была написана проверка вида Если Ссылка <> Неопределено Тогда, она успешно выполняется, но вызов Ссылка.ПолучитьОбъект() приводит к аварийному завершению.
  2. Битая ссылка или незаполненный реквизит: В переносимом документе или справочнике один из ссылочных реквизитов (например, договор, склад, единица измерения) содержит битую ссылку или не заполнен вовсе. Правило конвертации (ПКО) пытается получить данный объект для обработки его данных и спотыкается на пустом значении.
  3. Отсутствие полей поиска: Для переносимого объекта в ПКО не определены ключевые поля поиска. В результате приемник не может сопоставить элемент и создает пустую ссылку.

Способ 1. Использование отладчика платформы

Наиболее точный метод определения объекта — запуск загрузки данных под отладчиком с включенным условием остановки по ошибке. Разберем шаги:

  1. Откроем конфигуратор информационной базы приемника (в нашем случае 1С:Управление торговлей).
  2. Откроем меню Отладка — Настройка остановки по ошибке.
  3. Установим флаг Останавливаться по ошибке. Чтобы отсечь лишние системные предупреждения, можно добавить условие по содержанию текста: Элемент не выбран!.
  4. Запустим сеанс 1С:Предприятия в режиме отладки и воспроизведем загрузку данных.
  5. При возникновении ошибки платформа автоматически остановит исполнение кода на проблемной строке. В окне локальных переменных вы сможем увидеть свойства переменной Ссылка или текущего узла XML, чтобы понять, какой именно объект выгружается.

Способ 2. Включение подробного протоколирования в обработке обмена

Если нет возможности подключиться конфигуратором к базе, воспользуемся функционалом протоколирования ошибки в обработке УниверсальныйОбменДаннымиXML:

  1. Откроем обработку УниверсальныйОбменДаннымиXML на стороне базы-приемника.
  2. Перейдем на вкладку Загрузка данных или Дополнительные настройки.
  3. Установим флаг Записывать ошибки в протокол и укажем путь к текстовому файлу протокола обмена.
  4. Выполним загрузку файла. В протоколе зафиксируется не только текст исключения, но и текущий обрабатываемый элемент XML-файла, содержащий тип метаданных и GUID объекта.

Способ 3. Поэтапная перегрузка и перепроведение документов

Если ошибка вызвана рассинхронизацией состояний документов или битыми ссылками в источнике, применим практический алгоритм локализации:

  1. Пообъектный обмен: Разделим состав выгрузки на части (например, сначала перегружаем только справочники, затем каждый вид документов по отдельности). Это позволит быстро определить конкретный тип метаданных, содержащий коллизию.
  2. Перепроведение документов в источнике: Довольно часто в документе источника реквизиты визуально заполнены, но ссылки внутри структуры документа неактуальны или некорректно записаны. Массовое перепроведение проблемных документов в 1С:Бухгалтерии обновляет внутренние связи и очищает некорректные значения.
  3. Тестирование и исправление (ТИИ): Выполним процедуру Тестирование и исправление информационной базы в базе-приемнике и базе-источнике (меню Администрирование — Тестирование и исправление) с включенными флагами проверки логической целостности и ссылочной целостности. Это позволит устранить битые ссылки в базах.

Как правильно доработать код правил обмена

Чтобы исключить подобную ошибку при написании собственного кода в Конвертации Данных, проанализируем пример безопасного получения объекта из ссылки.

Некорректный вариант кода, приводящий к ошибке:


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

Исправленный вариант с использованием встроенных функций проверки:


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

Использование функции ЗначениеЗаполнено() совместно с методом Пустая() гарантирует, что метод ПолучитьОбъект() будет вызван только у реально существующей ссылки на элемент информационной базы.

← На главную