Синхронизация данных между конфигурациями 1С:Управление торговлей 11 и 1С:Бухгалтерия предприятия 3.0 — это сложный процесс, основанный на использовании универсального формата обмена данными (EnterpriseData). К сожалению, в некоторых релизах, таких как УТ 11.4.11.104, пользователи сталкиваются с критической ошибкой, которая полностью блокирует выгрузку данных. В этой статье мы подробно разберем причины возникновения этой ошибки и изучим несколько способов ее решения: от быстрого исправления в коде до использования официальных патчей.
Давайте проанализируем ситуацию. Ошибка возникает на стороне информационной базы-источника (в нашем случае это УТ 11) в момент формирования пакета данных для отправки. Текст ошибки четко указывает на проблему: Поле объекта не обнаружено (КодВидаНоменклатурнойСпецификации). Если мы изучим стек вызова, то увидим, что сбой происходит в общем модуле МенеджерОбменаЧерезУниверсальныйФормат в процедуре, отвечающей за отправку справочника Номенклатура.
Выясним причину. В данном релизе разработчики допустили опечатку в программном коде. В метаданных конфигурации существует реквизит КодВидаНоменклатурнойКлассификации, который был добавлен для интеграции с Национальным каталогом и системой маркировки «Честный знак». Однако в модуле обмена программисты ошибочно обратились к свойству КодВидаНоменклатурнойСпецификации. Такого поля в справочнике Номенклатура не существует, что и вызывает экстренное завершение процесса синхронизации.
Это самый быстрый способ возобновить работу обмена, если ваша база уже снята с поддержки или вы готовы внести изменения непосредственно в основную конфигурацию. Рассмотрим пошагово, что необходимо сделать:
МенеджерОбменаЧерезУниверсальныйФормат.ПКО_Справочник_Номенклатура_Отправка_ПриОтправкеДанных. Обычно это очень объемный модуль, поэтому воспользуемся глобальным поиском (Ctrl+Shift+F) по строке "КодВидаНоменклатурнойСпецификации".11.4.11.104 он выглядит примерно так:
// Ошибочный фрагмент кода
Если ВерсияФорматаЧислом(КомпонентыОбмена.ВерсияФорматаОбмена) >= ВерсияФорматаЧислом("1.5") Тогда
ДанныеXDTO.Вставить("КодВидаНоменклатурнойСпецификации", ДанныеИБ.КодВидаНоменклатурнойСпецификации);
КонецЕсли;
Спецификации на Классификации. Исправленный код должен выглядеть следующим образом:
// Исправленный фрагмент кода
Если ВерсияФорматаЧислом(КомпонентыОбмена.ВерсияФорматаОбмена) >= ВерсияФорматаЧислом("1.5") Тогда
ДанныеXDTO.Вставить("КодВидаНоменклатурнойСпецификации", ДанныеИБ.КодВидаНоменклатурнойКлассификации);
КонецЕсли;
Важное примечание: Обратите внимание, что в методе Вставить первый параметр (имя свойства в формате XDTO) остается прежним — "КодВидаНоменклатурнойСпецификации", так как именно такое имя ожидает принимающая сторона в XML-пакете. Ошибка заключается именно во втором параметре — обращении к свойству ДанныеИБ (данные информационной базы).
Если ваша конфигурация находится на полной поддержке и вы не хотите ее снимать ради одной строчки кода, наиболее правильным методом будет создание расширения. Рассмотрим этот процесс.
МенеджерОбменаЧерезУниверсальныйФормат.ПКО_Справочник_Номенклатура_Отправка_ПриОтправкеДанных, используя аннотацию &Вместо.Использование расширения позволяет сохранить возможность автоматического обновления типовой конфигурации в будущем, при этом эффективно решая проблему "здесь и сейчас".
Компания 1С оперативно выпустила исправление для данной ошибки. Если в вашей базе настроена автоматическая загрузка патчей, проверьте наличие установленного исправления с кодом EF_00_00282672. Если патч не установился автоматически, выполните следующие действия:
Также стоит отметить, что в последующих релизах (начиная с 11.4.11.106) эта ошибка была исправлена на уровне кода конфигурации. Обновление до актуального релиза — самый надежный способ избавиться от подобных багов.
Иногда даже после внесения правок в код синхронизация продолжает выдавать ошибку на тех же самых объектах. Это происходит из-за того, что система пытается выгрузить ранее подготовленные данные из кэша или повторно обработать зарегистрированные изменения. Чтобы гарантированно завершить обмен, проделаем следующие шаги:
Во-первых, проверим состав отправляемых данных. Перейдем в настройки синхронизации и откроем окно Состав отправляемых данных. Найдем справочник Номенклатура. Если там зарегистрированы те самые позиции, на которых спотыкался обмен (например, "Губка для мытья посуды"), попробуем снять их с регистрации и зарегистрировать заново. Это заставит менеджер обмена повторно выполнить процедуру ПриОтправкеДанных уже с использованием нашего исправленного кода.
Во-вторых, убедимся, что версия формата обмена в настройках синхронизации соответствует актуальной (например, 1.7 или 1.8). Иногда помогает переключение версии формата на одну итерацию назад и обратно — это инициирует обновление кэша правил обмена.
Подведем итог. Ошибка Поле объекта не обнаружено (КодВидаНоменклатурнойСпецификации) является классическим примером человеческого фактора при разработке тиражных решений. Понимание того, как работает механизм EnterpriseData и где искать менеджеры обмена, позволяет администратору или программисту 1С быстро диагностировать и устранить проблему, не дожидаясь выхода следующего официального обновления.