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