Многие пользователи и разработчики столкнулись с неприятной ситуацией: после очередного обновления программы «1С:Бухгалтерия 8.3» (БП 3.0) перестали работать привычные внешние обработки загрузки заказов, обмена с сайтами или импорта из Excel. Программа выдает критическую ошибку: «Поле объекта не обнаружено (СтавкаНДС)». Давайте вместе разберемся, почему это произошло и как восстановить работоспособность ваших инструментов.
Для начала проанализируем ситуацию в конфигураторе. Ранее в справочнике Справочник.Номенклатура существовал реквизит СтавкаНДС с типом ПеречислениеСсылка.СтавкиНДС. Однако в связи с изменениями законодательства (переход с 18% на 20% и введение новых расчетных ставок) фирма «1С» пересмотрела логику хранения этих данных.
В современных релизах конфигурации «Бухгалтерия предприятия» реквизит СтавкаНДС был переименован в УдалитьСтавкаНДС и помечен на удаление. Вместо него был введен новый реквизит — ВидСтавкиНДС. Его тип данных теперь ПеречислениеСсылка.ВидыСтавокНДС. Главное отличие в том, что старое перечисление содержало конкретные числовые значения (18%, 10%, 0%), а новое содержит абстрактные категории: Общая, Пониженная, БезНДС, Нулевая.
Проблема заключается в том, что ваши внешние обработки или правила обмена по-прежнему обращаются к полю СтавкаНДС, которого больше не существует в структуре объекта «Номенклатура». Рассмотрим подробнее, как это исправить.
Если вы используете самописную обработку для загрузки данных, нам необходимо скорректировать программный код в местах записи номенклатуры. Вместо прямого присвоения значения реквизиту СтавкаНДС, мы должны заполнять ВидСтавкиНДС.
Разберем по шагам. Найдем в коде строки, где происходит заполнение объекта номенклатуры. Обычно это выглядит так:
НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.НДС20; // ОШИБКА: этого поля нет
Нам нужно заменить это на использование нового реквизита и нового типа перечисления. В типовых конфигурациях 1С предусмотрена специальная функция для автоматического преобразования старой ставки в новый вид. Рассмотрим пример правильного кода:
// Вместо старой строки пишем:
НоваяНоменклатура.ВидСтавкиНДС = Перечисления.ВидыСтавокНДС.ВидСтавки(Источник.СтавкаНДС);
Если же вы создаете товар «с нуля» и знаете, что ставка должна быть основной (например, 20%), можно использовать прямое назначение:
НоваяНоменклатура.ВидСтавкиНДС = Перечисления.ВидыСтавокНДС.Общая;
Обратите внимание: важно проверять, не является ли объект группой. Попытка записать реквизит ВидСтавкиНДС для папки справочника приведет к очередной ошибке, так как этот реквизит доступен только для элементов.
Если ошибка возникает при синхронизации (например, между «Управлением торговлей 10.3» и «Бухгалтерией 3.0»), нам потребуется изменить файл правил обмена xml. Выясним, как это сделать в конфигурации «Конвертация данных».
Номенклатура.СтавкаНДС, а приемником — старая СтавкаНДС.ВидСтавкиНДС.ПеречислениеСсылка.СтавкиНДС -> ПеречислениеСсылка.ВидыСтавокНДС.В таблице соответствий перечислений необходимо прописать связи:
НДС18 и НДС20 должны соответствовать значению Общая;НДС10 — значению Пониженная;БезНДС — значению БезНДС.Если вы правите XML-файл правил вручную (в текстовом редакторе), найдите узел, описывающий свойство СтавкаНДС, и замените его на ВидСтавкиНДС, применив соответствующее правило конвертации перечисления.
Для пользователей базовых версий или облачного сервиса «1С:Фреш», где изменение кода конфигурации невозможно, существует вариант с использованием расширений конфигурации. Расширение может «виртуально» добавить отсутствующий реквизит или перехватить процедуру записи объекта, чтобы корректно перенаправить данные.
Проанализируем алгоритм работы такого расширения. Оно перехватывает событие ПередЗаписью справочника Номенклатура. Если в структуру данных при загрузке было передано поле СтавкаНДС, расширение программно пересчитывает его в ВидСтавкиНДС и очищает временные данные, предотвращая ошибку «Поле объекта не обнаружено».
Важный момент для облачных баз: любое расширение во «Фреше» должно проходить аудит безопасности. Убедитесь, что ваше расширение не использует небезопасные методы (например, прямой доступ к файловой системе), иначе служба поддержки его не пропустит.
Если вам нужно срочно загрузить один файл и нет времени на программирование, можно попробовать метод «грубой силы». Рассмотрим ситуацию, когда данные выгружаются из другой системы в формате XML или CSV.
Вы можете открыть файл обмена в продвинутом текстовом редакторе (например, Notepad++) и выполнить массовую замену текста:
СтавкаНДСУдалитьСтавкаНДСПоскольку 1С сохранила старое поле под именем УдалитьСтавкаНДС в целях совместимости, программа может «проглотить» такой файл без ошибки. Однако будьте осторожны: это временное решение. При последующих обновлениях поле УдалитьСтавкаНДС может быть полностью вырезано из конфигурации, и тогда этот метод перестанет работать.
Мы выяснили, что ошибка «Поле объекта не обнаружено (СтавкаНДС)» — это следствие планового обновления метаданных 1С. Для долгосрочного решения проблемы необходимо:
СтавкаНДС на ВидСтавкиНДС.Перечисления.ВидыСтавокНДС.ВидСтавки() для корректной конвертации.Помните, что в документах (Счета, Реализации) реквизит СтавкаНДС остался прежним, изменения коснулись только справочника Номенклатура. Совместный анализ кода и структуры метаданных поможет вам быстро вернуть систему в рабочее состояние.