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

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

Как получить имя реквизита в 1С: практическое руководство

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

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

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

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

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

МетаданныеОбъекта = ДокументОбъект.Метаданные();

Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл

Сообщить(Реквизит.Имя + " — " + Реквизит.Синоним);

КонецЦикла;

Цикл перебирает коллекцию Реквизиты, и для каждого элемента доступны свойства: Имя — внутренний идентификатор, Синоним — представление для пользователя, Тип — описание типа значения. Такой подход работает одинаково для справочников, документов, планов счетов и других объектов с реквизитами.

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

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

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

МетаданныеОбъекта = ДокументОбъект.Метаданные();

Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл

Сообщить("Табличная часть: " + ТабличнаяЧасть.Имя);

Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл

Сообщить(" Реквизит: " + Реквизит.Имя);

КонецЦикла;

КонецЦикла;

Если имя табличной части известно заранее, обращайтесь напрямую: МетаданныеОбъекта.ТабличныеЧасти["Товары"].Реквизиты. Перед таким обращением полезно проверить наличие табличной части через Найти("Товары") — это защитит универсальный код от падения на объектах без нужной табличной части.

bsl
РеквизитыТЧ = ДокументОбъект.Метаданные().ТабличныеЧасти["Товары"].Реквизиты;
Для Каждого Рекв Из РеквизитыТЧ Цикл
    Сообщить(Рекв.Имя);
КонецЦикла;

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

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

МетаданныеРегистра = Метаданные.РегистрыСведений.КурсыВалют;

Для Каждого Измерение Из МетаданныеРегистра.Измерения Цикл

Сообщить("Измерение: " + Измерение.Имя);

КонецЦикла;

Для Каждого Ресурс Из МетаданныеРегистра.Ресурсы Цикл

Сообщить("Ресурс: " + Ресурс.Имя);

КонецЦикла;

Здесь показано обращение через глобальный контекст Метаданные — так можно получить описание объекта конфигурации, не имея на руках ни ссылки, ни объекта. Это удобно при построении универсальных обработок, где тип объекта известен только как строка.

Как узнать имя реквизита, видимого на форме

Частая практическая задача: пользователь видит поле на форме документа, а для запроса или отбора нужно его внутреннее имя. Есть несколько способов без программирования.

  • Конфигуратор. Откройте конфигурацию, найдите объект (например, документ «Реализация товаров и услуг») и посмотрите список реквизитов на закладке «Данные». Колонка «Имя» — то, что нужно для кода и запросов.
  • Сочетание Ctrl+F1. Во многих типовых формах при установке курсора в поле и нажатии Ctrl+F1 открывается справка по полю, где указано его имя.
  • Изменение формы. В режиме «Ещё — Изменить форму» можно выделить элемент и увидеть путь к данным, который обычно совпадает с именем реквизита.

Учтите: надпись на форме (синоним) может не совпадать с именем. Например, поле подписано «Контрагент», а имя реквизита — Контрагент, но бывает и «Организация-отправитель» при имени Организация. Ориентироваться нужно именно на колонку «Имя» в конфигураторе.

Ограничения и особенности работы с метаданными

Работа с метаданными доступна только на сервере или в толстом клиенте. В тонком клиенте и веб-клиенте объект Метаданные недоступен — код с обходом реквизитов нужно размещать в серверных процедурах модуля формы или общих модулях с признаком «Сервер».

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

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

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

Самый надёжный способ проверки — использовать полученное имя в реальном обращении. В модуле объекта или внешней обработке выполните чтение значения: Значение = Объект[ИмяРеквизита]. Если реквизит существует, вернётся значение; если имени нет — платформа выдаст ошибку «Поле объекта не обнаружено».

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

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

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

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

Объект[Имя] возвращает значение без исключения

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

Ошибка «Поле объекта не обнаружено» — имени нет или оно в другой коллекции

Запрос с полем
Норма

Запрос выполняется и возвращает данные

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

Ошибка компиляции — поле не найдено в таблице

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

Имя совпадает с колонкой «Имя» на закладке «Данные»

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

Совпадает только синоним — в коде такое имя не сработает

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

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

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

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

Имя — внутренний идентификатор, который используется в коде, запросах и отборах. Синоним — произвольная подпись для пользователя, она может содержать пробелы, русские слова и знаки препинания. Программно обращаться по синониму нельзя.

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

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

Как узнать имя реквизита, не открывая конфигуратор?

Во многих типовых формах помогает сочетание Ctrl+F1 на поле — откроется справка с именем. Также в режиме «Изменить форму» виден путь к данным элемента. Если оба способа недоступны, имя можно выяснить через внешнюю обработку обхода метаданных.

Где искать реквизиты «Номер» и «Дата» документа?

Это стандартные реквизиты, они не входят в коллекцию Реквизиты. Программно они доступны через МетаданныеОбъекта.СтандартныеРеквизиты, а в коде к ним обращаются напрямую: ДокументОбъект.Номер, ДокументОбъект.Дата.

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

У самой строки метаданных нет — описание берётся у объекта-владельца: ДокументОбъект.Метаданные().ТабличныеЧасти[ИмяТЧ].Реквизиты. Значения же читаются из строки по имени: СтрокаТЧ[ИмяРеквизита].

Итог

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

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