v8: Как узнать, что ссылка на справочник, документ или на объект другого корневого типа конфигурации? Ключевые слова: ссылка
Есть функция глЧтото(Парам), в качестве параметра в оную может передаваться либо Метаданные.Справочники.ХХХ, либо же Метаданные.Документы.ХХХ. Собственно, вопрос: как в функции глЧтото
узнать Парам - это справочник, или объект?
-------------
Ответ:
Дяпти:
ЭтоСправочник = Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(МояНепонятноКакаяСсылка));
аналогично:
ЭтоДокумент = Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(МояНепонятноКакаяСсылка));
-----------------------------
В типовых еще используется функция ПринадлежностьКлассуМетаданных
Функция ПринадлежностьКлассуМетаданных(Класс, Объект) Экспорт
Для Каждого МДОбъект Из Метаданные[Класс] Цикл
Если МДОбъект = Объект Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
--------
TormozIT
Вот очень универсальное решение. Функция возвращает имя корневого типа конфигурации:
для перечисления "Перечисление",
для справочника "Справочник"
и т.д.
// Определяет корневой тип конфигурации по описанию типов, типу, метаданным, ссылке или объекту.
// Для описания типов берется первый тип массива типов.
// Для субобъектов конфигурации не возвращает имя корневого типа.
//
// Параметры:
// пОбъект – Произвольный – для чего получаем метаданные.
//
// Возвращаемое значение:
// – Строка - имя типа конфигурации;
// Неопределено - не удалось получить имя типа.
//
Функция ЛксПолучитьКорневойТипКонфигурации(Знач пОбъект) Экспорт
Если ТипЗнч(пОбъект) = Тип("ОбъектМетаданных") Тогда
МетаданныеТипа = пОбъект;
Иначе
Если ТипЗнч(пОбъект) = Тип("ОписаниеТипов") Тогда
Если пОбъект.Типы().Количество() > 0 Тогда
пОбъект = пОбъект.Типы()[0];
Иначе
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
Если ТипЗнч(пОбъект) = Тип("Тип") Тогда
МетаданныеТипа = Метаданные.НайтиПоТипу(пОбъект);
Иначе
Попытка
МетаданныеТипа = пОбъект.Метаданные();
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
Если МетаданныеТипа <> Неопределено Тогда
МассивФрагментов = ЛксПолучитьМассивИзСтрокиСРазделителем(МетаданныеТипа.ПолноеИмя());
Если МассивФрагментов.Количество() = 2 Тогда
Возврат МассивФрагментов[0];
Иначе
// Ссылка на субобъект
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции // ЛксПолучитьКорневойТипКонфигурации()
|