При настройке обмена данными между конфигурациями «1С:Зарплата и управление персоналом» (ЗУП) и «1С:ERP Управление предприятием» технические специалисты часто сталкиваются с ошибками на этапе первоначальной загрузки. Одной из самых коварных является ошибка вида: Поле объекта не обнаружено (ИмяПланаОбмена). В этой статье мы подробно разберем, почему возникает эта проблема, как работает механизм поиска узлов обмена и на что стоит обратить внимание при создании собственных планов обмена в дополнение к типовым механизмам.
Рассмотрим ситуацию, когда при выполнении обмена система выдает следующую диагностическую информацию:
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(17382)}: УзелОбменаПолучатель = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодОтКого);
Проанализируем эту строку кода. Здесь программа пытается динамически обратиться к коллекции ПланыОбмена, используя строковую переменную ИмяПланаОбмена. Если в конфигурации базы-приемника отсутствует объект метаданных с таким точным именем, платформа генерирует исключение «Поле объекта не обнаружено». Это происходит потому, что коллекция ПланыОбмена не содержит свойства, имя которого передано в квадратных скобках.
Выясним причину, почему переменная ИмяПланаОбмена может содержать неверное значение. В процессе выгрузки данных из базы-источника (например, ЗУП) в файл обмена (XML) записывается заголовок, в котором указывается имя плана обмена, по которому производится синхронизация. При чтении этого файла в базе-приемнике (ERP) универсальная обработка обмена считывает это имя и пытается найти аналогичный план обмена у себя.
Важный нюанс: как показано в обсуждении, если в ЗУП план обмена называется ОбменЗУПЕРП, а в ERP — ОбменЕРПЗУП, обмен завершится ошибкой. Система не умеет самостоятельно «догадываться», что это корреспондирующие объекты. Для платформы это два абсолютно разных типа метаданных.
Разберем по шагам, как правильно настроить имена объектов в конфигураторе. Первое и самое главное правило: Имя (Name) плана обмена в дереве метаданных должно быть посимвольно идентичным в обеих информационных базах.
Внимание: остерегайтесь визуально похожих букв. Часто ошибка кроется в использовании латиницы вместо кириллицы. Например, буква «Р» в аббревиатуре ERP должна быть латинской, а в слове «ЗУП» — кириллической. Проанализируем ситуацию: если в одной базе вы написали «ERP» (латиницей), а в другой «ЕРП» (кириллицей), внешне они будут выглядеть одинаково: ОбменЗУПЕРП. Однако для 1С это будут разные строки, и ошибка «Поле объекта не обнаружено» сохранится.
После того как мы обеспечили идентичность имен планов обмена, необходимо проверить коды узлов. Взглянем еще раз на строку кода:
УзелОбменаПолучатель = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодОтКого);
Метод НайтиПоКоду ищет в базе-приемнике узел, который представляет собой «базу-отправителя». Рассмотрим логику сопоставления:
Если коды не совпадают (например, в одной базе это «001», а в другой просто «1»), функция НайтиПоКоду вернет пустую ссылку, что в дальнейшем приведет к ошибкам при попытке записи данных или определении правил конвертации.
Проанализируем ситуацию, когда обмен настраивается не через «Универсальный формат» (Enterprise Data), а через «Конвертацию данных 2.1». В этом случае правила обмена хранятся в отдельном XML-файле.
Если вы решили изменить имя плана обмена в конфигураторе, чтобы исправить ошибку «Поле объекта не обнаружено», вам обязательно нужно обновить эти правила. Внутри правил конвертации (ПВД — Правила выгрузки данных) часто жестко прописывается имя плана обмена, к которому они применяются.
Рассмотрим порядок действий:
Рассмотрим важное замечание из обсуждения: в типовой версии 1С:ЗУП 3.1 и 1С:ERP нет специализированного плана обмена с именем ОбменЗУПЕРП. Весь современный обмен строится на базе плана обмена СинхронизацияДанныхЧерезУниверсальныйФормат.
Посмотрим на преимущества использования типового механизма:
Если ваша задача — передача стандартных данных (начисления, отражение зарплаты в финучете), настоятельно рекомендуем использовать СинхронизацияДанныхЧерезУниверсальныйФормат. Создание собственных планов обмена оправдано только в исключительных случаях, когда требуется передача нетиповых объектов, не включенных в Enterprise Data.
Если вы проверили имена, коды узлов и убедились в отсутствии смешения раскладок, но ошибка все еще возникает, проанализируем дополнительные факторы:
1. Очистка кэша конфигурации. Платформа 1С может кэшировать структуру метаданных. При переименовании объектов в конфигураторе база в режиме «Предприятие» может продолжать обращаться к старому идентификатору. Рекомендуется запустить базу с параметром /ClearCache или удалить базу из списка и добавить её заново.
2. Регистр соответствия объектов. Если обмен уже запускался ранее с неправильными именами, проверьте записи в регистре сведений СоответствияОбъектовИнформационныхБаз. В некоторых случаях там могут остаться «битые» ссылки на старые узлы или некорректные идентификаторы типов.
3. Программный поиск в модуле менеджера. Посмотрим, нет ли в модуле менеджера вашего плана обмена переопределенных функций. Иногда разработчики жестко задают логику поиска узлов в функции ПолучитьПланОбмена() или аналогичных. Убедитесь, что там не осталось старых строковых литералов.
Пример кода для проверки доступности плана обмена программно:
ИмяНужногоПлана = "ОбменЗУПЕРП";
Если Метаданные.ПланыОбмена.Найти(ИмяНужногоПлана) = Неопределено Тогда
Сообщить("План обмена с именем " + ИмяНужногоПлана + " не найден в конфигурации!");
КонецЕсли;
Используя данный подход и внимательно проверяя метаданные, мы сможем быстро устранить ошибку и обеспечить стабильную синхронизацию данных между ЗУП и ERP.