При изучении основ разработки в системе 1С по знаменитому пособию М.Г. Радченко многие начинающие программисты сталкиваются с трудностями на 9-м занятии. Типичная ситуация: вы строго следуете инструкциям, копируете код, но при попытке выбрать номенклатуру в документе «Оказание услуги» система выдает критическую ошибку «Поле объекта не обнаружено (Цена)». Давайте подробно разберем, почему это происходит, как проанализировать код и какие настройки метаданных необходимо проверить, чтобы все заработало корректно.
Рассмотрим ситуацию подробнее. Ошибка возникает в общем модуле РаботаСоСправочниками в тот момент, когда функция пытается вернуть значение из структуры, полученной из регистра сведений. Проанализируем фрагмент кода, который чаще всего становится источником проблемы:
Функция РозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт
// Создать вспомогательный объект "Отбор".
Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);
// Получить актуальные значения ресурсов регистра.
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
// Ошибка происходит на следующей строке:
Возврат ЗначенияРесурсов.Цена;
КонецФункции
В этом коде метод ПолучитьПоследнее() обращается к регистру сведений Цены. Он должен вернуть структуру, содержащую значения всех ресурсов регистра на указанную дату для конкретной номенклатуры. Если система сообщает, что поле «Цена» не обнаружено, это означает, что в возвращенной структуре ЗначенияРесурсов просто нет свойства с таким именем.
Выясним основную причину. Как правило, начинающие разработчики при создании регистра сведений Цены забывают добавить в него объект метаданных типа Ресурс. Проверим конфигурацию по шагам:
Регистры сведений.Цены.Данные. Там должны быть две основные ветки: Измерения и Ресурсы.Цена именно в ветке Ресурсы.Важно: Если поле Цена ошибочно добавлено в Измерения, метод ПолучитьПоследнее() не включит его в результат. Измерения служат для фильтрации (отбора), а значения мы получаем только из ресурсов. Если ресурса нет — структура будет пустой или не будет содержать нужного ключа, что и приводит к ошибке Поле объекта не обнаружено.
Проанализируем еще один неочевидный момент — написание имен. В 1С идентификаторы объектов должны строго совпадать в метаданных и в коде. Разберем типичные ошибки именования:
Цена выглядят одинаково. Однако для компилятора 1С это разные символы. Если в конфигураторе вы назвали ресурс «Цена» (с русской С), а в коде написали ЗначенияРесурсов.Cena или использовали латинскую букву в начале слова, система не найдет поле.Для корректной работы метода ПолучитьПоследнее() регистр сведений Цены должен быть периодическим. Разберем, как это проверить:
Цены в дереве конфигурации.Периодичность.Если регистр непериодический, механизм среза последних работает иначе, и это может косвенно влиять на логику получения данных, хотя чаще всего ошибка «Поле не обнаружено» все же связана именно с составом ресурсов.
Чтобы программа не завершалась аварийно, даже если в метаданных что-то изменено, профессиональные разработчики используют защитное программирование. Рассмотрим, как можно модифицировать функцию из учебника, чтобы она была более надежной:
Функция РозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт
Отбор = Новый Структура("Номенклатура", ЭлементНоменклатуры);
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
// Используем метод Свойство() для проверки наличия поля
Если ЗначенияРесурсов.Свойство("Цена") Тогда
Возврат ЗначенияРесурсов.Цена;
Иначе
// Если цена не найдена или ресурс удален, возвращаем 0
Возврат 0;
КонецЕсли;
КонецФункции
В данном примере метод Свойство() позволяет нам сначала убедиться, что поле существует, и только потом обращаться к нему. Это предотвратит «вылет» системы с критической ошибкой.
Если визуальный осмотр метаданных не помог, воспользуемся отладчиком. Это лучший способ увидеть, что именно возвращает система. Пройдем по шагам:
Возврат ЗначенияРесурсов.Цена; (клавиша F9).ЗначенияРесурсов, нажмем правую кнопку мыши и выберем Вычислить выражение (Shift+F9).Посмотрим на пример того, как должна выглядеть структура в идеале. Если ресурс Цена создан правильно, в окне вычисления выражений вы увидите: Структура (Цена = 1500). Если же вы видите Структура () — возвращайтесь в конфигуратор и проверяйте вкладку Данные у вашего регистра.
Подводя итог, можно сказать, что ошибка Поле объекта не обнаружено (Цена) в уроках Радченко — это отличный повод закрепить навыки работы с объектами метаданных. Помните, что 1С — это строго структурированная система, где программный код (Модуль) неразрывно связан с визуальным описанием данных (Конфигуратор). Исправив отсутствие ресурса или опечатку в его имени, вы успешно завершите 9-е занятие и сможете двигаться дальше к освоению профессии разработчика.