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