Разработка и Конфигурация · 9 мин
Как получить значение из поля в 1С
Как получить значение из поля в 1С: обращение к реквизитам объекта, формы, запроса и табличной части. Примеры кода на встроенном языке, типичные ошибки и проверка результата.
Получение значения из поля — базовая операция при работе с 1С: она нужна и пользователю, который хочет увидеть данные в карточке объекта, и разработчику, пишущему обработку или отчёт. Способ зависит от того, где находится поле: это может быть реквизит справочника или документа, поле формы, колонка табличной части, поле результата запроса или поле таблицы значений.
Ошибки при обращении к полям — одна из самых частых причин сообщений вида «Поле объекта не обнаружено». Обычно причина в неверном имени реквизита, обращении к данным объекта, который не открыт на чтение, или попытке прочитать поле у значения, которое не содержит такого свойства. Понимание структуры объекта и контекста выполнения кода решает большинство таких проблем.
Ниже разобраны основные сценарии: чтение реквизитов объектов, работа с полями формы, получение значений через запрос, обращение к табличным частям и проверка результата. Примеры приведены на встроенном языке 1С и подходят для управляемых и обычных форм с учётом указанных различий.
Как устроено обращение к полям в 1С
Встроенный язык 1С использует точечную нотацию: имя переменной, затем точка, затем имя свойства или реквизита. Например, Контрагент.ИНН вернёт значение реквизита «ИНН», если переменная Контрагент содержит объект или ссылку на элемент справочника с таким реквизитом. Регистр букв в именах реквизитов не учитывается, но опечатка приведёт к ошибке времени выполнения.
Важно различать, что лежит в переменной: ссылку, объект или значение простого типа. Ссылка — это «указатель» на запись в базе; обращение к реквизиту через точку от ссылки заставляет платформу неявно считывать данные из базы. Объект — полноценная запись в памяти, полученная методом ПолучитьОбъект(). Простые значения (число, строка, дата) не имеют реквизитов, и обращение к ним через точку вызовет ошибку.
Получение значения реквизита справочника или документа
Если у вас есть ссылка на элемент, значение реквизита можно прочитать напрямую:
КонтрагентСсылка = Справочники.Контрагенты.НайтиПоКоду("000000001");
ИНН = КонтрагентСсылка.ИНН;
Такой вариант удобен, когда нужно одно-два поля. Однако каждое обращение через точку от ссылки — это отдельное обращение к данным. Если нужно прочитать много реквизитов или обойти список элементов в цикле, лучше использовать запрос: он заберёт все нужные поля одним обращением к базе.
Перед чтением реквизита полезно убедиться, что ссылка не пустая и элемент существует. Иначе вы получите либо ошибку, либо неопределённое значение. Проверка выполняется функцией ЗначениеЗаполнено() или методом Пустая() у ссылки.
- 1Получите ссылку на элемент: поиском по коду, наименованию или из другого реквизита
- 2Проверьте, что ссылка заполнена: НЕ Ссылка.Пустая()
- 3Обратитесь к реквизиту через точку: Ссылка.ИмяРеквизита
- 4Если нужно изменить значение — получите объект методом ПолучитьОбъект(), установите реквизит и вызовите Записать()
- 5Проверьте результат, выведя значение через Сообщить() или в отладчике
Чтение значения поля на форме
Поля на форме связаны с данными через реквизиты формы. В модуле формы значение читается обращением к реквизиту формы или к свойству объекта. Для основной формы объекта (например, документа) данные доступны через реквизит Объект: Объект.Номер, Объект.Контрагент. Самостоятельно добавленные реквизиты формы читаются просто по имени.
Частая ошибка — попытка прочитать значение из элемента формы (например, Элементы.ПолеКонтрагент). Элемент формы — это визуальный контрол, а не данные. Значение хранится в реквизите, с которым элемент связан через свойство «ПутьКДанным». Поэтому правильно читать данные, а не элемент.
На клиенте (в процедурах с директивой &НаКлиенте) доступны те же реквизиты формы, но нельзя выполнять запросы и обращаться к менеджерам объектов напрямую. Если нужно дочитать данные с сервера, вызывается серверная процедура, которая возвращает значение.
Получение значений через запрос
Запрос — основной способ массового чтения полей. В тексте запроса перечисляются нужные поля, а результат обходится выборкой:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка,
| Контрагенты.ИНН,
| Контрагенты.Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ИНН = Выборка.ИНН;
КонецЦикла;
Имя поля в выборке совпадает с именем, указанным в списке выборки запроса (или с псевдонимом после ключевого слова КАК). Если обратиться к полю, которого нет в выборке, возникнет ошибка «Поле не найдено». При необходимости результат можно выгрузить в таблицу значений методом Выгрузить() и обращаться к колонкам по имени.
Работа с табличными частями и таблицами значений
Табличная часть документа — это коллекция строк. Значение поля конкретной строки читается так же, через точку: ДокументОбъект.Товары[0].Номенклатура вернёт значение из первой строки. В цикле обращение выглядит так:
Для Каждого СтрокаТовары Из ДокументОбъект.Товары Цикл
Сумма = СтрокаТовары.Сумма;
КонецЦикла;
Для таблиц значений действует то же правило: колонка доступна по имени через точку от строки. Если имя колонки заранее неизвестно и хранится в переменной, используйте индексное обращение через квадратные скобки: Строка[ИмяКолонки]. Это работает и для строк табличных частей, и для структур.
ИмяПоля = "Сумма";
Значение = СтрокаТаблицы[ИмяПоля]; // обращение по имени из переменнойКак проверить, что значение получено верно
Самый надёжный способ — отладчик: поставьте точку останова на строке после чтения и посмотрите значение переменной в табло. Для быстрой проверки без отладки подойдёт вывод через Сообщить(), но не оставляйте такие строки в рабочем коде обработок, которые запускаются у пользователей.
Проверяйте не только само значение, но и его тип. Функция ТипЗнч() покажет, что реально вернулось: ожидаемая ссылка, строка или Неопределено. Это особенно важно при обращении к полям составного типа и к результатам запросов с левыми соединениями, где поле может содержать NULL.
Как проверить результат
Содержит ожидаемые данные нужного типа
Неопределено, NULL или значение другого типа
Ссылка заполнена, элемент существует в базе
Пустая ссылка или битая ссылка на удалённый объект
Совпадает с именем в конфигураторе
Опечатка — ошибка «Поле объекта не обнаружено»
Типичные ошибки и ограничения
Ошибка «Поле объекта не обнаружено» почти всегда означает одно из трёх: опечатку в имени реквизита, обращение к значению, у которого нет такого свойства, или попытку прочитать реквизит у пустого значения. Проверьте имя в конфигураторе и тип переменной в отладчике.
Второй класс проблем — производительность. Чтение реквизитов через точку от ссылки внутри цикла по тысячам элементов приводит к множеству обращений к базе. Замените такой код запросом — это ускорит выполнение на порядки. Третья группа ошибок связана с контекстом: на клиенте управляемой формы недоступны запросы и методы объектов, требующие сервера.
Что важно запомнить
Реквизит читается через точку от объекта или ссылки, поле выборки — по имени из запроса, данные формы — из реквизитов формы, а не из элементов. Перед чтением проверяйте заполненность ссылки, после — тип полученного значения. Для массового чтения используйте запрос вместо обхода ссылок.
Частые вопросы
Как получить значение реквизита, если известно только его имя в виде строки?
Используйте обращение через квадратные скобки: Объект[ИмяРеквизита], где ИмяРеквизита — строковая переменная. Такой приём работает для объектов, строк табличных частей, структур и строк таблиц значений. Учтите, что ошибку в имени платформа обнаружит только при выполнении.
Чем отличается чтение реквизита через ссылку от ПолучитьОбъект()?
Через ссылку платформа считывает только нужные данные и не даёт их изменить. ПолучитьОбъект() загружает объект целиком в память и позволяет менять реквизиты с последующим Записать(). Для простого чтения объект получать не нужно — это лишняя нагрузка.
Почему в выборке запроса поле содержит NULL, хотя в карточке значение есть?
NULL появляется при соединениях таблиц, когда для строки основной таблицы не нашлось пары в присоединяемой. Проверяйте такие поля функцией ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) прямо в запросе или сравнением с NULL в коде.
Как прочитать значение поля активной строки таблицы на форме?
Через Элементы.ИмяТаблицы.ТекущиеДанные.ИмяКолонки. Обязательно проверьте, что ТекущиеДанные не равно Неопределено: это происходит, когда таблица пуста или строка не выбрана.
Можно ли получить значение поля без программирования?
Да. В пользовательском режиме значения видны в форме объекта, в списках через настройку колонок, а также через универсальный отчёт или консоль запросов, если она доступна в вашей конфигурации. Для разовой задачи этого обычно достаточно.
Что делать при ошибке «Поле объекта не обнаружено»?
Откройте конфигуратор и сверьте имя реквизита с тем, что написано в коде. Затем в отладчике проверьте тип переменной, у которой читается поле: возможно, там Неопределено, пустая ссылка или значение другого типа, у которого такого свойства нет.