При разработке универсального кода или механизмов обмена в 1С часто возникает задача: получить точно сформированное строковое наименование типа для произвольной переменной. Например, получить строку вида "СправочникСсылка.Контрагенты" или "ДокументСсылка.ПриходнаяНакладная".
Встроенный язык 1С не предоставляет единого метода ИмяТипа(), который сразу возвращал бы строку в каноническом формате для абсолютно любых данных. Это связано с тем, что одному объекту метаданных в платформе соответствуют сразу несколько типов (ссылка, объект, менеджер, выборка и т. д.). Рассмотри подробно проверенные способы решения этой задачи.
Разберем наиболее быструю и универсальную платформенную возможность — использование функции XMLТипЗнч() или метода СериализаторXDTO.XMLТипЗнч(). Этот способ работает для всех ссылочных типов и большинства системных данных, поддерживающих сериализацию.
Проанализируем пример кода:
// Пример получения имени типа через XDTO
XMLТип = XMLТипЗнч(ЗначениеНекое);
Если XMLТип <> Неопределено Тогда
ИмяТипаXML = XMLТип.ИмяТипа; // Вернет, например, "CatalogRef.Контрагенты" или "DocumentRef.ПриходнаяНакладная"
// При необходимости переводим англоязычные фиксированные идентификаторы в русские
ИмяТипаСтрокой = СтрЗаменить(ИмяТипаXML, "CatalogRef.", "СправочникСсылка.");
ИмяТипаСтрокой = СтрЗаменить(ИмяТипаСтрокой, "DocumentRef.", "ДокументСсылка.");
ИмяТипаСтрокой = СтрЗаменить(ИмяТипаСтрокой, "EnumRef.", "ПеречислениеСсылка.");
Сообщить(ИмяТипаСтрокой);
КонецЕсли;
Обратите внимание, что идентификаторы XDTO-типов (такие как CatalogRef, DocumentRef, EnumRef) фиксированы платформой и не зависят от языка интерфейса или конфигурации. В платформе 1С метод Тип("CatalogRef.Контрагенты") успешно распознается так же, как и его русскоязычный аналог.
Если требуется получить наименование объекта метаданных без использования XDTO, воспользуемся методом Метаданные.НайтиПоТипу(). Он принимает тип значения и возвращает объект метаданных из дерева конфигурации.
Посмотрим, как определить полное имя метаданных или составить строковое имя ссылочного типа:
ТипЗначения = ТипЗнч(ЗначениеНекое);
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);
Если ОбъектМетаданных <> Неопределено Тогда
// Имя объекта метаданных (например, "Справочник.Контрагенты")
ПолноеИмяМетаданных = ОбъектМетаданных.ПолноеИмя();
// Выясняем конкретный вид типа (ссылка, объект или менеджер)
Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
СтрокаТипа = "СправочникСсылка." + ОбъектМетаданных.Имя;
ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
СтрокаТипа = "ДокументСсылка." + ОбъектМетаданных.Имя;
ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
СтрокаТипа = "ПеречислениеСсылка." + ОбъектМетаданных.Имя;
Иначе
СтрокаТипа = ПолноеИмяМетаданных;
КонецЕсли;
Сообщить(СтрокаТипа);
КонецЕсли;
Если разработка ведется в типовой конфигурации, где подключена Библиотека Стандартных Подсистем (БСП), не обязательно писать собственные функции обработки. В общем модуле ОбщегоНазначения присутствуют готовые сервисные функции:
ОбщегоНазначения.ПолноеИмяОбъектаМетаданных(ЗначениеИлиТип) — безопасно возвращает полное имя объекта метаданных (например, "Справочник.Контрагенты").ОбщегоНазначения.ИмяОбъектаМетаданных(ЗначениеИлиТип) — возвращает краткое имя объекта метаданных (например, "Контрагенты").Рассмотрим пример вызова функции БСП:
ПолноеИмя = ОбщегоНазначения.ПолноеИмяОбъектаМетаданных(ЗначениеНекое);
// Результат: "Справочник.Контрагенты"
Объединим описанные подходы в одну универсальную функцию, которая обрабатывает как примитивные типы данных, так и ссылочные объекты конфигурации:
Функция ПолучитьИмяТипаЗначения(Значение) Экспорт
ТипЗначения = ТипЗнч(Значение);
// 1. Проверка на примитивные типы
Если ТипЗначения = Тип("Строка") Тогда
Возврат "Строка";
ИначеЕсли ТипЗначения = Тип("Число") Тогда
Возврат "Число";
ИначеЕсли ТипЗначения = Тип("Дата") Тогда
Возврат "Дата";
ИначеЕсли ТипЗначения = Тип("Булево") Тогда
Возврат "Булево";
ИначеЕсли ТипЗначения = Тип("Неопределено") Тогда
Возврат "Неопределено";
ИначеЕсли ТипЗначения = Тип("Null") Тогда
Возврат "Null";
КонецЕсли;
// 2. Попытка получить через XDTO
XMLТип = XMLТипЗнч(Значение);
Если XMLТип <> Неопределено Тогда
ИмяТипа = XMLТип.ИмяТипа;
ИмяТипа = СтрЗаменить(ИмяТипа, "CatalogRef.", "СправочникСсылка.");
ИмяТипа = СтрЗаменить(ИмяТипа, "DocumentRef.", "ДокументСсылка.");
ИмяТипа = СтрЗаменить(ИмяТипа, "EnumRef.", "ПеречислениеСсылка.");
Возврат ИмяТипа;
КонецЕсли;
// 3. Поиск по метаданным
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);
Если ОбъектМетаданных <> Неопределено Тогда
Возврат ОбъектМетаданных.ПолноеИмя();
КонецЕсли;
// 4. Резервное строковое представление
Возврат Строка(ТипЗначения);
КонецФункции
Таким образом, для получения имени типа произвольного значения наиболее лаконичным решением является использование XMLТипЗнч() с заменяемыми префиксами либо связка Метаданные.НайтиПоТипу() с проверкой принадлежности к ссылочным типам.