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