При сопровождении типовых решений 1С специалисты часто сталкиваются с ситуацией, когда после очередного обновления стандартная синхронизация данных между 1С:Управление торговлей 11 и 1С:Бухгалтерия предприятия 3.0 начинает выдавать критические ошибки. Одной из самых резонансных проблем последних лет стала ошибка Поле объекта не обнаружено (МолочнаяПродукция). В этой статье мы подробно разберем, почему она возникает, и рассмотрим несколько способов её устранения, от простых патчей до программной корректировки правил обмена.
Для начала выясним причину сбоя. Как правило, ошибка проявляется в базе-приемнике (чаще всего это Бухгалтерия предприятия) в момент загрузки данных справочника Номенклатура. Проанализируем стек ошибки, который обычно выглядит следующим образом:
{ОбщийМодуль.МенеджерОбменаЧерезУниверсальныйФормат13.Модуль(34366)}: НоменклатураОбъект.ПодконтрольнаяПродукцияВЕТИС = НоменклатураОбъект.МолочнаяПродукция;
{ОбщийМодуль.МенеджерОбменаЧерезУниверсальныйФормат13.Модуль(28427)}: ЗаполнитьПризнакиВидаПродукцииИС(ДанныеДляЗаписиВИБ, ПолученныеДанные.ДополнительныеСвойства.ВидПродукцииИС);
Суть проблемы: В ходе рефакторинга механизмов учета маркируемой продукции фирма «1С» изменила структуру метаданных. Реквизит МолочнаяПродукция в справочнике Номенклатура был признан устаревшим и удален (или скрыт), а его функции перешли к более универсальному механизму через перечисление ВидыПродукцииИС. Однако в коде модуля МенеджерОбменаЧерезУниверсальныйФормат (версии 1.3 и выше) остались жесткие обращения к старому имени реквизита. Когда система пытается записать данные в объект, она обращается к полю, которого физически больше нет в структуре базы данных, что и вызывает исключение.
Важно понимать разницу между типами правил, чтобы не тратить время на бесполезные действия. Рассмотрим это подробнее:
КД 2.0 не поможет решить ошибку Поле объекта не обнаружено, так как ошибка происходит на этапе загрузки и записи данных, а не их отбора.МенеджерОбменаЧерезУниверсальныйФормат.Таким образом, попытки выгружать описание конфигурации через MD83Exp.epf и загружать их в КД 2.0 для исправления этой конкретной ошибки являются ошибочным путем.
Самый безопасный и быстрый метод — это создание расширения в базе Бухгалтерия предприятия. Рассмотрим пошагово, как это сделать, чтобы не снимать основную конфигурацию с поддержки:
МенеджерОбменаЧерезУниверсальныйФормат (версия может отличаться, например, 13 или 20, в зависимости от релиза).ПКО_Справочник_Номенклатура_Получение_ПередЗаписьюПолученныхДанных или вспомогательный метод ЗаполнитьПризнакиВидаПродукцииИС.Проанализируем пример кода для расширения, который позволит обойти ошибку:
&Вместо("ЗаполнитьПризнакиВидаПродукцииИС")
Процедура ИСПР_ЗаполнитьПризнакиВидаПродукцииИС(НоменклатураОбъект, ВидПродукции)
// Проверяем наличие реквизита перед обращением
МетаданныеОбъекта = НоменклатураОбъект.Метаданные();
Если МетаданныеОбъекта.Реквизиты.Найти("МолочнаяПродукция") <> Неопределено Тогда
// Оригинальная логика, если реквизит еще существует
НоменклатураОбъект.ПодконтрольнаяПродукцияВЕТИС = НоменклатураОбъект.МолочнаяПродукция;
Иначе
// Если реквизита нет, заполняем через новые механизмы или просто игнорируем
// НоменклатураОбъект.ПодконтрольнаяПродукцияВЕТИС = (ВидПродукции = ПредопределенноеЗначение("Перечисление.ВидыПродукцииИС.МолочнаяПродукция"));
КонецЕсли;
КонецПроцедуры
Такой подход позволит успешно завершить синхронизацию без прерывания процесса обмена.
Если вы не хотите создавать расширение, рассмотрим второй метод. Платформа позволяет заменить встроенный модуль обмена на внешнюю обработку без изменения конфигурации. Посмотрим, как это реализовать:
МенеджерОбменаЧерезУниверсальныйФормат, выделим весь его текст (Ctrl+A) и скопируем.МолочнаяПродукция и закомментируем её или добавим проверку ЗаполнитьЗначенияСвойств.Важно: При обновлении конфигурации не забудьте обновить код в этой внешней обработке, иначе вы можете столкнуться с тем, что новые поля в обмене перестанут обрабатываться корректно.
Прежде чем приступать к программированию, проверим, нет ли готового решения от фирмы «1С». Рассмотрим стандартные инструменты:
1. Установка исправлений (патчей): Зайдем в раздел Администрирование -> Обслуживание -> Обновление программы -> Установка исправлений (патчей). Выполним поиск по ключевому слову МолочнаяПродукция или Синхронизация. Часто 1С выпускает оперативные патчи (например, EF_00_...), которые автоматически исправляют код в общем модуле.
2. Изменение версии формата: В настройках синхронизации (параметры подключения) проверим, какая версия EnterpriseData используется. Если стоит версия 1.3 или 1.5, попробуем переключиться на 1.10 или выше. В более новых версиях формата структура XDTO-пакетов изменена так, чтобы учитывать новые реквизиты маркировки, и код менеджера обмена для них написан более корректно.
Мы проанализировали ситуацию и выяснили, что корень проблемы кроется в несоответствии кода модуля обмена и актуальной структуры метаданных конфигурации. Для решения задачи наиболее эффективным является использование расширения, так как это сохраняет возможность автоматического обновления базы.
Рассмотрим краткий чек-лист действий при возникновении подобных ошибок:
Номенклатуру из регистрации (как временная мера), чтобы не блокировать обмен документами.Помните, что подобные ошибки — это следствие стремительного развития законодательства в сфере маркировки товаров, и своевременное обновление обеих конфигураций (и УТ, и БП) до актуальных релизов остается лучшим способом профилактики проблем с обменом данными.