Разработка и Конфигурация · 12 мин
Как найти метаданные по наименованию в 1С
Как найти объект метаданных 1С по наименованию: метод Метаданные.НайтиПоПолномуИмени, поиск через конфигуратор, запросы и типовые ошибки при работе.
Задача найти объект метаданных по его наименованию возникает у разработчиков и администраторов 1С регулярно: при написании универсальных обработок, при разборе чужого кода, при поиске документа или справочника, имя которого известно только частично. Платформа 1С:Предприятие предоставляет несколько способов решить эту задачу — от встроенных методов объекта «Метаданные» до инструментов конфигуратора.
Важно сразу разделить два похожих понятия. Имя объекта метаданных — это идентификатор, заданный разработчиком в конфигураторе (например, «РеализацияТоваровУслуг»), по которому объект адресуется в коде. Синоним (представление) — это наименование, которое видит пользователь в интерфейсе («Реализация (акты, накладные, УПД)»). Способ поиска зависит от того, что именно известно: программное имя или пользовательское наименование.
Ниже разобраны рабочие приёмы поиска метаданных по имени и синониму: программные методы встроенного языка, поиск в конфигураторе, обход коллекций метаданных и типовые ошибки, которые приводят к пустому результату.
Что считать «наименованием» метаданных в 1С
Прежде чем искать, определите, какое именно наименование у вас есть. У каждого объекта конфигурации есть несколько текстовых идентификаторов, и путаница между ними — главная причина неудачного поиска.
Имя — уникальный идентификатор объекта внутри своего вида (документов, справочников и т.д.), пишется латиницей или кириллицей без пробелов. Полное имя — это вид объекта плюс имя через точку: «Справочник.Номенклатура», «Документ.ПоступлениеТоваровУслуг». Синоним — произвольная строка представления для пользователя, может содержать пробелы, скобки и спецсимволы.
Отдельно стоит имя таблицы в базе данных (например, «_Document123») — оно генерируется платформой автоматически и не совпадает с именем метаданных. Искать объект по имени таблицы нужно через структуру хранения базы, а не через коллекцию «Метаданные».
Поиск по полному имени: метод НайтиПоПолномуИмени
Самый быстрый и надёжный способ — метод Метаданные.НайтиПоПолномуИмени(). Он принимает строку полного имени и возвращает объект описания метаданного либо Неопределено, если объект не найден. Поиск выполняется напрямую по дереву конфигурации без перебора коллекций, поэтому работает быстро даже в больших конфигурациях.
ОбъектМД = Метаданные.НайтиПоПолномуИмени("Документ.РеализацияТоваровУслуг");
Если ОбъектМД = Неопределено Тогда
Сообщить("Объект с таким именем не найден");
Иначе
Сообщить("Найден: " + ОбъектМД.ПолноеИмя());
КонецЕсли;
Обратите внимание: имя вида указывается в единственном числе и в том виде, в каком оно используется в полных именах — «Документ», «Справочник», «Перечисление», «РегистрСведений», «РегистрНакопления», «Обработка», «Отчет». Написание «Документы.РеализацияТоваровУслуг» (во множественном числе) вернёт Неопределено.
Метод нечувствителен к регистру букв, как и весь встроенный язык 1С. Однако он требует точного совпадения строки: лишний пробел, опечатка или сокращение приведут к отрицательному результату.
Поиск по части имени или по синониму через перебор коллекций
Если известен только фрагмент имени или пользовательское наименование (синоним), точного метода нет — нужно перебирать коллекции метаданных и сравнивать строки. Это стандартный приём для обработок вида «найти объект по наименованию».
Функция НайтиПоНаименованию(СтрокаПоиска)
Результат = Новый Массив;
Коллекции = Новый Массив;
Коллекции.Добавить(Метаданные.Справочники);
Коллекции.Добавить(Метаданные.Документы);
Коллекции.Добавить(Метаданные.РегистрыСведений);
Для Каждого Коллекция Из Коллекции Цикл
Для Каждого ОбъектМД Из Коллекция Цикл
Если СтрНайти(НРег(ОбъектМД.Имя), НРег(СтрокаПоиска)) > 0
Или СтрНайти(НРег(ОбъектМД.Синоним), НРег(СтрокаПоиска)) > 0 Тогда
Результат.Добавить(ОбъектМД.ПолноеИмя());
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция СтрНайти() ищет подстроку и возвращает позицию вхождения либо 0. Приведение обеих строк к нижнему регистру через НРег() делает поиск нечувствительным к регистру — это важно, потому что пользователь обычно вводит наименование небрежно.
Перебор всех коллекций в большой конфигурации занимает заметное время (единицы секунд на типовых конфигурациях). Для интерактивного поиска это приемлемо, но в циклах обработки данных такой код вызывать нельзя — кешируйте результат.
- 1Определите, что известно: точное полное имя, часть имени или синоним
- 2Для точного полного имени вызовите Метаданные.НайтиПоПолномуИмени() и проверьте результат на Неопределено
- 3Для части имени или синонима переберите нужные коллекции Метаданные и сравнивайте через СтрНайти с НРег
- 4Выведите список найденных полных имён и уточните нужный объект визуально
- 5Проверьте найденный объект: откройте его в конфигураторе и сверьте реквизиты с ожидаемыми
Поиск метаданных в конфигураторе без программирования
Если задача разовая — найти объект в дереве конфигурации — писать код не нужно. Конфигуратор предоставляет несколько встроенных инструментов.
Глобальный поиск (Ctrl+Shift+F) ищет строку по всем модулям, но при включённом флаге поиска по именам объектов находит и метаданные. Поиск по дереву конфигурации: в окне конфигурации начните вводить имя объекта — курсор перейдёт к первому совпадению. Работает только внутри текущей ветки (например, внутри «Документы»).
Меню «Правка → Найти» при активном окне конфигурации позволяет искать по имени и синониму объекта. Для поиска всех мест, где объект используется, применяется «Поиск ссылок на объект» (правый клик по объекту в дереве) — это полезно, когда нужно понять, где в коде фигурирует найденное метаданное.
Способы поиска метаданных по наименованию
Мгновенный точный поиск по полному имени. Не подходит для частичного совпадения и поиска по синониму.
Гибкий поиск по части имени и синониму. Медленнее, требует написания кода и кеширования результата при массовом использовании.
Не требует кода, удобен для разовых задач разработчика. Недоступен в пользовательском режиме и из программного кода.
Обратная задача: от объекта к имени и от ссылки к метаданным
Частая сопутствующая задача — по ссылке на объект базы данных определить, какому метаданному он принадлежит. Для этого у любой ссылки есть метод Метаданные():
ИмяОбъекта = Ссылка.Метаданные().ПолноеИмя();
// Например: "Документ.ПоступлениеТоваровУслуг"
Обратное преобразование — получить менеджер объекта по строке имени — выполняется через вычисление свойства корневой коллекции: Документы["РеализацияТоваровУслуг"] или универсально через Метаданные.НайтиПоПолномуИмени() с последующим разбором вида объекта. Для построения запроса по динамическому имени имя подставляется в текст запроса строкой — здесь критично, чтобы имя было получено из метаданных, а не из пользовательского ввода.
Типичные ошибки при поиске метаданных
Большинство проблем с поиском метаданных сводится к нескольким повторяющимся причинам. Знание их экономит время отладки.
Отдельный случай — объекты, добавленные расширением конфигурации. Они присутствуют в коллекции «Метаданные» только в сеансах, где расширение подключено. Если код поиска выполняется в фоновом задании или в сеансе без расширения, объект не будет найден, хотя в конфигураторе он виден.
Как проверить результат поиска
Возвращён объект, ПолноеИмя() совпадает с запрошенным
Неопределено — проверьте вид объекта в единственном числе и точность имени
Полное имя открывается в конфигураторе, реквизиты соответствуют ожиданиям
Найдено несколько объектов с похожими синонимами — нужен дополнительный отбор
Объект находится и в отладчике, и в рабочем сеансе
В рабочем сеансе объект не найден — вероятно, он из отключённого расширения
Ограничения и практические рекомендации
Коллекция «Метаданные» доступна и на толстом, и на тонком клиенте, и на сервере, но состав свойств может различаться в зависимости от режима. Для серверных процедур в типовых конфигурациях ограничений практически нет; на клиенте в управляемом приложении часть коллекций и свойств недоступна — поиск метаданных корректнее выполнять в серверном контексте.
При массовых операциях (например, обработка тысяч строк с динамическими именами объектов) постройте один раз соответствие «имя → объект метаданных» и переиспользуйте его. Повторный вызов методов поиска в цикле — типичный источник деградации производительности.
Удобный приём для отладки: выведите в цикле ПолноеИмя() и Синоним всех объектов нужной коллекции в табличный документ. Полученный список позволяет быстро сверить, как точно называется объект в конкретной конфигурации — имена в типовых решениях часто отличаются от ожидаемых (например, «РеализацияТоваровУслуг» против «РеализацияТоваров»).
Для поиска по имени таблицы СУБД (вида «_Document123») используйте функцию ПолучитьСтруктуруХраненияБазыДанных() — она возвращает таблицу соответствия имён таблиц и объектов метаданных. Это единственный штатный способ решить обратную задачу «от таблицы к объекту».
Что важно запомнить
Точный поиск по полному имени — Метаданные.НайтиПоПолномуИмени() с обязательной проверкой на Неопределено. Поиск по части имени или синониму — перебор коллекций с СтрНайти и НРег. Для разовых задач достаточно поиска в конфигураторе. Вид объекта в полном имени указывается в единственном числе, а объекты расширений видны только в сеансах с подключённым расширением.
Частые вопросы
Чем отличается НайтиПоПолномуИмени от НайтиПоИмени?
Метод НайтиПоИмени существует у отдельных коллекций (например, Метаданные.Документы.Найти("РеализацияТоваровУслуг")) и ищет только внутри одного вида объектов по короткому имени. НайтиПоПолномуИмени работает на уровне всей конфигурации и принимает строку «Вид.Имя», что удобнее для универсального кода.
Почему НайтиПоПолномуИмени возвращает Неопределено, хотя объект есть в конфигураторе?
Чаще всего причины три: вид объекта указан во множественном числе, в строке есть лишние пробелы или неразрывные пробелы, либо объект добавлен расширением, которое не подключено в текущем сеансе. Проверьте точное имя, скопировав его напрямую из свойств объекта в конфигураторе.
Можно ли найти метаданные по пользовательскому наименованию без перебора всех коллекций?
Штатного метода поиска по синониму нет. Оптимизация возможна только за счёт сужения области: если заранее известно, что искомый объект — документ, перебирайте только Метаданные.Документы, а не все коллекции подряд.
Как получить список всех объектов конфигурации с именами и синонимами?
Переберите нужные коллекции корневого объекта Метаданные (Справочники, Документы, РегистрыСведений и т.д.) и для каждого элемента выведите свойства ПолноеИмя() и Синоним в табличный документ или таблицу значений. Это стандартная основа обработок «описание конфигурации».
Работает ли поиск метаданных на тонком клиенте?
Доступ к объекту Метаданные на клиенте ограничен: часть коллекций и свойств доступна только на сервере. Надёжное решение — выполнять поиск в серверной процедуре и возвращать на клиент только результат (полное имя или массив найденных имён).
Как по ссылке на объект базы узнать имя его метаданных?
Вызовите у ссылки метод Метаданные() — он вернёт описание метаданного, у которого доступны свойства Имя, ПолноеИмя() и Синоним. Для определения только вида объекта можно также использовать ТипЗнч и Метаданные.НайтиПоТипу().