При выполнении типовой синхронизации между конфигурациями «Зарплата и управление персоналом» (ЗУП 3.1) и «Бухгалтерия предприятия» (БП 3.0) пользователи часто сталкиваются с ошибкой: Поле объекта не обнаружено (ИнициалыИмени). Чаще всего это происходит в ситуации, когда ЗУП была обновлена до актуального релиза, а Бухгалтерия осталась на старой версии. Разберем подробно, почему возникает эта проблема и какими методами ее можно решить.
Проанализируем ситуацию: синхронизация данных в современных конфигурациях 1С строится на базе технологии EnterpriseData. Это универсальный формат обмена, который имеет свои версии (например, 1.13, 1.15, 1.16). Когда разработчики выпускают обновление ЗУП, они часто добавляют поддержку новых версий формата и вносят изменения в структуру данных для соответствия законодательству.
В последних релизах ЗУП 3.1 (начиная с веток 3.1.27 и 3.1.29) произошел рефакторинг работы с персональными данными. Поле ИнициалыИмени, которое раньше использовалось в правилах обмена или программном коде менеджера обмена, было заменено или переименовано в рамках унификации. Если мы обновляем только одну базу (ЗУП), она начинает выгружать данные в новом формате или использовать обновленный программный интерфейс. Устаревшая «Бухгалтерия», принимая эти данные, пытается обратиться к полю ИнициалыИмени, которого в новой структуре объекта (или в самом XML-файле) уже нет. В результате выполнение программного кода прерывается с критической ошибкой.
Рассмотрим самый правильный и безопасный путь. Разработчики фирмы «1С» проектируют и тестируют обмены для парных релизов конфигураций. Это означает, что определенной версии ЗУП соответствует определенная минимальная версия БП.
Почему это важно:
МенеджерОбменаЧерезУниверсальныйФормат), которые будут знать о новых полях.Если синхронизация нужна «вчера», а обновление основной базы БП занимает много времени, рассмотрите возможность временного перехода к другим способам, но обновление должно оставаться приоритетной задачей.
Если мы не можем обновить БП, попробуем заставить ЗУП «общаться» на старом языке. В настройках синхронизации данных есть возможность указать версию формата обмена.
Разберем по шагам:
Важно: Этот метод помогает не всегда, так как программный код модуля МенеджерОбменаЧерезУниверсальныйФормат в обновленной ЗУП все равно может обращаться к новым структурам данных при формировании выгрузки.
Для программистов существует вариант «обмануть» систему, создав небольшое расширение в базе, где возникает ошибка (в данном случае в БП). Мы можем добавить недостающее свойство или перехватить обращение к нему.
Рассмотрим пример логики, которую можно реализовать в расширении для модуля менеджера обмена:
&Вместо("ПрочитатьОбъект")
Функция Моя_ПрочитатьОбъект(ЧтениеXML, СтруктураОбъекта)
// Логика перехвата чтения объекта
// Если в структуре отсутствует поле ИнициалыИмени,
// добавляем его программно, чтобы избежать ошибки "Поле объекта не обнаружено"
Попытка
Возврат ПродолжитьВызов(ЧтениеXML, СтруктураОбъекта);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
Если СтрНайти(ИнформацияОбОшибке.Описание, "ИнициалыИмени") > 0 Тогда
// Заглушка: добавляем поле в структуру, если его там нет
СтруктураОбъекта.Вставить("ИнициалыИмени", "");
Возврат ПродолжитьВызов(ЧтениеXML, СтруктураОбъекта);
Иначе
ВызватьИсключение;
КонецЕсли;
КонецПопытки;
КонецФункции
Такой подход позволит коду «проскочить» проблемное место. Однако помните, что это временный «костыль». После обновления БП расширение необходимо будет удалить.
Часто подобные ошибки являются массовыми, и фирма «1С» оперативно выпускает патчи (исправления). Патчи устанавливаются без монопольного доступа и изменения метаданных.
Проанализируем список установленных исправлений:
Если вы опытный разработчик и использование расширений невозможно, можно прибегнуть к редактированию модуля МенеджерОбменаЧерезУниверсальныйФормат.
Разберем, на что обратить внимание:
ИнициалыИмени).Объект.ИнициалыИмени используйте конструкцию, проверяющую наличие свойства.Пример безопасного кода:
Если СтруктураДанных.Свойство("ИнициалыИмени") Тогда
Инициалы = СтруктураДанных.ИнициалыИмени;
ИначеЕсли СтруктураДанных.Свойство("Инициалы") Тогда
Инициалы = СтруктураДанных.Инициалы;
Иначе
Инициалы = ""; // Значение по умолчанию
КонецЕсли;
Ситуация, когда одна база обновлена, а вторая нет — это всегда риск для синхронизации. Ошибка Поле объекта не обнаружено (ИнициалыИмени) — классический симптом «разъезда» версий.
Краткий алгоритм действий:
Помните, что ручное вмешательство в код обмена может привести к тому, что данные будут загружены не полностью, поэтому после успешной синхронизации (даже если ошибка исчезла) обязательно сверьте оборотно-сальдовую ведомость и отчеты по зарплате в обеих базах.