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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Различие понятий: Менеджер, Тип и Метаданные

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

В платформе 1С:Предприятие 8 четко разделены следующие сущности:

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

Способ 1. Получение системного типа по строковому имени

Если нам необходимо получить системный тип Тип для проверки типов или формирования описания типов, рассмотрим два основных варианта.

Первый вариант — использование функции Тип() с конкатенацией строки вида "СправочникСсылка.":


ИмяСправочника = "Номенклатура";
ТипОбъекта = Тип("СправочникСсылка." + ИмяСправочника);

Второй, более надежный вариант, исключающий опечатки при сборке строки, — получение типа от пустой ссылки через менеджер справочника:


ИмяСправочника = "Номенклатура";
ТипОбъекта = ТипЗнч(Справочники[ИмяСправочника].ПустаяСсылка());

Если полученный тип требуется использовать для программного добавления колонок в таблицу значений или типизации реквизитов формы, создадим объект ОписаниеТипов:


МассивТипов = Новый Массив;
МассивТипов.Добавить(ТипЗнч(Справочники[ИмяСправочника].ПустаяСсылка()));
НовоеОписание = Новый ОписаниеТипов(МассивТипов);

Способ 2. Динамическое обращение к менеджеру справочника

Когда строковое имя справочника передается в переменную и необходимо выполнить стандартные операции (создать элемент, найти по коду или реквизиту), обратимся к системной коллекции менеджеров через оператор квадратных скобок []:


ИмяСправочника = "Номенклатура";

// Проверим наличие справочника в метаданных конфигурации для защиты от ошибок
Если Метаданные.Справочники.Найти(ИмяСправочника) <> Неопределено Тогда
    Менеджер = Справочники[ИмяСправочника];
    
    // Пример использования менеджера
    НовыйЭлемент = Менеджер.СоздатьЭлемент();
    НовыйЭлемент.Наименование = "Тестовая позиция";
    НовыйЭлемент.Записать();
Иначе
    ВызватьИсключение "Справочник с именем " + ИмяСправочника + " не найден в конфигурации!";
КонецЕсли;

Способ 3. Получение полного канонического имени объекта

Если стоит задача получить полное строковое имя объекта конфигурации для системных журналов, сериализации или динамических запросов, обратимся к дереву метаданных через метод ПолноеИмя():


ИмяСправочника = "Номенклатура";
ОбъектМетаданных = Метаданные.Справочники[ИмяСправочника];
ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); // Результат: "Справочник.Номенклатура"

Обратите внимание: в дереве метаданных класс объектов всегда пишется в единственном числе (Справочник, Документ, ПланВидовХарактеристик), в то время как глобальные коллекции менеджеров во встроенном языке именуются во множественном числе (Справочники, Документы, ПланыВидовХарактеристик).

Способ 4. Использование функций БСП

В типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) для динамического получения менеджеров реализованы универсальные функции общего модуля ОбщегоНазначения:


// Получение менеджера по полному имени метаданных
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени("Справочник." + ИмяСправочника);

// Получение менеджера по известному типу или ссылке
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоТипу(ТипЗнч(СсылкаНаОбъект));

Контекст выполнения

Выясним важное платформенное ограничение: глобальная коллекция Справочники и глобальный объект Метаданные недоступны на стороне тонкого и веб-клиента. Все операции по определению типов, получению метаданных и обращению к менеджерам объектов должны выполняться исключительно в контексте сервера: в серверных процедурах и функциях (директивы &НаСервере, &НаСервереБезКонтекста) или в серверных общих модулях.

← На главную