Как исправить ошибку Поле объекта не обнаружено (МолочнаяПродукция) при синхронизации между УТ 11 и БП 3.0

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

При сопровождении типовых решений 1С специалисты часто сталкиваются с ситуацией, когда после очередного обновления стандартная синхронизация данных между 1С:Управление торговлей 11 и 1С:Бухгалтерия предприятия 3.0 начинает выдавать критические ошибки. Одной из самых резонансных проблем последних лет стала ошибка Поле объекта не обнаружено (МолочнаяПродукция). В этой статье мы подробно разберем, почему она возникает, и рассмотрим несколько способов её устранения, от простых патчей до программной корректировки правил обмена.

Проанализируем причину возникновения ошибки

Для начала выясним причину сбоя. Как правило, ошибка проявляется в базе-приемнике (чаще всего это Бухгалтерия предприятия) в момент загрузки данных справочника Номенклатура. Проанализируем стек ошибки, который обычно выглядит следующим образом:


{ОбщийМодуль.МенеджерОбменаЧерезУниверсальныйФормат13.Модуль(34366)}: НоменклатураОбъект.ПодконтрольнаяПродукцияВЕТИС = НоменклатураОбъект.МолочнаяПродукция;
{ОбщийМодуль.МенеджерОбменаЧерезУниверсальныйФормат13.Модуль(28427)}: ЗаполнитьПризнакиВидаПродукцииИС(ДанныеДляЗаписиВИБ, ПолученныеДанные.ДополнительныеСвойства.ВидПродукцииИС);

Суть проблемы: В ходе рефакторинга механизмов учета маркируемой продукции фирма «1С» изменила структуру метаданных. Реквизит МолочнаяПродукция в справочнике Номенклатура был признан устаревшим и удален (или скрыт), а его функции перешли к более универсальному механизму через перечисление ВидыПродукцииИС. Однако в коде модуля МенеджерОбменаЧерезУниверсальныйФормат (версии 1.3 и выше) остались жесткие обращения к старому имени реквизита. Когда система пытается записать данные в объект, она обращается к полю, которого физически больше нет в структуре базы данных, что и вызывает исключение.

Разберем путаницу с правилами регистрации (КД 2.0) и правилами обмена (КД 3.0)

Важно понимать разницу между типами правил, чтобы не тратить время на бесполезные действия. Рассмотрим это подробнее:

  1. Правила регистрации (Конвертация данных 2.0): Эти правила определяют только то, какие именно объекты (документы, справочники) должны быть выгружены. Редактирование правил регистрации в КД 2.0 не поможет решить ошибку Поле объекта не обнаружено, так как ошибка происходит на этапе загрузки и записи данных, а не их отбора.
  2. Правила обмена (Универсальный формат / КД 3.0): Синхронизация между современными конфигурациями (УТ 11, БП 3.0, ERP) работает через EnterpriseData (Универсальный формат). Логика преобразования данных здесь жестко прописана в общем модуле МенеджерОбменаЧерезУниверсальныйФормат.

Таким образом, попытки выгружать описание конфигурации через MD83Exp.epf и загружать их в КД 2.0 для исправления этой конкретной ошибки являются ошибочным путем.

Способ 1: Использование расширения конфигурации (Рекомендуемый)

Самый безопасный и быстрый метод — это создание расширения в базе Бухгалтерия предприятия. Рассмотрим пошагово, как это сделать, чтобы не снимать основную конфигурацию с поддержки:

  1. Создадим новое расширение в базе БП.
  2. Найдем общий модуль МенеджерОбменаЧерезУниверсальныйФормат (версия может отличаться, например, 13 или 20, в зависимости от релиза).
  3. Нам необходимо перехватить процедуру ПКО_Справочник_Номенклатура_Получение_ПередЗаписьюПолученныхДанных или вспомогательный метод ЗаполнитьПризнакиВидаПродукцииИС.
  4. Применим метод &Вместо или &ИзменениеИКонтроля.

Проанализируем пример кода для расширения, который позволит обойти ошибку:


&Вместо("ЗаполнитьПризнакиВидаПродукцииИС")
Процедура ИСПР_ЗаполнитьПризнакиВидаПродукцииИС(НоменклатураОбъект, ВидПродукции)
    // Проверяем наличие реквизита перед обращением
    МетаданныеОбъекта = НоменклатураОбъект.Метаданные();
    Если МетаданныеОбъекта.Реквизиты.Найти("МолочнаяПродукция") <> Неопределено Тогда
        // Оригинальная логика, если реквизит еще существует
        НоменклатураОбъект.ПодконтрольнаяПродукцияВЕТИС = НоменклатураОбъект.МолочнаяПродукция;
    Иначе
        // Если реквизита нет, заполняем через новые механизмы или просто игнорируем
        // НоменклатураОбъект.ПодконтрольнаяПродукцияВЕТИС = (ВидПродукции = ПредопределенноеЗначение("Перечисление.ВидыПродукцииИС.МолочнаяПродукция"));
    КонецЕсли;
КонецПроцедуры

Такой подход позволит успешно завершить синхронизацию без прерывания процесса обмена.

Способ 2: Подключение внешнего модуля менеджера обмена

Если вы не хотите создавать расширение, рассмотрим второй метод. Платформа позволяет заменить встроенный модуль обмена на внешнюю обработку без изменения конфигурации. Посмотрим, как это реализовать:

  1. Откроем базу 1С в режиме Конфигуратор.
  2. Найдем общий модуль МенеджерОбменаЧерезУниверсальныйФормат, выделим весь его текст (Ctrl+A) и скопируем.
  3. Создадим новую внешнюю обработку. В модуле объекта этой обработки вставим скопированный текст.
  4. Найдем в тексте проблемную строку с МолочнаяПродукция и закомментируем её или добавим проверку ЗаполнитьЗначенияСвойств.
  5. Сохраним обработку в файл на диске.
  6. В режиме 1С:Предприятие перейдем в Администрирование -> Синхронизация данных -> Настройки синхронизации.
  7. В параметрах синхронизации найдем раздел Служебная информация. Там есть поле Путь к менеджеру обмена (или Использовать внешний менеджер обмена).
  8. Укажем путь к нашей созданной обработке.

Важно: При обновлении конфигурации не забудьте обновить код в этой внешней обработке, иначе вы можете столкнуться с тем, что новые поля в обмене перестанут обрабатываться корректно.

Способ 3: Установка патчей и обновление формата EnterpriseData

Прежде чем приступать к программированию, проверим, нет ли готового решения от фирмы «1С». Рассмотрим стандартные инструменты:

1. Установка исправлений (патчей): Зайдем в раздел Администрирование -> Обслуживание -> Обновление программы -> Установка исправлений (патчей). Выполним поиск по ключевому слову МолочнаяПродукция или Синхронизация. Часто 1С выпускает оперативные патчи (например, EF_00_...), которые автоматически исправляют код в общем модуле.

2. Изменение версии формата: В настройках синхронизации (параметры подключения) проверим, какая версия EnterpriseData используется. Если стоит версия 1.3 или 1.5, попробуем переключиться на 1.10 или выше. В более новых версиях формата структура XDTO-пакетов изменена так, чтобы учитывать новые реквизиты маркировки, и код менеджера обмена для них написан более корректно.

Резюме и рекомендации

Мы проанализировали ситуацию и выяснили, что корень проблемы кроется в несоответствии кода модуля обмена и актуальной структуры метаданных конфигурации. Для решения задачи наиболее эффективным является использование расширения, так как это сохраняет возможность автоматического обновления базы.

Рассмотрим краткий чек-лист действий при возникновении подобных ошибок:

Помните, что подобные ошибки — это следствие стремительного развития законодательства в сфере маркировки товаров, и своевременное обновление обеих конфигураций (и УТ, и БП) до актуальных релизов остается лучшим способом профилактики проблем с обменом данными.

← На главную