Ошибка «Поле объекта не обнаружено» — одна из самых часто встречающихся преград, с которой сталкиваются начинающие разработчики при написании модулей проведения документов. Она сигнализирует о том, что программный код пытается обратиться к свойству или реквизиту объекта, которого физически не существует в структуре метаданных или в текущем контексте выполнения. В данной статье мы подробно разберем, почему возникает эта ошибка на примере регистра сведений, и научимся методам ее эффективного устранения.
Рассмотрим типовой сценарий: разработчик создает процедуру ОбработкаПроведения для документа кадрового учета. Цель — записать данные в регистр сведений. Код выглядит следующим образом:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.РегистрСведений1.Записывать = Истина;
Движения.РегистрСведений1.Очистить();
Движение = Движения.РегистрСведений1.Добавить();
Движение.Период = Дата;
Движение.Сотрудник = Сотрудник;
Движение.Подразделение = Подразделение;
Движение.Должность = Должность;
Движение.Оклад = Оклад;
// Ошибка возникает в следующей строке:
Движение.ПричиныИзмененияСостояний = Перечисления.ПричиныИзмененияСостояний.Перемещение;
КонецПроцедуры
Система выдает диагностическое сообщение: {Документ.КадровоеПеремещение.МодульОбъекта(12)}: Поле объекта не обнаружено (ПричиныИзмененияСостояний). Это означает, что у объекта Движение (который является записью регистра) нет колонки с таким именем.
Проанализируем структуру метаданных. В 1С существует негласный стандарт именования. Объекты метаданных (например, Перечисления) часто именуются во множественном числе: ПричиныИзмененияСостояний. Однако реквизиты, которые используют это перечисление в качестве типа данных, обычно именуются в единственном числе: ПричинаИзмененияСостояния.
Разберем по шагам, как исправить эту опечатку:
ПричинаИзмененияСостояния.Правильный вариант обращения будет выглядеть так:
Движение.ПричинаИзмененияСостояния = Перечисления.ПричиныИзмененияСостояния.Перемещение;
Иногда код выглядит абсолютно правильно, но ошибка сохраняется. Проанализируем ситуацию, когда в имени реквизита используется латиница вместо кириллицы. Буквы «с», «а», «о», «е», «р» выглядят одинаково в обоих алфавитах.
Для решения этой проблемы рекомендуем выполнить следующие действия:
Чтобы избежать подобных ошибок в будущем, научимся пользоваться механизмом автодополнения. В 1С:Предприятие встроен мощный инструмент интеллектуальной помощи. Когда вы ставите точку после переменной Движение., система должна автоматически выпадающим списком показать все доступные поля.
Важное правило: если после ввода точки и нажатия Ctrl + Space вы не видите нужного поля в списке — значит, его либо нет, либо вы ошиблись в имени объекта выше по коду, либо конфигурация не обновлена.
Выясним еще одну неочевидную причину. Программист мог добавить реквизит в дерево конфигурации, но не нажать клавишу F7 (или синюю кнопку «Обновить конфигурацию базы данных»). В этом случае «Основная конфигурация» уже знает о новом поле, а «Конфигурация базы данных», в которой выполняется код проведения, — еще нет. Всегда проверяйте, приняты ли изменения в систему.
Если вы зашли в тупик, воспользуемся самым надежным инструментом — отладкой. Рассмотрим алгоритм действий:
Движение и нажмите Shift + F9 (Вычислить выражение).В списке свойств объекта вы увидите реальные имена всех колонок регистра, которые доступны для записи. Это позволит мгновенно обнаружить лишний символ или опечатку, которую замыленный глаз не замечает при чтении текста.
Рассмотрим более структурированный пример заполнения движений, который минимизирует риск ошибок. Используем данные из выборки запроса, что является хорошим тоном разработки:
// Предположим, у нас есть Выборка из запроса по табличной части документа
Пока Выборка.Следующий() Цикл
Движение = Движения.РегистрСведений1.Добавить();
Движение.Период = Дата;
// Используем автодополнение для исключения опечаток
Движение.ФизЛицо = Выборка.Сотрудник;
Движение.Подразделение = Выборка.Подразделение;
Движение.Должность = Выборка.Должность;
// Внимательно следим за соответствием имен реквизитов и перечислений
Движение.ПричинаИзмененияСостояния = Перечисления.ПричиныИзмененияСостояния.Перемещение;
КонецЦикла;
Подведем итоги. Ошибка Поле объекта не обнаружено в 90% случаев при работе с регистрами вызвана банальной человеческой невнимательностью. Помните, что для системы Причина и Причины — это два совершенно разных идентификатора. Всегда используйте копирование имен из метаданных и контекстную подсказку при написании кода. Если ошибка кажется мистической — используйте отладчик, чтобы увидеть объект глазами платформы 1С.