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