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

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

При переносе данных между конфигурациями 1С с помощью правил обмена, созданных в конфигурации «Конвертация данных 2.1», разработчики часто формируют произвольные структуры данных в обработчиках событий. Однако при выгрузке обработки УниверсальныйОбменДаннымиXML может возникнуть следующая ошибка:

Ошибка получения свойства объекта из входящих данных
ОписаниеОшибки = Получение элемента по индексу для значения не определено
КодСообщения = 68

Рассмотрим причинно-следственные связи возникновения этой проблемы и разберем по шагам, как правильно настроить правила конвертации свойств (ПКС) для ее устранения.

Анатомия проблемы и причины возникновения ошибки

Проанализируем типичную ситуацию. Допустим, нам необходимо сформировать серии номенклатуры или дополнительные реквизиты объекта на основе данных источника с помощью запроса и передать их в приемник. В обработчике «Перед выгрузкой» для правила конвертации свойства или табличной части пишется следующий код:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ ПЕРВЫЕ 1
|	ОтчетПроизводстваЗаСменуПродукция.Ссылка.Дата КАК Дата
|ИЗ
|	Документ.ОтчетПроизводстваЗаСмену.Продукция КАК ОтчетПроизводстваЗаСменуПродукция
|ГДЕ
|	ОтчетПроизводстваЗаСменуПродукция.Номенклатура = &Номенклатура";

Запрос.УстановитьПараметр("Номенклатура", ОбъектКоллекции.Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();

ДатаВыпуска  = НачалоДня(Выборка.Дата);
ДатаГодности = НачалоМесяца(ДобавитьМесяц(ДатаВыпуска, 12));  
Серия        = СокрЛП(Сред(ОбъектКоллекции.Номенклатура, Найти(ОбъектКоллекции.Номенклатура, " серия") + 8, 3));
Наименование = Серия + ", " + Формат(ДатаГодности, "ДФ=dd.MM.yyyy");

ВыборкаДокумент = Новый Структура();
ВыборкаДокумент.Вставить("Комментарий", "Перенесен из БУХ 3.0");
ВыборкаДокумент.Вставить("Наименование", Наименование);
ВыборкаДокумент.Вставить("ДатаИзготовления", ДатаВыпуска);
ВыборкаДокумент.Вставить("СерийныйНомер", Серия);
ВыборкаДокумент.Вставить("СрокГодности", ДатаГодности);
ВыборкаДокумент.Вставить("Владелец", ОбъектКоллекции.Номенклатура);

Значение = ВыборкаДокумент;

При выполнении этого кода в обработке выгрузки выпадает ошибка по каждому из подчинённых свойств. Выясним причину этого поведения.

Когда вы переопределяете переменную Значение, вы сообщаете алгоритму конвертации, что новым источником данных для ПКО становится переданная структура (в нашем примере — ВыборкаДокумент). Если при этом в подчинённых правилах конвертации свойств (ПКС) установлен флаг «Получить из входящих данных», выгрузка ожидает наличие специальной переменной ВходящиеДанные.

Внутренний механизм выгрузки при включенном флаге пытается обратиться к контексту входящих данных как к коллекции по индексу: ВходящиеДанные[ИмяСвойства]. Так как сама переменная ВходящиеДанные не была инициализирована (она имеет значение Неопределено), вызов обращения по ключу приводит к критической ошибке платформы: Получение элемента по индексу для значения не определено.

Способ 1. Использование переменной Значение (Основное решение)

Если данные подготавливаются локально внутри обработчика и передаются через переменную Значение в виде структуры, флаг «Получить из входящих данных» использовать не нужно.

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

В этом случае обработчик выгрузки будет корректно брать значения ключей из структуры Значение по именам свойств источника и приемника без попытки обращения к ВходящиеДанные.

Способ 2. Корректная передача через ИсходящиеДанные и ВходящиеДанные

Если логика вашего переноса требует жесткого использования флага «Получить из входящих данных» в ПКС, необходимо правильно заполнять структуру контекста передачи на высшем уровне.

В вышестоящем событии (например, в ПКС родительского объекта или в ПВД перед вызовом правила) зафиксируйте структуру в переменной ИсходящиеДанные:


ИсходящиеДанные = Новый Структура();
ИсходящиеДанные.Вставить("Комментарий", "Перенесен из БУХ 3.0");
ИсходящиеДанные.Вставить("Наименование", Наименование);
ИсходящиеДанные.Вставить("СерийныйНомер", Серия);
ИсходящиеДанные.Вставить("Владелец", ОбъектКоллекции.Номенклатура);

При переходе к выгрузке подчинённого объекта переданная структура ИсходящиеДанные автоматически станет доступна подчинённому ПКО в переменной ВходящиеДанные, и флаг «Получать из входящих данных» сработает штатно.

Способ 3. Вызов правила через ВыгрузитьПоПравилу()

Разберем ещё один альтернативный вариант, когда формирование объекта производится полностью программно. В событии «Перед выгрузкой» можно явно вызвать подчинённое правило конвертации с помощью встроенной функции ВыгрузитьПоПравилу():


ВыборкаДокумент = Новый Структура();
ВыборкаДокумент.Вставить("Комментарий", "Перенесен из БУХ 3.0");
ВыборкаДокумент.Вставить("Наименование", Наименование);
ВыборкаДокумент.Вставить("СерийныйНомер", Серия);
ВыборкаДокумент.Вставить("Владелец", ОбъектКоллекции.Номенклатура);

// Явный вызов ПКО с передачей структуры во входящие данные
ВыгрузитьПоПравилу(, , ВыборкаДокумент, , "НоменклатуруВСерию");

При таком подходе структура ВыборкаДокумент напрямую передаётся в третьем параметре (ВходящиеДанные) функции, что предотвращает возникновение конфликтов типов при чтении свойств.

← На главную