Как исправить ошибку «Поле объекта не обнаружено (Цена)» в 9 занятии учебника Радченко?

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

При изучении основ разработки в системе 1С по знаменитому пособию М.Г. Радченко многие начинающие программисты сталкиваются с трудностями на 9-м занятии. Типичная ситуация: вы строго следуете инструкциям, копируете код, но при попытке выбрать номенклатуру в документе «Оказание услуги» система выдает критическую ошибку «Поле объекта не обнаружено (Цена)». Давайте подробно разберем, почему это происходит, как проанализировать код и какие настройки метаданных необходимо проверить, чтобы все заработало корректно.

Анализ программного кода и возникшей ситуации

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


Функция РозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт 
    // Создать вспомогательный объект "Отбор".
    Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);
    
    // Получить актуальные значения ресурсов регистра.
    ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
    
    // Ошибка происходит на следующей строке:
    Возврат ЗначенияРесурсов.Цена;
КонецФункции

В этом коде метод ПолучитьПоследнее() обращается к регистру сведений Цены. Он должен вернуть структуру, содержащую значения всех ресурсов регистра на указанную дату для конкретной номенклатуры. Если система сообщает, что поле «Цена» не обнаружено, это означает, что в возвращенной структуре ЗначенияРесурсов просто нет свойства с таким именем.

Причина 1: Отсутствие ресурса в метаданных (Самая частая)

Выясним основную причину. Как правило, начинающие разработчики при создании регистра сведений Цены забывают добавить в него объект метаданных типа Ресурс. Проверим конфигурацию по шагам:

  1. Откроем дерево конфигурации и найдем ветку Регистры сведений.
  2. Развернем регистр Цены.
  3. Посмотрим в подсистему Данные. Там должны быть две основные ветки: Измерения и Ресурсы.
  4. Проверим наличие поля Цена именно в ветке Ресурсы.

Важно: Если поле Цена ошибочно добавлено в Измерения, метод ПолучитьПоследнее() не включит его в результат. Измерения служат для фильтрации (отбора), а значения мы получаем только из ресурсов. Если ресурса нет — структура будет пустой или не будет содержать нужного ключа, что и приводит к ошибке Поле объекта не обнаружено.

Причина 2: Опечатки и «коварная» латиница

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

Причина 3: Периодичность регистра

Для корректной работы метода ПолучитьПоследнее() регистр сведений Цены должен быть периодическим. Разберем, как это проверить:

  1. Выделим регистр Цены в дереве конфигурации.
  2. В палитре свойств найдем поле Периодичность.
  3. Убедимся, что там выбрано значение, отличное от «Непериодический» (например, «В пределах секунды»).

Если регистр непериодический, механизм среза последних работает иначе, и это может косвенно влиять на логику получения данных, хотя чаще всего ошибка «Поле не обнаружено» все же связана именно с составом ресурсов.

Рекомендации по безопасному написанию кода

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


Функция РозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт 
    Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);
    ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
    
    // Используем метод Свойство() для проверки наличия поля
    Если ЗначенияРесурсов.Свойство("Цена") Тогда
        Возврат ЗначенияРесурсов.Цена;
    Иначе
        // Если цена не найдена или ресурс удален, возвращаем 0
        Возврат 0;
    КонецЕсли;
КонецФункции

В данном примере метод Свойство() позволяет нам сначала убедиться, что поле существует, и только потом обращаться к нему. Это предотвратит «вылет» системы с критической ошибкой.

Как использовать отладчик для поиска проблемы

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

  1. Установим точку останова на строке Возврат ЗначенияРесурсов.Цена; (клавиша F9).
  2. Запустим 1С в режиме отладки и дойдем до момента возникновения ошибки.
  3. Когда выполнение остановится, выделим переменную ЗначенияРесурсов, нажмем правую кнопку мыши и выберем Вычислить выражение (Shift+F9).
  4. В открывшемся окне мы увидим реальный состав структуры. Если списка полей нет или он пуст — значит, проблема точно в метаданных регистра (отсутствуют ресурсы).

Посмотрим на пример того, как должна выглядеть структура в идеале. Если ресурс Цена создан правильно, в окне вычисления выражений вы увидите: Структура (Цена = 1500). Если же вы видите Структура () — возвращайтесь в конфигуратор и проверяйте вкладку Данные у вашего регистра.

Заключение

Подводя итог, можно сказать, что ошибка Поле объекта не обнаружено (Цена) в уроках Радченко — это отличный повод закрепить навыки работы с объектами метаданных. Помните, что 1С — это строго структурированная система, где программный код (Модуль) неразрывно связан с визуальным описанием данных (Конфигуратор). Исправив отсутствие ресурса или опечатку в его имени, вы успешно завершите 9-е занятие и сможете двигаться дальше к освоению профессии разработчика.

← На главную