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

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

Поле объекта в 1С: что это и как с ним работать

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

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

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

Ниже разобраны виды полей, способы обращения к ним в модуле, на форме и в запросе, а также типичные ошибки и способы их проверки.

Что именно называют полем объекта

В терминологии 1С «поле» — бытовое слово, которое объединяет несколько технических сущностей. На уровне конфигуратора поле объекта чаще всего означает реквизит — элемент данных, описанный в дереве метаданных. У справочника «Номенклатура» реквизитами могут быть «Артикул», «СтавкаНДС», «Поставщик». Каждый реквизит имеет имя, тип данных и свойства (обязательность, длину, проверку заполнения).

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

Отдельный случай — поля табличных частей. Табличная часть документа «Товары» содержит колонки «Номенклатура», «Количество», «Цена». Каждая колонка — тоже поле, но обратиться к нему нельзя напрямую через объект: сначала нужно получить строку табличной части.

Виды полей по типам объектов

Набор полей зависит от типа объекта метаданных. У справочников и документов это реквизиты и табличные части. У регистров сведений и накопления структура другая: измерения (по каким разрезам хранятся данные), ресурсы (какие числовые или иные значения учитываются) и реквизиты (дополнительная информация, не участвующая в итогах). Все три категории при обращении в запросе выглядят как поля.

У планов счетов есть признаки учёта и виды субконто, у планов видов расчёта — базовые виды расчёта. У внешних обработок и отчётов реквизиты описываются так же, как у справочников, но хранятся только в памяти, пока объект открыт.

ОбъектОсновные виды полейПримеры
СправочникСтандартные реквизиты, реквизиты, табличные частиКод, Наименование, Артикул
ДокументСтандартные реквизиты, реквизиты, табличные частиНомер, Дата, Контрагент, Товары.Количество
Регистр сведенийИзмерения, ресурсы, реквизитыПериод, Номенклатура, Цена
Регистр накопленияИзмерения, ресурсы, реквизитыСклад, Номенклатура, Количество

Как обратиться к полю в коде

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

Обращение к полю табличной части идёт в два шага: сначала строка, потом колонка. Типичный цикл выглядит так: перебираем Док.Товары, внутри цикла работаем со СтрокаТовары.Количество. Попытка написать Док.Товары.Количество приведёт к ошибке, потому что табличная часть — это коллекция, а не одна строка.

bsl
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокОбъект.Комментарий = "Проверено";
Для Каждого СтрокаТовары Из ДокОбъект.Товары Цикл
    СтрокаТовары.Сумма = СтрокаТовары.Количество * СтрокаТовары.Цена;
КонецЦикла;
ДокОбъект.Записать();

Если имя поля заранее неизвестно (например, приходит параметром), используют обращение через квадратные скобки: Объект[ИмяРеквизита]. Это медленнее и не проверяется на этапе компиляции, поэтому применяется только там, где имя действительно динамическое.

Поля на форме и в запросах

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

В запросах поля указываются через точку от имени таблицы: ВЫБРАТЬ Док.Контрагент, Док.Сумма ИЗ Документ.РеализацияТоваровУслуг КАК Док. Табличные части в запросе — отдельные виртуальные таблицы, которые соединяются с шапкой по ссылке. Обращение к несуществующему полю в запросе вызывает ошибку схемы запроса ещё до выполнения.

Как добавить своё поле к объекту

Новый реквизит добавляется в конфигураторе: откройте объект метаданных, перейдите на закладку «Данные» и добавьте реквизит, указав имя, тип и свойства. Для документа дополнительно настройте проведение — будет ли новое поле участвовать в движениях по регистрам. После обновления конфигурации базы данных платформа создаст соответствующую колонку в таблице СУБД.

Если изменять типовую конфигурацию нельзя (она на поддержке), используют дополнительные реквизиты и сведения — механизм, доступный в режиме «Предприятие» через «Администрирование → Общие настройки → Дополнительные реквизиты и сведения». Такое поле хранится в отдельной табличной части или регистре и не требует доработки конфигурации, но обращаться к нему в коде сложнее — через набор свойств, а не через точку.

Порядок добавления реквизита
  1. 1
    Откройте объект в конфигураторе, закладка «Данные»
  2. 2
    Добавьте реквизит, задайте имя, синоним и тип данных
  3. 3
    Настройте проверку заполнения и участие в движениях (для документов)
  4. 4
    Добавьте поле на форму объекта через конструктор формы
  5. 5
    Обновите конфигурацию базы данных и проверьте заполнение в режиме «Предприятие»

Типичные ошибки при работе с полями

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

Вторая группа ошибок — работа с полями через ссылку вместо объекта. Присвоение Ссылка.Комментарий = "текст" не сохранит данные: у ссылки поля доступны только для чтения. Нужен ПолучитьОбъект(), изменение и Записать(). Третья группа — обращение к полям незаписанного объекта после его удаления или к полям объекта, полученного в другом сеансе.

Типичные ошибки
01
Опечатка в имени реквизита — ошибка «Поле объекта не обнаружено» при выполнении; включите проверку через конфигуратор (Ctrl+F7 в модуле)
02
Присвоение значения полю ссылки вместо объекта — данные не сохраняются, изменения теряются молча
03
Обращение к полю табличной части как к реквизиту шапки — ошибка, так как табличная часть является коллекцией строк
04
Разыменование ссылок в цикле вместо запроса — резкое падение производительности на больших объёмах
05
Изменение типа реквизита без копии базы — риск потери данных при реструктуризации
Контрольные точки

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

Обращение к реквизиту в коде
Норма

Модуль проходит синтаксическую проверку, значение читается и записывается

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

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

Отображение поля на форме
Норма

Поле видно, редактируется, значение сохраняется после «Записать и закрыть»

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

Поле есть в данных, но не выведено на форму, либо сбрасывается при записи

Поле в запросе
Норма

Запрос выполняется, в результате есть ожидаемая колонка

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

Ошибка схемы запроса «Поле не найдено»

FAQ

Чем поле отличается от реквизита в 1С?

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

Как узнать список всех полей объекта программно?

Через метаданные: Метаданные.Справочники.Номенклатура.Реквизиты вернёт коллекцию реквизитов, а стандартные реквизиты доступны через свойство СтандартныеРеквизиты. Для объекта в переменной имя метаданных получают методом Метаданные().

Почему возникает ошибка «Поле объекта не обнаружено»?

Чаще всего — опечатка в имени, обращение к реквизиту, которого нет у данного вида объекта, или запуск кода в конфигурации, где реквизит не добавлен. Проверьте имя в конфигураторе и убедитесь, что обращаетесь к объекту правильного типа.

Можно ли добавить поле без доработки конфигурации?

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

Чем измерение регистра отличается от ресурса?

Измерение задаёт разрез хранения (склад, номенклатура, организация), а ресурс — учитываемое значение (количество, сумма). В запросах и коде оба выглядят как поля, но итоги рассчитываются только по ресурсам в разрезе измерений.

Почему изменение поля через ссылку не сохраняется?

Ссылка предназначена только для чтения данных. Чтобы изменить поле, получите объект методом ПолучитьОбъект(), измените реквизит и вызовите Записать(). Без вызова записи изменения останутся только в памяти.

Итог

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

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