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