При переносе данных между конфигурациями 1С с помощью правил обмена, созданных в конфигурации «Конвертация данных 2.1», разработчики часто формируют произвольные структуры данных в обработчиках событий. Однако при выгрузке обработки УниверсальныйОбменДаннымиXML может возникнуть следующая ошибка:
Ошибка получения свойства объекта из входящих данных
ОписаниеОшибки = Получение элемента по индексу для значения не определено
КодСообщения = 68
Рассмотрим причинно-следственные связи возникновения этой проблемы и разберем по шагам, как правильно настроить правила конвертации свойств (ПКС) для ее устранения.
Проанализируем типичную ситуацию. Допустим, нам необходимо сформировать серии номенклатуры или дополнительные реквизиты объекта на основе данных источника с помощью запроса и передать их в приемник. В обработчике «Перед выгрузкой» для правила конвертации свойства или табличной части пишется следующий код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ОтчетПроизводстваЗаСменуПродукция.Ссылка.Дата КАК Дата
|ИЗ
| Документ.ОтчетПроизводстваЗаСмену.Продукция КАК ОтчетПроизводстваЗаСменуПродукция
|ГДЕ
| ОтчетПроизводстваЗаСменуПродукция.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", ОбъектКоллекции.Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ДатаВыпуска = НачалоДня(Выборка.Дата);
ДатаГодности = НачалоМесяца(ДобавитьМесяц(ДатаВыпуска, 12));
Серия = СокрЛП(Сред(ОбъектКоллекции.Номенклатура, Найти(ОбъектКоллекции.Номенклатура, " серия") + 8, 3));
Наименование = Серия + ", " + Формат(ДатаГодности, "ДФ=dd.MM.yyyy");
ВыборкаДокумент = Новый Структура();
ВыборкаДокумент.Вставить("Комментарий", "Перенесен из БУХ 3.0");
ВыборкаДокумент.Вставить("Наименование", Наименование);
ВыборкаДокумент.Вставить("ДатаИзготовления", ДатаВыпуска);
ВыборкаДокумент.Вставить("СерийныйНомер", Серия);
ВыборкаДокумент.Вставить("СрокГодности", ДатаГодности);
ВыборкаДокумент.Вставить("Владелец", ОбъектКоллекции.Номенклатура);
Значение = ВыборкаДокумент;
При выполнении этого кода в обработке выгрузки выпадает ошибка по каждому из подчинённых свойств. Выясним причину этого поведения.
Когда вы переопределяете переменную Значение, вы сообщаете алгоритму конвертации, что новым источником данных для ПКО становится переданная структура (в нашем примере — ВыборкаДокумент). Если при этом в подчинённых правилах конвертации свойств (ПКС) установлен флаг «Получить из входящих данных», выгрузка ожидает наличие специальной переменной ВходящиеДанные.
Внутренний механизм выгрузки при включенном флаге пытается обратиться к контексту входящих данных как к коллекции по индексу: ВходящиеДанные[ИмяСвойства]. Так как сама переменная ВходящиеДанные не была инициализирована (она имеет значение Неопределено), вызов обращения по ключу приводит к критической ошибке платформы: Получение элемента по индексу для значения не определено.
Если данные подготавливаются локально внутри обработчика и передаются через переменную Значение в виде структуры, флаг «Получить из входящих данных» использовать не нужно.
В этом случае обработчик выгрузки будет корректно брать значения ключей из структуры Значение по именам свойств источника и приемника без попытки обращения к ВходящиеДанные.
Если логика вашего переноса требует жесткого использования флага «Получить из входящих данных» в ПКС, необходимо правильно заполнять структуру контекста передачи на высшем уровне.
В вышестоящем событии (например, в ПКС родительского объекта или в ПВД перед вызовом правила) зафиксируйте структуру в переменной ИсходящиеДанные:
ИсходящиеДанные = Новый Структура();
ИсходящиеДанные.Вставить("Комментарий", "Перенесен из БУХ 3.0");
ИсходящиеДанные.Вставить("Наименование", Наименование);
ИсходящиеДанные.Вставить("СерийныйНомер", Серия);
ИсходящиеДанные.Вставить("Владелец", ОбъектКоллекции.Номенклатура);
При переходе к выгрузке подчинённого объекта переданная структура ИсходящиеДанные автоматически станет доступна подчинённому ПКО в переменной ВходящиеДанные, и флаг «Получать из входящих данных» сработает штатно.
Разберем ещё один альтернативный вариант, когда формирование объекта производится полностью программно. В событии «Перед выгрузкой» можно явно вызвать подчинённое правило конвертации с помощью встроенной функции ВыгрузитьПоПравилу():
ВыборкаДокумент = Новый Структура();
ВыборкаДокумент.Вставить("Комментарий", "Перенесен из БУХ 3.0");
ВыборкаДокумент.Вставить("Наименование", Наименование);
ВыборкаДокумент.Вставить("СерийныйНомер", Серия);
ВыборкаДокумент.Вставить("Владелец", ОбъектКоллекции.Номенклатура);
// Явный вызов ПКО с передачей структуры во входящие данные
ВыгрузитьПоПравилу(, , ВыборкаДокумент, , "НоменклатуруВСерию");
При таком подходе структура ВыборкаДокумент напрямую передаётся в третьем параметре (ВходящиеДанные) функции, что предотвращает возникновение конфликтов типов при чтении свойств.