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

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

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

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

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

Данная ошибка формируется универсальной обработкой выгрузки при попытке прочитать свойство объекта. Выясним основные причины ее появления:

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

Вариант 1. Выгрузка через обработчик «После выгрузки» с передачей структуры

Разберем классический сценарий, когда перенос записей регистра выполняется сразу после выгрузки основного объекта (например, справочника Организации).

Для реализации этого подхода настроим правила конвертации следующим образом:

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

Посмотрим на пример правильного кода обработчика «После выгрузки»:


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

Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    ВходящиеДанныеДляПКО = Новый Структура;
    ВходящиеДанныеДляПКО.Вставить("Объект", Источник.Ссылка);
    ВходящиеДанныеДляПКО.Вставить("Тип", Выборка.Тип);
    ВходящиеДанныеДляПКО.Вставить("Вид", Выборка.Вид);
    ВходящиеДанныеДляПКО.Вставить("Представление", Выборка.Представление);
    
    ВыгрузитьПоПравилу(, , ВходящиеДанныеДляПКО, , "ОрганизацииКонтактнаяИнформация");
КонецЦикла;

Вариант 2. Выгрузка через произвольный алгоритм в ПВД

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

Разберем по шагам правильную настройку:

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

Посмотрим на пример кода в обработчике «Перед обработкой» в ПВД:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КонтактнаяИнформация.Ссылка КАК Объект,
    |	КонтактнаяИнформация.Тип КАК Тип,
    |	КонтактнаяИнформация.Вид КАК Вид,
    |	КонтактнаяИнформация.Представление КАК Представление
    |ИЗ
    |	Справочник.Организации.КонтактнаяИнформация КАК КонтактнаяИнформация";

ВыборкаДанных = Запрос.Выполнить().Выбрать();

Важные нюансы настройки ПКО для регистров сведений

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

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