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

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

При настройке обмена данными в конфигурации «Конвертация данных 2.0» (КД 2.0) разработчики часто сталкиваются со следующим исключением при загрузке данных обработкой «Универсальный обмен данными XML»:

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

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

Причина возникновения ошибки

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

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

Попытка обратиться к значению по индексу через квадратные скобки (например, ПараметрыОбъекта["УИД"]) у переменной со значением Неопределено приводит к критической ошибке платформы 1С.

Разбор исходного кода с ошибкой

Посмотрим на пример кода в обработчике Поля поиска Правила конвертации объектов (ПКО):


Запрос = Новый Запрос;
Запрос.Текст =     "ВЫБРАТЬ ПЕРВЫЕ 1
|    СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК Ссылка
|ИЗ
|    РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
|ГДЕ
|    СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника = &УИД
|       И СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника Ссылка Справочник.Номенклатура
|       И НЕ СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника Есть NULL
|";
Запрос.УстановитьПараметр("УИД", ПараметрыОбъекта["УИД"]);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    СсылкаНаОбъект     = Выборка.Ссылка;
    ПрекратитьПоиск = Истина;
КонецЕсли;

В строке Запрос.УстановитьПараметр("УИД", ПараметрыОбъекта["УИД"]); происходит прямой доступ к ключу "УИД". Если ПараметрыОбъекта равна Неопределено, вызов падаёт с описанной ошибкой.

Способы решения проблемы

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

  1. Добавление проверки на Неопределено в коде:

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

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

    
    Если ПараметрыОбъекта <> Неопределено И ПараметрыОбъекта.Получить("УИД") <> Неопределено Тогда
    
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ ПЕРВЫЕ 1
            |   СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК Ссылка
            |ИЗ
            |   РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
            |ГДЕ
            |   СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника = &УИД
            |   И СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника Ссылка Справочник.Номенклатура
            |   И НЕ СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника Есть NULL";
        
        Запрос.УстановитьПараметр("УИД", ПараметрыОбъекта.Получить("УИД"));
        
        Выборка = Запрос.Выполнить().Выбрать();
        Если Выборка.Следующий() Тогда
            СсылкаНаОбъект  = Выборка.Ссылка;
            ПрекратитьПоиск = Истина;
        КонецЕсли;
    
    КонецЕсли;
    
  2. Проверка настроек ПКС (Правил конвертации свойств):

    Убедимся, что для передаваемого параметра в настройках правила выполнено следующее:

    1. Установлен флаг «Передавать данные в параметр» и корректно указано имя параметра (например, УИД).
    2. Установлен флаг «Поиск». Если данный флаг не установлен, параметр не будет попадать в логику обработчика поиска.

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

← На главную