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

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

Как получить объект метаданных в 1С

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

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

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

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

Что такое объект метаданных и когда он нужен

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

На практике обращение к метаданным требуется в универсальных механизмах. Например, обработка загрузки из Excel получает имя объекта строкой и должна понять, какие реквизиты у него есть. Процедура записи произвольного документа проверяет его движения через Метаданные().Движения. Построитель динамических отчётов перебирает коллекции справочников и документов, чтобы показать пользователю список доступных объектов.

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

Получение объекта метаданных по полному имени

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

ОбъектМД = Метаданные.НайтиПоПолномуИмени("Справочник.Номенклатура");

Если ОбъектМД = Неопределено Тогда

Сообщить("Объект с таким именем не найден в конфигурации");

Иначе

Сообщить("Синоним: " + ОбъектМД.Синоним);

КонецЕсли;

Метод возвращает Неопределено, если объекта с таким именем нет. Это безопасное поведение, которое обязательно нужно обрабатывать — иначе следующая строка кода вызовет ошибку обращения к свойству.

Для вложенных объектов полное имя продолжается дальше: Метаданные.НайтиПоПолномуИмени("Справочник.Номенклатура.Реквизит.Артикул") вернёт описание конкретного реквизита. Так можно адресоваться к табличным частям, измерениям регистров и другим вложенным элементам.

Обращение через коллекции Метаданные напрямую

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

Коллекции позволяют и перебирать объекты. Типичная задача — сформировать список всех документов конфигурации:

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

Сообщить(ОбъектМД.Имя + " — " + ОбъектМД.Синоним);

КонецЦикла;

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

Получение метаданных через ссылку или объект данных

Часто на входе не строка, а уже существующая ссылка на элемент справочника или документ. У любой ссылки есть метод Метаданные(), который возвращает объект метаданных её типа:

ОбъектМД = ТекущаяСсылка.Метаданные();

ИмяОбъекта = ОбъектМД.Имя;

ПолноеИмя = ОбъектМД.ПолноеИмя();

Этот приём незаменим в подписках на события и обработчиках, работающих с произвольными типами. Например, подписка «ПриЗаписи» на группу документов может через Источник.Метаданные() определить, с каким именно документом идёт работа, и проверить наличие нужного реквизита перед обращением к нему.

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

Порядок действий
  1. 1
    Определите, что известно на входе: строка с именем, ссылка или значение
  2. 2
    Для строки используйте Метаданные.НайтиПоПолномуИмени() с проверкой на Неопределено
  3. 3
    Для ссылки вызовите метод Ссылка.Метаданные()
  4. 4
    Для произвольного значения примените Метаданные.НайтиПоТипу(ТипЗнч(Значение))
  5. 5
    Проверьте результат: прочитайте свойство Имя или Синоним и убедитесь, что это ожидаемый объект

Чтение свойств: реквизиты, табличные части, движения

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

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

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

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

КонецЦикла;

Помимо пользовательских реквизитов существуют СтандартныеРеквизиты — «Ссылка», «Код», «Наименование», «Владелец» и другие. Они хранятся в отдельной коллекции, и если универсальная обработка должна видеть все поля объекта, перебирать нужно обе коллекции.

Тип реквизита возвращается как объект ОписаниеТипов. Он позволяет узнать состав типа, длину строки, точность числа — это используют при динамическом построении таблиц значений и форм под структуру объекта.

Типичные ошибки
01
Обращение к свойствам результата НайтиПоПолномуИмени без проверки на Неопределено — приводит к ошибке выполнения
02
Перебор только коллекции Реквизиты без СтандартныеРеквизиты — обработка «не видит» Код и Наименование
03
Выполнение обхода метаданных на тонком клиенте — часть коллекций недоступна, код падает или возвращает неполные данные
04
Кэширование объекта метаданных между вызовами в долгоживущих структурах — объект метаданных не сериализуется и не передаётся между клиентом и сервером, передавайте имя строкой

Ограничения, права и безопасность

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

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

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

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

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

Результат НайтиПоПолномуИмени
Норма

Возвращён объект, свойство Имя совпадает с запрошенным

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

Возвращено Неопределено — имени нет в конфигурации или ошибка в регистре/точке

ПолноеИмя() объекта
Норма

Строка вида «Справочник.Номенклатура»

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

Пустая строка или имя другой коллекции — получен не тот объект

Перебор реквизитов
Норма

В списке присутствуют ожидаемые реквизиты объекта

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

Список пуст при наличии реквизитов в конфигураторе — возможно, перебор выполнен на клиенте

FAQ

Чем отличается Имя от ПолноеИмя() у объекта метаданных?

Свойство Имя хранит только имя объекта — например, «Номенклатура». Метод ПолноеИмя() возвращает имя с указанием коллекции — «Справочник.Номенклатура». Для поиска через НайтиПоПолномуИмени и для передачи между процедурами используйте полное имя.

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

Используйте метод Реквизиты.Найти("ИмяРеквизита") у объекта метаданных — он вернёт объект описания реквизита или Неопределено. Это стандартный приём в универсальных обработках, чтобы не обращаться к отсутствующему реквизиту напрямую.

Можно ли получить метаданные внешней обработки или отчёта?

Да. У объекта внешней обработки, созданного через ВнешниеОбработки.Создать(), доступен метод Метаданные(), который возвращает описание её структуры — реквизиты, табличные части, макеты. Это работает только на сервере.

Почему перебор Метаданные.Справочники на тонком клиенте не работает?

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

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

У объекта метаданных регистра есть свойство Регистраторы (для регистров накопления и сведений с режимом «Подчинение регистратору»). Переберите эту коллекцию на сервере — каждый элемент даст объект метаданных документа-регистратора.

Что вернёт Метаданные.НайтиПоТипу для строки или числа?

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

Итог

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

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