Разработка и Конфигурация · 8 мин
Как получить имя справочника в 1С
Как получить имя справочника в 1С: через метаданные, метод Метаданные(), синоним и представление. Примеры кода для 1С 8.3, типичные ошибки и FAQ.
Имя справочника в 1С требуется в самых разных задачах: при универсальном обходе метаданных, построении динамических запросов, обменах данными и формировании представлений объектов. Важно сразу различать три понятия: имя — идентификатор объекта в конфигурации (например, «Номенклатура»), синоним — представление для пользователя (например, «Номенклатура товаров») и представление ссылки — строковое отображение конкретного элемента справочника.
Встроенный язык 1С предоставляет несколько способов получить эти данные: через объект Метаданные, через методы ссылки и через объектную модель СправочникиМенеджер. Выбор зависит от того, что у вас есть на входе — ссылка на элемент, тип значения или только строка с именем.
Ниже разобраны рабочие приёмы для платформы 1С:Предприятие 8.3 с примерами кода, проверкой результата и типичными ошибками, которые приводят к неоправданным обращениям к базе или падению кода.
Через ссылку на элемент: метод Метаданные()
Самый частый сценарий — есть ссылка на элемент справочника, и нужно узнать, какому справочнику она принадлежит. У любой ссылки есть метод Метаданные(), который возвращает объект описания метаданных, а у него — свойство Имя.
ИмяСправочника = СсылкаНаЭлемент.Метаданные().Имя;
// Например: "Номенклатура"
СинонимСправочника = СсылкаНаЭлемент.Метаданные().Синоним;
// Например: "Номенклатура товаров"
Этот способ универсален: он работает не только для справочников, но и для документов, планов счетов и других ссылочных типов. Чтобы убедиться, что ссылка действительно указывает на справочник, используйте проверку типа метаданных.
МетаОбъект = СсылкаНаЭлемент.Метаданные();
Если Метаданные.Справочники.Содержит(МетаОбъект) Тогда
ИмяСправочника = МетаОбъект.Имя;
КонецЕсли;
Через тип значения без ссылки
Иногда ссылки под рукой нет — есть только тип значения, например в параметре процедуры общего модуля. В этом случае имя получают через фабрику типов.
ТипСсылки = ТипЗнч(Значение);
МетаОбъект = Метаданные.НайтиПоТипу(ТипСсылки);
Если МетаОбъект <> Неопределено Тогда
ИмяСправочника = МетаОбъект.Имя;
КонецЕсли;
Метод Метаданные.НайтиПоТипу() возвращает Неопределено, если тип не относится к объектам конфигурации (например, это примитивный тип «Строка»). Всегда проверяйте результат перед обращением к свойствам — иначе получите ошибку «Значение не является значением объектного типа».
Поиск справочника по имени в конфигурации
Обратная задача — проверить, существует ли справочник с заданным именем, и получить его метаданные. Это нужно при универсальных обработках, где имя приходит строкой из настроек или файла обмена.
МетаСправочник = Метаданные.Справочники.Найти("Контрагенты");
Если МетаСправочник = Неопределено Тогда
// Справочника с таким именем в конфигурации нет
Иначе
ИмяСправочника = МетаСправочник.Имя;
КонецЕсли;
Поиск по Найти() выполняется с учётом регистра, но имя справочника в конфигурации обычно задаётся в едином написании. Надёжнее перебрать коллекцию и сравнить имена через ВРег(), если имя приходит из внешнего источника.
- 1Определите, что есть на входе: ссылка, тип значения или строка с именем
- 2Для ссылки вызовите Ссылка.Метаданные().Имя
- 3Для типа — Метаданные.НайтиПоТипу(ТипЗнч(Значение))
- 4Для строки — Метаданные.Справочники.Найти(ИмяСтрокой)
- 5Проверьте результат на Неопределено перед использованием
- 6Выведите имя в сообщение или журнал для контроля
Перебор всех справочников конфигурации
Для служебных обработок — например, выгрузки структуры конфигурации или проверки прав — нужно получить имена всех справочников. Коллекция Метаданные.Справочники перебирается обычным циклом.
Для Каждого МетаСпр Из Метаданные.Справочники Цикл
Сообщить(МетаСпр.Имя + " — " + МетаСпр.Синоним);
КонецЦикла;
Если нужен отбор по условию — например, только иерархические справочники — добавьте проверку свойств метаданных: МетаСпр.Иерархический, МетаСпр.ВидИерархии, МетаСпр.Владельцы (для подчинённых справочников).
Функция ИменаВсехСправочников()
Результат = Новый Массив;
Для Каждого МетаСпр Из Метаданные.Справочники Цикл
Результат.Добавить(МетаСпр.Имя);
КонецЦикла;
Возврат Результат;
КонецФункцииСиноним и представление: в чём разница с именем
Частая путаница — смешение имени, синонима и представления элемента. Имя — технический идентификатор, который используется в запросах и коде (Справочники.Номенклатура). Синоним — то, что видит пользователь в интерфейсе. Представление ссылки — наименование конкретного элемента, получаемое через Строка(Ссылка) или запрос к полю «Наименование».
Для программной логики используйте только имя: синоним может меняться при доработке конфигурации, и код, завязанный на него, сломается. Синоним уместен только в сообщениях пользователю и заголовках форм.
Получение менеджера справочника по имени
Когда имя уже известно, через него получают менеджер для дальнейшей работы — создания элементов, поиска, выборки. Коллекция Справочники поддерживает обращение по строковому имени.
МенеджерСправочника = Справочники["Контрагенты"];
ПустаяСсылка = МенеджерСправочника.ПустаяСсылка();
НайденныйЭлемент = МенеджерСправочника.НайтиПоКоду("000000001");
Если имя приходит из недоверенного источника, перед обращением к Справочники[Имя] убедитесь через Метаданные.Справочники.Найти(), что такой объект существует — иначе обращение вызовет исключение.
Как проверить результат
Строка с именем, совпадающая с именем в конфигураторе
Неопределено или пустая строка
Код корректно отрабатывает ветку Неопределено
Исключение «поле объекта не обнаружено»
Менеджер получен без исключения
Ошибка обращения к элементу коллекции
FAQ
Как получить имя справочника в запросе?
Напрямую в тексте запроса имя метаданных не вычисляется — оно определяется до построения запроса и подставляется в текст строкой: «ВЫБРАТЬ Ссылка ИЗ Справочник." + ИмяСправочника + "». Внутри запроса можно получить представление ссылки через функцию ПРЕДСТАВЛЕНИЕ(), но это наименование элемента, а не имя объекта конфигурации.
Чем отличается Имя от ПолногоИмени()?
Свойство Имя возвращает только идентификатор объекта, например «Номенклатура». Метод ПолноеИмя() возвращает полный путь с типом: «Справочник.Номенклатура». Полное имя удобно для логирования и для функции Метаданные.НайтиПоПолномуИмени(), которая по такой строке восстанавливает объект метаданных.
Можно ли получить имя справочника на клиенте?
На тонком и веб-клиенте доступ к объекту Метаданные ограничен. Надёжный вариант — вызвать серверную функцию общего модуля с признаком «Сервер», которая вернёт имя строкой. В управляемых формах имя объекта также доступно через свойства формы, например ИмяФормы содержит путь вида «Справочник.Номенклатура.Форма.ФормаСписка».
Как узнать имя справочника по полному имени из файла обмена?
Разберите строку по точке: первая часть — тип объекта («Справочник»), вторая — имя. Затем проверьте существование через Метаданные.Справочники.Найти(Имя). Учтите, что в форматах обмена (например, EnterpriseData) имена могут отличаться от имён в конфигурации и требуют таблицы соответствия.
Почему Метаданные.НайтиПоТипу() вернул Неопределено?
Метод возвращает Неопределено для примитивных типов (Строка, Число, Дата, Булево), для типов, не относящихся к конфигурации (например, ТаблицаЗначений), и для перечислений-значений, переданных не как ссылка. Проверяйте результат и обрабатывайте эту ветку отдельно.
Как получить имена только подчинённых справочников?
Переберите коллекцию Метаданные.Справочники и проверяйте свойство Владельцы: если коллекция владельцев не пустая (МетаСпр.Владельцы.Количество() > 0), справочник подчинённый. Имена владельцев доступны через МетаСпр.Владельцы[0].Имя.
Что важно запомнить
Имя справочника — это свойство метаданных: Ссылка.Метаданные().Имя. Для типа без ссылки используйте Метаданные.НайтиПоТипу(), для поиска по строке — Метаданные.Справочники.Найти(). Всегда проверяйте результат на Неопределено и не подменяйте имя синонимом или наименованием элемента.