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

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

Как получить имя справочника в 1С

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

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

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

Ниже разобраны рабочие приёмы для платформы 1С:Предприятие 8.3 с примерами кода, проверкой результата и типичными ошибками, которые приводят к неоправданным обращениям к базе или падению кода.

Через ссылку на элемент: метод Метаданные()

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

ИмяСправочника = СсылкаНаЭлемент.Метаданные().Имя;

// Например: "Номенклатура"

СинонимСправочника = СсылкаНаЭлемент.Метаданные().Синоним;

// Например: "Номенклатура товаров"

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

МетаОбъект = СсылкаНаЭлемент.Метаданные();

Если Метаданные.Справочники.Содержит(МетаОбъект) Тогда

ИмяСправочника = МетаОбъект.Имя;

КонецЕсли;

Через тип значения без ссылки

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

ТипСсылки = ТипЗнч(Значение);

МетаОбъект = Метаданные.НайтиПоТипу(ТипСсылки);

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

ИмяСправочника = МетаОбъект.Имя;

КонецЕсли;

Метод Метаданные.НайтиПоТипу() возвращает Неопределено, если тип не относится к объектам конфигурации (например, это примитивный тип «Строка»). Всегда проверяйте результат перед обращением к свойствам — иначе получите ошибку «Значение не является значением объектного типа».

Поиск справочника по имени в конфигурации

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

МетаСправочник = Метаданные.Справочники.Найти("Контрагенты");

Если МетаСправочник = Неопределено Тогда

// Справочника с таким именем в конфигурации нет

Иначе

ИмяСправочника = МетаСправочник.Имя;

КонецЕсли;

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

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

Перебор всех справочников конфигурации

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

Для Каждого МетаСпр Из Метаданные.Справочники Цикл

Сообщить(МетаСпр.Имя + " — " + МетаСпр.Синоним);

КонецЦикла;

Если нужен отбор по условию — например, только иерархические справочники — добавьте проверку свойств метаданных: МетаСпр.Иерархический, МетаСпр.ВидИерархии, МетаСпр.Владельцы (для подчинённых справочников).

bsl
Функция ИменаВсехСправочников()
	Результат = Новый Массив;
	Для Каждого МетаСпр Из Метаданные.Справочники Цикл
		Результат.Добавить(МетаСпр.Имя);
	КонецЦикла;
	Возврат Результат;
КонецФункции

Синоним и представление: в чём разница с именем

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

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

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

Получение менеджера справочника по имени

Когда имя уже известно, через него получают менеджер для дальнейшей работы — создания элементов, поиска, выборки. Коллекция Справочники поддерживает обращение по строковому имени.

МенеджерСправочника = Справочники["Контрагенты"];

ПустаяСсылка = МенеджерСправочника.ПустаяСсылка();

НайденныйЭлемент = МенеджерСправочника.НайтиПоКоду("000000001");

Если имя приходит из недоверенного источника, перед обращением к Справочники[Имя] убедитесь через Метаданные.Справочники.Найти(), что такой объект существует — иначе обращение вызовет исключение.

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

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

Возвращаемое значение
Норма

Строка с именем, совпадающая с именем в конфигураторе

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

Неопределено или пустая строка

Поведение на примитивном типе (число, строка)
Норма

Код корректно отрабатывает ветку Неопределено

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

Исключение «поле объекта не обнаружено»

Использование имени в Справочники[Имя]
Норма

Менеджер получен без исключения

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

Ошибка обращения к элементу коллекции

FAQ

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

Напрямую в тексте запроса имя метаданных не вычисляется — оно определяется до построения запроса и подставляется в текст строкой: «ВЫБРАТЬ Ссылка ИЗ Справочник." + ИмяСправочника + "». Внутри запроса можно получить представление ссылки через функцию ПРЕДСТАВЛЕНИЕ(), но это наименование элемента, а не имя объекта конфигурации.

Чем отличается Имя от ПолногоИмени()?

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

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

На тонком и веб-клиенте доступ к объекту Метаданные ограничен. Надёжный вариант — вызвать серверную функцию общего модуля с признаком «Сервер», которая вернёт имя строкой. В управляемых формах имя объекта также доступно через свойства формы, например ИмяФормы содержит путь вида «Справочник.Номенклатура.Форма.ФормаСписка».

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

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

Почему Метаданные.НайтиПоТипу() вернул Неопределено?

Метод возвращает Неопределено для примитивных типов (Строка, Число, Дата, Булево), для типов, не относящихся к конфигурации (например, ТаблицаЗначений), и для перечислений-значений, переданных не как ссылка. Проверяйте результат и обрабатывайте эту ветку отдельно.

Как получить имена только подчинённых справочников?

Переберите коллекцию Метаданные.Справочники и проверяйте свойство Владельцы: если коллекция владельцев не пустая (МетаСпр.Владельцы.Количество() > 0), справочник подчинённый. Имена владельцев доступны через МетаСпр.Владельцы[0].Имя.

Итог

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

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