При настройке переноса данных между конфигурациями 1С с помощью «Конвертации данных 2.1» и обработки УниверсальныйОбменДаннымиXML разработчики часто сталкиваются с ошибкой выгрузки свойств ссылочных объектов. Разберем типичную ситуацию: при выгрузке документов возникает исключение «Ошибка получения значения свойства объекта (по имени свойства источника)» с описанием «Получение элемента по индексу для значения не определено» в ПКО плана счетов Хозрасчетный.
Проанализируем структуру и стек ошибки, выясним ее истинные причины, рассмотрим способы быстрой локализации проблемного места в правилах и разберем проверенные варианты исправления кода.
Посмотрим на типовой текст диагностического сообщения, формируемого обработкой выгрузки:
ПКО: Хозрасчетный (План счетов: План счетов бухгалтерского учета)
ПКС: 1 (ЗапретитьИспользоватьВПроводках --> ЗапретитьИспользоватьВПроводках)
Объект: 60.02 (Строка)
СвойствоПриемника: ЗапретитьИспользоватьВПроводках (Булево)
ОписаниеОшибки: Получение элемента по индексу для значения не определено
Выясним причину такого поведения платформы. Механизм универсального обмена работает следующим образом:
Хозрасчетный.Хозрасчетный настроена выгрузка реквизитов объекта, в том числе свойства ЗапретитьИспользоватьВПроводках. Выгрузка реквизитов по умолчанию пытается прочитать значение из объекта-источника через обращение по имени свойства: Источник[ИмяСвойства].ПланСчетовСсылка.Хозрасчетный в качестве источника для ПКО передается примитивный тип — Строка (в нашем примере со значением "60.02").Строка отсутствует возможность обращения по индексу или имени свойства через квадратные скобки, платформа генерирует исключение «Получение элемента по индексу для значения не определено».Такая ситуация обычно возникает, если в ПКС выгружаемого документа значение счета было переопределено кодом (строкой), либо реквизит источника изначально является строковым полем, а в ПКС указано правило конвертации для ссылочного объекта.
Рассмотрим, как быстро найти конкретный документ и свойство, в котором происходит передача строки вместо ссылки.
В конфигурации «Конвертация данных» выгрузим модуль отладки обработчиков. В обработке УниверсальныйОбменДаннымиXML на вкладке «Отладка выгрузки» подключим сгенерированный модуль с установленным флагом отладки. В конфигураторе базы-источника включим остановку по ошибке. В момент прерывания в стеке вызовов сразу отобразится текущий обрабатываемый объект (документ) и имя проблемного ПКС.
В обработчик «Перед выгрузкой» ПКО Хозрасчетный добавим отладочный код, который выведет в окно сообщений проблемный тип и значение перед возникновением ошибки:
Если ТипЗнч(Источник) <> Тип("ПланСчетовСсылка.Хозрасчетный") Тогда
Сообщить("Некорректный тип источника: " + Строка(ТипЗнч(Источник)) + " | Значение: " + Строка(Источник));
КонецЕсли;
Разберем по шагам практические способы устранения ошибки в зависимости от логики обмена.
Если в правилах обмена в разных местах в ПКО плана счетов передаются как ссылки, так и строковые коды счетов, сделаем обработку универсальной. В ПКО Хозрасчетный в обработчике «Перед выгрузкой» преобразуем входящую строку в полноценную ссылку:
Если ТипЗнч(Источник) = Тип("Строка") Тогда
Источник = ПланыСчетов.Хозрасчетный.НайтиПоКоду(Источник);
Если Не ЗначениеЗаполнено(Источник) Тогда
Отказ = 1;
КонецЕсли;
КонецЕсли;
В этом случае при передаче строкового кода правило автоматически найдет ссылку в базе-источнике, и чтение реквизита ЗапретитьИспользоватьВПроводках пройдет без ошибок.
Если в конкретном документе счет заполняется алгоритмом или читается из строкового реквизита, приведем его к ссылочному типу непосредственно в правиле конвертации свойства (ПКС) в обработчике «Перед выгрузкой»:
Если ТипЗнч(Источник.СчетУчета) = Тип("Строка") Тогда
Значение = ПланыСчетов.Хозрасчетный.НайтиПоКоду(Источник.СчетУчета);
КонецЕсли;
Проанализируем структуру переноса: если план счетов в базе-приемнике уже полностью заполнен и создание новых счетов при выгрузке документов не требуется, выгружать реквизиты счета избыточно. Для оптимизации обмена выполним следующие настройки в ПКО Хозрасчетный:
ЗапретитьИспользоватьВПроводках, наименование и др.), сняв соответствующие флаги в таблице ПКС.Код с установленным флагом «Поиск».Код установим флаг «Получить из входящих данных» или передадим код напрямую в переменную Значение.Такой подход исключит попытки чтения свойств у неприменимых типов данных, уменьшит размер результирующего XML-файла и ускорит процедуру синхронизации данных.