Как исправить ошибку «Поле объекта не обнаружено (СтавкаНДС)» в 1С:Бухгалтерия?

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

Многие пользователи и разработчики столкнулись с неприятной ситуацией: после очередного обновления программы «1С:Бухгалтерия 8.3» (БП 3.0) перестали работать привычные внешние обработки загрузки заказов, обмена с сайтами или импорта из Excel. Программа выдает критическую ошибку: «Поле объекта не обнаружено (СтавкаНДС)». Давайте вместе разберемся, почему это произошло и как восстановить работоспособность ваших инструментов.

Выясним причину ошибки: архитектурные изменения 1С

Для начала проанализируем ситуацию в конфигураторе. Ранее в справочнике Справочник.Номенклатура существовал реквизит СтавкаНДС с типом ПеречислениеСсылка.СтавкиНДС. Однако в связи с изменениями законодательства (переход с 18% на 20% и введение новых расчетных ставок) фирма «1С» пересмотрела логику хранения этих данных.

В современных релизах конфигурации «Бухгалтерия предприятия» реквизит СтавкаНДС был переименован в УдалитьСтавкаНДС и помечен на удаление. Вместо него был введен новый реквизит — ВидСтавкиНДС. Его тип данных теперь ПеречислениеСсылка.ВидыСтавокНДС. Главное отличие в том, что старое перечисление содержало конкретные числовые значения (18%, 10%, 0%), а новое содержит абстрактные категории: Общая, Пониженная, БезНДС, Нулевая.

Проблема заключается в том, что ваши внешние обработки или правила обмена по-прежнему обращаются к полю СтавкаНДС, которого больше не существует в структуре объекта «Номенклатура». Рассмотрим подробнее, как это исправить.

Решение 1: Исправление кода во внешней обработке

Если вы используете самописную обработку для загрузки данных, нам необходимо скорректировать программный код в местах записи номенклатуры. Вместо прямого присвоения значения реквизиту СтавкаНДС, мы должны заполнять ВидСтавкиНДС.

Разберем по шагам. Найдем в коде строки, где происходит заполнение объекта номенклатуры. Обычно это выглядит так:


НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.НДС20; // ОШИБКА: этого поля нет

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


// Вместо старой строки пишем:
НоваяНоменклатура.ВидСтавкиНДС = Перечисления.ВидыСтавокНДС.ВидСтавки(Источник.СтавкаНДС);

Если же вы создаете товар «с нуля» и знаете, что ставка должна быть основной (например, 20%), можно использовать прямое назначение:

НоваяНоменклатура.ВидСтавкиНДС = Перечисления.ВидыСтавокНДС.Общая;

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

Решение 2: Корректировка правил конвертации данных (КД 2.1)

Если ошибка возникает при синхронизации (например, между «Управлением торговлей 10.3» и «Бухгалтерией 3.0»), нам потребуется изменить файл правил обмена xml. Выясним, как это сделать в конфигурации «Конвертация данных».

  1. Найдем Правило Конвертации Объектов (ПКО) для справочника Номенклатура.
  2. В списке Правил Конвертации Свойств (ПКС) найдем строку, где источником является СтавкаНДС, а приемником — старая СтавкаНДС.
  3. Изменим Приемник на ВидСтавкиНДС.
  4. Создадим новое правило конвертации для перечислений: ПеречислениеСсылка.СтавкиНДС -> ПеречислениеСсылка.ВидыСтавокНДС.

В таблице соответствий перечислений необходимо прописать связи:

Если вы правите XML-файл правил вручную (в текстовом редакторе), найдите узел, описывающий свойство СтавкаНДС, и замените его на ВидСтавкиНДС, применив соответствующее правило конвертации перечисления.

Решение 3: Использование расширений (для базовых версий и 1С:Фреш)

Для пользователей базовых версий или облачного сервиса «1С:Фреш», где изменение кода конфигурации невозможно, существует вариант с использованием расширений конфигурации. Расширение может «виртуально» добавить отсутствующий реквизит или перехватить процедуру записи объекта, чтобы корректно перенаправить данные.

Проанализируем алгоритм работы такого расширения. Оно перехватывает событие ПередЗаписью справочника Номенклатура. Если в структуру данных при загрузке было передано поле СтавкаНДС, расширение программно пересчитывает его в ВидСтавкиНДС и очищает временные данные, предотвращая ошибку «Поле объекта не обнаружено».

Важный момент для облачных баз: любое расширение во «Фреше» должно проходить аудит безопасности. Убедитесь, что ваше расширение не использует небезопасные методы (например, прямой доступ к файловой системе), иначе служба поддержки его не пропустит.

Решение 4: «Быстрый костыль» в текстовом редакторе (XML/CSV)

Если вам нужно срочно загрузить один файл и нет времени на программирование, можно попробовать метод «грубой силы». Рассмотрим ситуацию, когда данные выгружаются из другой системы в формате XML или CSV.

Вы можете открыть файл обмена в продвинутом текстовом редакторе (например, Notepad++) и выполнить массовую замену текста:

  1. Найти: СтавкаНДС
  2. Заменить на: УдалитьСтавкаНДС

Поскольку 1С сохранила старое поле под именем УдалитьСтавкаНДС в целях совместимости, программа может «проглотить» такой файл без ошибки. Однако будьте осторожны: это временное решение. При последующих обновлениях поле УдалитьСтавкаНДС может быть полностью вырезано из конфигурации, и тогда этот метод перестанет работать.

Подведем итоги

Мы выяснили, что ошибка «Поле объекта не обнаружено (СтавкаНДС)» — это следствие планового обновления метаданных 1С. Для долгосрочного решения проблемы необходимо:

Помните, что в документах (Счета, Реализации) реквизит СтавкаНДС остался прежним, изменения коснулись только справочника Номенклатура. Совместный анализ кода и структуры метаданных поможет вам быстро вернуть систему в рабочее состояние.

← На главную