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