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

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

Как найти метаданные по наименованию в 1С

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

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

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

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

Что считать «наименованием» метаданных в 1С

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

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

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

Поиск по полному имени: метод НайтиПоПолномуИмени

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

ОбъектМД = Метаданные.НайтиПоПолномуИмени("Документ.РеализацияТоваровУслуг");

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

Сообщить("Объект с таким именем не найден");

Иначе

Сообщить("Найден: " + ОбъектМД.ПолноеИмя());

КонецЕсли;

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

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

Поиск по части имени или по синониму через перебор коллекций

Если известен только фрагмент имени или пользовательское наименование (синоним), точного метода нет — нужно перебирать коллекции метаданных и сравнивать строки. Это стандартный приём для обработок вида «найти объект по наименованию».

Функция НайтиПоНаименованию(СтрокаПоиска)

Результат = Новый Массив;

Коллекции = Новый Массив;

Коллекции.Добавить(Метаданные.Справочники);

Коллекции.Добавить(Метаданные.Документы);

Коллекции.Добавить(Метаданные.РегистрыСведений);

Для Каждого Коллекция Из Коллекции Цикл

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

Если СтрНайти(НРег(ОбъектМД.Имя), НРег(СтрокаПоиска)) > 0

Или СтрНайти(НРег(ОбъектМД.Синоним), НРег(СтрокаПоиска)) > 0 Тогда

Результат.Добавить(ОбъектМД.ПолноеИмя());

КонецЕсли;

КонецЦикла;

КонецЦикла;

Возврат Результат;

КонецФункции

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

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

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

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

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

Глобальный поиск (Ctrl+Shift+F) ищет строку по всем модулям, но при включённом флаге поиска по именам объектов находит и метаданные. Поиск по дереву конфигурации: в окне конфигурации начните вводить имя объекта — курсор перейдёт к первому совпадению. Работает только внутри текущей ветки (например, внутри «Документы»).

Меню «Правка → Найти» при активном окне конфигурации позволяет искать по имени и синониму объекта. Для поиска всех мест, где объект используется, применяется «Поиск ссылок на объект» (правый клик по объекту в дереве) — это полезно, когда нужно понять, где в коде фигурирует найденное метаданное.

Способы поиска метаданных по наименованию

НайтиПоПолномуИмени

Мгновенный точный поиск по полному имени. Не подходит для частичного совпадения и поиска по синониму.

Перебор коллекций Метаданные

Гибкий поиск по части имени и синониму. Медленнее, требует написания кода и кеширования результата при массовом использовании.

Поиск в конфигураторе

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

Обратная задача: от объекта к имени и от ссылки к метаданным

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

ИмяОбъекта = Ссылка.Метаданные().ПолноеИмя();

// Например: "Документ.ПоступлениеТоваровУслуг"

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

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

Большинство проблем с поиском метаданных сводится к нескольким повторяющимся причинам. Знание их экономит время отладки.

Типичные ошибки
01
Использование множественного числа вида объекта: «Документы.Реализация» вместо «Документ.Реализация» — НайтиПоПолномуИмени вернёт Неопределено
02
Поиск по синониму через НайтиПоПолномуИмени: метод ищет только по программному имени, пользовательское наименование он не сравнивает
03
Обращение к свойствам результата без проверки на Неопределено — ошибка выполнения в рабочей базе
04
Поиск объекта из расширения в основной конфигурации: объекты расширения видны в Метаданные только когда расширение подключено и активно
05
Лишние пробелы и неразрывные пробелы в строке поиска, скопированной из Excel или письма — сравнение не срабатывает, нужна очистка через СокрЛП

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

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

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

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

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

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

Неопределено — проверьте вид объекта в единственном числе и точность имени

Найденный по синониму объект
Норма

Полное имя открывается в конфигураторе, реквизиты соответствуют ожиданиям

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

Найдено несколько объектов с похожими синонимами — нужен дополнительный отбор

Поиск в режиме предприятия
Норма

Объект находится и в отладчике, и в рабочем сеансе

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

В рабочем сеансе объект не найден — вероятно, он из отключённого расширения

Ограничения и практические рекомендации

Коллекция «Метаданные» доступна и на толстом, и на тонком клиенте, и на сервере, но состав свойств может различаться в зависимости от режима. Для серверных процедур в типовых конфигурациях ограничений практически нет; на клиенте в управляемом приложении часть коллекций и свойств недоступна — поиск метаданных корректнее выполнять в серверном контексте.

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

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

Для поиска по имени таблицы СУБД (вида «_Document123») используйте функцию ПолучитьСтруктуруХраненияБазыДанных() — она возвращает таблицу соответствия имён таблиц и объектов метаданных. Это единственный штатный способ решить обратную задачу «от таблицы к объекту».

Итог

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

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

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

Чем отличается НайтиПоПолномуИмени от НайтиПоИмени?

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

Почему НайтиПоПолномуИмени возвращает Неопределено, хотя объект есть в конфигураторе?

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

Можно ли найти метаданные по пользовательскому наименованию без перебора всех коллекций?

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

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

Переберите нужные коллекции корневого объекта Метаданные (Справочники, Документы, РегистрыСведений и т.д.) и для каждого элемента выведите свойства ПолноеИмя() и Синоним в табличный документ или таблицу значений. Это стандартная основа обработок «описание конфигурации».

Работает ли поиск метаданных на тонком клиенте?

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

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

Вызовите у ссылки метод Метаданные() — он вернёт описание метаданного, у которого доступны свойства Имя, ПолноеИмя() и Синоним. Для определения только вида объекта можно также использовать ТипЗнч и Метаданные.НайтиПоТипу().