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