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

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

Как обратиться к стандартному реквизиту в 1С

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

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

Основная сложность у начинающих разработчиков возникает из-за того, что часть стандартных реквизитов доступна напрямую через точку (Ссылка, Код, Наименование), а часть — только через специальные методы или только в запросах. Кроме того, состав стандартных реквизитов зависит от вида объекта и от настроек конфигурации: например, если у справочника отключена иерархия, реквизита Родитель у него не будет.

Ниже разобраны практические способы обращения к стандартным реквизитам: через точку в коде, через метод СтандартныеРеквизиты() метаданных, в запросах, на форме объекта, а также типичные ошибки и способы их диагностики.

Что относится к стандартным реквизитам у разных объектов

Состав стандартных реквизитов определяется видом объекта метаданных и его настройками. У справочников это Ссылка, Код, Наименование, ПометкаУдаления, Предопределенный, а при включённой иерархии — Родитель, при подчинённости — Владелец. У документов — Ссылка, Номер, Дата, Проведен, ПометкаУдаления. У планов видов характеристик, планов счетов — свои наборы, например у плана счетов есть Вид (активный/пассивный) и Забалансовый.

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

У регистров сведений и накопления стандартные реквизиты другие: Период, Регистратор, НомерСтроки, Активность. К ним также обращаются через точку от записи регистра или в запросе.

Обращение через точку во встроенном языке

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

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

НовыйЭлемент.Наименование = "Бумага А4";

НовыйЭлемент.Родитель = ГруппаКанцелярия;

НовыйЭлемент.Записать();

Сообщить(НовыйЭлемент.Код);

Если есть только ссылка, обращение через точку тоже работает — платформа сама подгрузит данные из базы:

СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000001", ТекущаяДатаСеанса());

Если Не СсылкаНаДокумент.Пустая() Тогда

Сообщить("Дата документа: " + СсылкаНаДокумент.Дата);

Сообщить("Проведен: " + СсылкаНаДокумент.Проведен);

КонецЕсли;

Учтите, что каждое обращение через точку к реквизиту ссылки — это отдельное обращение к базе данных. Если в цикле нужно прочитать несколько полей у множества ссылок, эффективнее использовать запрос, иначе производительность заметно просядет.

Обращение к стандартным реквизитам в запросах

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

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

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

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Код КАК Код,

| Номенклатура.Наименование КАК Наименование,

| Номенклатура.ПометкаУдаления КАК ПометкаУдаления

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления";

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

Особый случай — реквизит Предопределенный и работа с предопределёнными элементами. Через имя предопределённого элемента обращение выглядит так: Справочники.Валюты.Рубль, где «Рубль» — имя, заданное в конфигураторе, а не наименование элемента. В запросе предопределённый элемент проще найти по условию Предопределенный = ИСТИНА в сочетании с другими отборами.

bsl
ВалютаРубль = Справочники.Валюты.НайтиПоНаименованию("Рубль");
// Надежнее — через предопределенное имя:
ВалютаРубль = Справочники.Валюты.Рубль;

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

Когда пишется универсальный код (обмены, выгрузки, обработки произвольных объектов), нельзя жёстко рассчитывать на конкретный набор полей. Состав стандартных реквизитов получают через объект метаданных:

МетаданныеСправочника = Метаданные.Справочники.Номенклатура;

Для Каждого СтандартныйРеквизит Из МетаданныеСправочника.СтандартныеРеквизиты Цикл

Сообщить(СтандартныйРеквизит.Имя + " — " + СтандартныйРеквизит.Тип);

КонецЦикла;

Такой перебор покажет реальный набор полей с учётом настроек: если иерархия отключена, Родителя в коллекции не будет. Это надёжный способ проверить наличие реквизита перед обращением к нему в универсальном коде.

Альтернатива без перебора — проверка через свойство объекта метаданных, например МетаданныеСправочника.Иерархический подскажет, есть ли смысл обращаться к Родителю. Для документов проверка возможности проведения — МетаданныеДокумента.Проведение.

Порядок действий при неизвестном составе реквизитов
  1. 1
    Получите объект метаданных: Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)) или через коллекцию Метаданные.Справочники/Документы.
  2. 2
    Переберите коллекцию СтандартныеРеквизиты и определите нужные имена полей.
  3. 3
    Сформируйте обращение или текст запроса только по реально существующим реквизитам.
  4. 4
    Проверьте результат на тестовой копии базы перед запуском в рабочей.

Стандартные реквизиты на форме и в динамических списках

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

В динамических списках стандартные реквизиты добавляются в текст запроса списка как обычные поля. Если требуется отбор по коду или наименованию, достаточно включить соответствующие поля в запрос и разрешить отбор по ним в настройках списка.

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

Особые случаи: Дата, Номер, ПометкаУдаления

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

ПометкаУдаления — реквизит только для чтения в обычном режиме: изменять его напрямую присваиванием нельзя, для этого используются методы УстановитьПометкуУдаления() объекта. Попытка написать Объект.ПометкаУдаления = Истина приведёт к ошибке.

ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();

ДокОбъект.УстановитьПометкуУдаления(Истина);

Аналогично реквизит Проведен изменяется не присваиванием, а методами Записать(РежимЗаписиДокумента.Проведение) или Записать(РежимЗаписиДокумента.ОтменаПроведения).

Типичные ошибки
01
Присваивание ПометкаУдаления напрямую — вызывает ошибку, нужен метод УстановитьПометкуУдаления().
02
Чтение Номера документа до записи — номер ещё не присвоен, получите пустое значение.
03
Обращение к Родителю у неиерархического справочника — ошибка обращения к несуществующему полю.
04
Поиск предопределённого элемента по наименованию вместо предопределённого имени — ломается при переименовании пользователем.
05
Чтение реквизитов ссылки в цикле через точку вместо одного запроса — резкое падение производительности.

Обращение к стандартным реквизитам через COM и внешние соединения

При подключении к базе 1С извне (COM-коннектор, веб-сервисы, HTTP-сервисы) стандартные реквизиты доступны по тем же именам. Через COM-объект обращение идентично коду внутри базы: Документ.Номер, Справочник.Наименование.

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

Как проверить корректность обращения

Перед запуском обработки в рабочей базе проверьте код на копии. Основные контрольные точки: существует ли реквизит у данного вида объекта, не пустая ли ссылка, от которой идёт обращение, и не требует ли реквизит специального метода для изменения.

Для диагностики удобно использовать попытку-исключение с информативным сообщением и проверку ссылки методом Пустая() или функцией ЗначениеЗаполнено(). Если обращение идёт к реквизиту через точку от ссылки, убедитесь, что ссылка не битая — иначе получите ошибку «Объект не найден».

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

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

Существование реквизита
Норма

Поле есть в коллекции СтандартныеРеквизиты метаданных

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

Ошибка «Поле не найдено» при выполнении

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

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

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

Пустая ссылка или «Объект не найден»

Изменение служебных полей
Норма

Используются методы УстановитьПометкуУдаления, Записать

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

Попытка присваивания ПометкаУдаления или Проведен напрямую

Итог

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

Стандартные реквизиты читаются через точку от объекта или ссылки и как обычные поля в запросах. Состав зависит от вида объекта и настроек конфигурации — проверяйте через Метаданные.СтандартныеРеквизиты. Служебные поля (ПометкаУдаления, Проведен) меняются только специальными методами, а массовое чтение данных выполняйте запросами, а не обращением через точку в цикле.

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

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

Используйте квадратные скобки: Объект["Наименование"]. Это работает для объектов и позволяет строить универсальные обработки, где имя реквизита хранится в переменной. Для ссылок такой синтаксис не подходит — сначала получите объект или используйте запрос с динамически сформированным текстом.

Почему обращение Ссылка.Наименование возвращает ошибку «Объект не найден»?

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

Можно ли изменить Код или Номер программно?

Да, если в конфигурации не запрещено ручное редактирование и не включён строгий контроль уникальности автонумерации. Присвойте значение объекту до записи: Объект.Код = "А001". Учтите, что платформа контролирует уникальность кода в пределах настроенной области, и дубль вызовет ошибку при записи.

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

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

Чем отличается обращение к реквизиту объекта от обращения к реквизиту ссылки?

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

Как обратиться к предопределённому элементу, если его имя в конфигурации неизвестно?

Откройте конфигуратор, найдите нужный элемент в ветке предопределённых элементов справочника и посмотрите колонку «Имя». Если доступа к конфигуратору нет, найдите элемент запросом с условием Предопределенный = ИСТИНА и дополнительным отбором по известным признакам, но учтите, что поиск по наименованию ненадёжен — пользователь может его переименовать.