При динамической разработке в среде 1С:Предприятие часто возникает задача, когда имя объекта конфигурации (например, справочника или документа) известно только в виде строки — например, "Номенклатура" или "Контрагенты". При попытке получить его тип, полное имя или программный менеджер разработчики нередко путают понятия типов ссылок, объектов метаданных и коллекций менеджеров. Разберем по шагам все возможные сценарии и способы решения этой задачи.
Проанализируем частую ошибку: конструкции вида Справочники.Номенклатура не являются системным типом данных платформы. Это обращение к конкретному менеджеру объекта в глобальной коллекции.
В платформе 1С:Предприятие 8 четко разделены следующие сущности:
Справочники.СправочникСсылка.Номенклатура).Справочник.Номенклатура (в единственном числе).Если нам необходимо получить системный тип Тип для проверки типов или формирования описания типов, рассмотрим два основных варианта.
Первый вариант — использование функции Тип() с конкатенацией строки вида "СправочникСсылка.":
ИмяСправочника = "Номенклатура";
ТипОбъекта = Тип("СправочникСсылка." + ИмяСправочника);
Второй, более надежный вариант, исключающий опечатки при сборке строки, — получение типа от пустой ссылки через менеджер справочника:
ИмяСправочника = "Номенклатура";
ТипОбъекта = ТипЗнч(Справочники[ИмяСправочника].ПустаяСсылка());
Если полученный тип требуется использовать для программного добавления колонок в таблицу значений или типизации реквизитов формы, создадим объект ОписаниеТипов:
МассивТипов = Новый Массив;
МассивТипов.Добавить(ТипЗнч(Справочники[ИмяСправочника].ПустаяСсылка()));
НовоеОписание = Новый ОписаниеТипов(МассивТипов);
Когда строковое имя справочника передается в переменную и необходимо выполнить стандартные операции (создать элемент, найти по коду или реквизиту), обратимся к системной коллекции менеджеров через оператор квадратных скобок []:
ИмяСправочника = "Номенклатура";
// Проверим наличие справочника в метаданных конфигурации для защиты от ошибок
Если Метаданные.Справочники.Найти(ИмяСправочника) <> Неопределено Тогда
Менеджер = Справочники[ИмяСправочника];
// Пример использования менеджера
НовыйЭлемент = Менеджер.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Тестовая позиция";
НовыйЭлемент.Записать();
Иначе
ВызватьИсключение "Справочник с именем " + ИмяСправочника + " не найден в конфигурации!";
КонецЕсли;
Если стоит задача получить полное строковое имя объекта конфигурации для системных журналов, сериализации или динамических запросов, обратимся к дереву метаданных через метод ПолноеИмя():
ИмяСправочника = "Номенклатура";
ОбъектМетаданных = Метаданные.Справочники[ИмяСправочника];
ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); // Результат: "Справочник.Номенклатура"
Обратите внимание: в дереве метаданных класс объектов всегда пишется в единственном числе (Справочник, Документ, ПланВидовХарактеристик), в то время как глобальные коллекции менеджеров во встроенном языке именуются во множественном числе (Справочники, Документы, ПланыВидовХарактеристик).
В типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) для динамического получения менеджеров реализованы универсальные функции общего модуля ОбщегоНазначения:
// Получение менеджера по полному имени метаданных
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени("Справочник." + ИмяСправочника);
// Получение менеджера по известному типу или ссылке
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоТипу(ТипЗнч(СсылкаНаОбъект));
Выясним важное платформенное ограничение: глобальная коллекция Справочники и глобальный объект Метаданные недоступны на стороне тонкого и веб-клиента. Все операции по определению типов, получению метаданных и обращению к менеджерам объектов должны выполняться исключительно в контексте сервера: в серверных процедурах и функциях (директивы &НаСервере, &НаСервереБезКонтекста) или в серверных общих модулях.