К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как получить значение из поля в 1С

Как получить значение из поля в 1С: обращение к реквизитам объекта, формы, запроса и табличной части. Примеры кода на встроенном языке, типичные ошибки и проверка результата.

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

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

Ниже разобраны основные сценарии: чтение реквизитов объектов, работа с полями формы, получение значений через запрос, обращение к табличным частям и проверка результата. Примеры приведены на встроенном языке 1С и подходят для управляемых и обычных форм с учётом указанных различий.

Как устроено обращение к полям в 1С

Встроенный язык 1С использует точечную нотацию: имя переменной, затем точка, затем имя свойства или реквизита. Например, Контрагент.ИНН вернёт значение реквизита «ИНН», если переменная Контрагент содержит объект или ссылку на элемент справочника с таким реквизитом. Регистр букв в именах реквизитов не учитывается, но опечатка приведёт к ошибке времени выполнения.

Важно различать, что лежит в переменной: ссылку, объект или значение простого типа. Ссылка — это «указатель» на запись в базе; обращение к реквизиту через точку от ссылки заставляет платформу неявно считывать данные из базы. Объект — полноценная запись в памяти, полученная методом ПолучитьОбъект(). Простые значения (число, строка, дата) не имеют реквизитов, и обращение к ним через точку вызовет ошибку.

Получение значения реквизита справочника или документа

Если у вас есть ссылка на элемент, значение реквизита можно прочитать напрямую:

КонтрагентСсылка = Справочники.Контрагенты.НайтиПоКоду("000000001");

ИНН = КонтрагентСсылка.ИНН;

Такой вариант удобен, когда нужно одно-два поля. Однако каждое обращение через точку от ссылки — это отдельное обращение к данным. Если нужно прочитать много реквизитов или обойти список элементов в цикле, лучше использовать запрос: он заберёт все нужные поля одним обращением к базе.

Перед чтением реквизита полезно убедиться, что ссылка не пустая и элемент существует. Иначе вы получите либо ошибку, либо неопределённое значение. Проверка выполняется функцией ЗначениеЗаполнено() или методом Пустая() у ссылки.

Как прочитать реквизит элемента
  1. 1
    Получите ссылку на элемент: поиском по коду, наименованию или из другого реквизита
  2. 2
    Проверьте, что ссылка заполнена: НЕ Ссылка.Пустая()
  3. 3
    Обратитесь к реквизиту через точку: Ссылка.ИмяРеквизита
  4. 4
    Если нужно изменить значение — получите объект методом ПолучитьОбъект(), установите реквизит и вызовите Записать()
  5. 5
    Проверьте результат, выведя значение через Сообщить() или в отладчике

Чтение значения поля на форме

Поля на форме связаны с данными через реквизиты формы. В модуле формы значение читается обращением к реквизиту формы или к свойству объекта. Для основной формы объекта (например, документа) данные доступны через реквизит Объект: Объект.Номер, Объект.Контрагент. Самостоятельно добавленные реквизиты формы читаются просто по имени.

Частая ошибка — попытка прочитать значение из элемента формы (например, Элементы.ПолеКонтрагент). Элемент формы — это визуальный контрол, а не данные. Значение хранится в реквизите, с которым элемент связан через свойство «ПутьКДанным». Поэтому правильно читать данные, а не элемент.

На клиенте (в процедурах с директивой &НаКлиенте) доступны те же реквизиты формы, но нельзя выполнять запросы и обращаться к менеджерам объектов напрямую. Если нужно дочитать данные с сервера, вызывается серверная процедура, которая возвращает значение.

Получение значений через запрос

Запрос — основной способ массового чтения полей. В тексте запроса перечисляются нужные поля, а результат обходится выборкой:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Контрагенты.Ссылка,

| Контрагенты.ИНН,

| Контрагенты.Наименование

|ИЗ

| Справочник.Контрагенты КАК Контрагенты";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

ИНН = Выборка.ИНН;

КонецЦикла;

Имя поля в выборке совпадает с именем, указанным в списке выборки запроса (или с псевдонимом после ключевого слова КАК). Если обратиться к полю, которого нет в выборке, возникнет ошибка «Поле не найдено». При необходимости результат можно выгрузить в таблицу значений методом Выгрузить() и обращаться к колонкам по имени.

Работа с табличными частями и таблицами значений

Табличная часть документа — это коллекция строк. Значение поля конкретной строки читается так же, через точку: ДокументОбъект.Товары[0].Номенклатура вернёт значение из первой строки. В цикле обращение выглядит так:

Для Каждого СтрокаТовары Из ДокументОбъект.Товары Цикл

Сумма = СтрокаТовары.Сумма;

КонецЦикла;

Для таблиц значений действует то же правило: колонка доступна по имени через точку от строки. Если имя колонки заранее неизвестно и хранится в переменной, используйте индексное обращение через квадратные скобки: Строка[ИмяКолонки]. Это работает и для строк табличных частей, и для структур.

bsl
ИмяПоля = "Сумма";
Значение = СтрокаТаблицы[ИмяПоля]; // обращение по имени из переменной

Как проверить, что значение получено верно

Самый надёжный способ — отладчик: поставьте точку останова на строке после чтения и посмотрите значение переменной в табло. Для быстрой проверки без отладки подойдёт вывод через Сообщить(), но не оставляйте такие строки в рабочем коде обработок, которые запускаются у пользователей.

Проверяйте не только само значение, но и его тип. Функция ТипЗнч() покажет, что реально вернулось: ожидаемая ссылка, строка или Неопределено. Это особенно важно при обращении к полям составного типа и к результатам запросов с левыми соединениями, где поле может содержать NULL.

Контрольные точки

Как проверить результат

Значение переменной после чтения
Норма

Содержит ожидаемые данные нужного типа

Тревожный признак

Неопределено, NULL или значение другого типа

Ссылка перед обращением к реквизиту
Норма

Ссылка заполнена, элемент существует в базе

Тревожный признак

Пустая ссылка или битая ссылка на удалённый объект

Имя реквизита в коде
Норма

Совпадает с именем в конфигураторе

Тревожный признак

Опечатка — ошибка «Поле объекта не обнаружено»

Типичные ошибки и ограничения

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

Второй класс проблем — производительность. Чтение реквизитов через точку от ссылки внутри цикла по тысячам элементов приводит к множеству обращений к базе. Замените такой код запросом — это ускорит выполнение на порядки. Третья группа ошибок связана с контекстом: на клиенте управляемой формы недоступны запросы и методы объектов, требующие сервера.

Типичные ошибки
01
Обращение к реквизиту у пустой ссылки — ошибка или пустое значение вместо данных
02
Чтение значения из элемента формы вместо реквизита данных — код не видит реальное значение
03
Обход ссылок в цикле с чтением реквизитов через точку — резкое падение скорости
04
Отсутствие проверки ТекущиеДанные на Неопределено — ошибка при клике по пустой таблице
05
Игнорирование NULL в результате запроса с соединениями — сбой при сравнении и расчётах
Итог

Что важно запомнить

Реквизит читается через точку от объекта или ссылки, поле выборки — по имени из запроса, данные формы — из реквизитов формы, а не из элементов. Перед чтением проверяйте заполненность ссылки, после — тип полученного значения. Для массового чтения используйте запрос вместо обхода ссылок.

Частые вопросы

Как получить значение реквизита, если известно только его имя в виде строки?

Используйте обращение через квадратные скобки: Объект[ИмяРеквизита], где ИмяРеквизита — строковая переменная. Такой приём работает для объектов, строк табличных частей, структур и строк таблиц значений. Учтите, что ошибку в имени платформа обнаружит только при выполнении.

Чем отличается чтение реквизита через ссылку от ПолучитьОбъект()?

Через ссылку платформа считывает только нужные данные и не даёт их изменить. ПолучитьОбъект() загружает объект целиком в память и позволяет менять реквизиты с последующим Записать(). Для простого чтения объект получать не нужно — это лишняя нагрузка.

Почему в выборке запроса поле содержит NULL, хотя в карточке значение есть?

NULL появляется при соединениях таблиц, когда для строки основной таблицы не нашлось пары в присоединяемой. Проверяйте такие поля функцией ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) прямо в запросе или сравнением с NULL в коде.

Как прочитать значение поля активной строки таблицы на форме?

Через Элементы.ИмяТаблицы.ТекущиеДанные.ИмяКолонки. Обязательно проверьте, что ТекущиеДанные не равно Неопределено: это происходит, когда таблица пуста или строка не выбрана.

Можно ли получить значение поля без программирования?

Да. В пользовательском режиме значения видны в форме объекта, в списках через настройку колонок, а также через универсальный отчёт или консоль запросов, если она доступна в вашей конфигурации. Для разовой задачи этого обычно достаточно.

Что делать при ошибке «Поле объекта не обнаружено»?

Откройте конфигуратор и сверьте имя реквизита с тем, что написано в коде. Затем в отладчике проверьте тип переменной, у которой читается поле: возможно, там Неопределено, пустая ссылка или значение другого типа, у которого такого свойства нет.