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

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

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

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

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

Посмотрим на типовой текст диагностического сообщения, формируемого обработкой выгрузки:

ПКО: Хозрасчетный (План счетов: План счетов бухгалтерского учета)
ПКС: 1 (ЗапретитьИспользоватьВПроводках --> ЗапретитьИспользоватьВПроводках)
Объект: 60.02 (Строка)
СвойствоПриемника: ЗапретитьИспользоватьВПроводках (Булево)
ОписаниеОшибки: Получение элемента по индексу для значения не определено

Выясним причину такого поведения платформы. Механизм универсального обмена работает следующим образом:

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

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

Способы локализации проблемного правила

Рассмотрим, как быстро найти конкретный документ и свойство, в котором происходит передача строки вместо ссылки.

  1. Использование штатного режима отладки:

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

  2. Программный перехват в ПКО:

    В обработчик «Перед выгрузкой» ПКО Хозрасчетный добавим отладочный код, который выведет в окно сообщений проблемный тип и значение перед возникновением ошибки:

    
    Если ТипЗнч(Источник) <> Тип("ПланСчетовСсылка.Хозрасчетный") Тогда
        Сообщить("Некорректный тип источника: " + Строка(ТипЗнч(Источник)) + " | Значение: " + Строка(Источник));
    КонецЕсли;
    

Варианты решения проблемы

Разберем по шагам практические способы устранения ошибки в зависимости от логики обмена.

Вариант 1. Нормализация типа в ПКО счета

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


Если ТипЗнч(Источник) = Тип("Строка") Тогда
    Источник = ПланыСчетов.Хозрасчетный.НайтиПоКоду(Источник);
    Если Не ЗначениеЗаполнено(Источник) Тогда
        Отказ = 1;
    КонецЕсли;
КонецЕсли;

В этом случае при передаче строкового кода правило автоматически найдет ссылку в базе-источнике, и чтение реквизита ЗапретитьИспользоватьВПроводках пройдет без ошибок.

Вариант 2. Преобразование строки в ссылку в ПКС документа

Если в конкретном документе счет заполняется алгоритмом или читается из строкового реквизита, приведем его к ссылочному типу непосредственно в правиле конвертации свойства (ПКС) в обработчике «Перед выгрузкой»:


Если ТипЗнч(Источник.СчетУчета) = Тип("Строка") Тогда
    Значение = ПланыСчетов.Хозрасчетный.НайтиПоКоду(Источник.СчетУчета);
КонецЕсли;

Вариант 3. Оптимизация ПКО для сопоставления только по коду

Проанализируем структуру переноса: если план счетов в базе-приемнике уже полностью заполнен и создание новых счетов при выгрузке документов не требуется, выгружать реквизиты счета избыточно. Для оптимизации обмена выполним следующие настройки в ПКО Хозрасчетный:

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

Такой подход исключит попытки чтения свойств у неприменимых типов данных, уменьшит размер результирующего XML-файла и ускорит процедуру синхронизации данных.

← На главную