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

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

При разработке универсального кода или механизмов обмена в 1С часто возникает задача: получить точно сформированное строковое наименование типа для произвольной переменной. Например, получить строку вида "СправочникСсылка.Контрагенты" или "ДокументСсылка.ПриходнаяНакладная".

Встроенный язык 1С не предоставляет единого метода ИмяТипа(), который сразу возвращал бы строку в каноническом формате для абсолютно любых данных. Это связано с тем, что одному объекту метаданных в платформе соответствуют сразу несколько типов (ссылка, объект, менеджер, выборка и т. д.). Рассмотри подробно проверенные способы решения этой задачи.

Способ 1. Использование сериализации XDTO (XMLТипЗнч)

Разберем наиболее быструю и универсальную платформенную возможность — использование функции XMLТипЗнч() или метода СериализаторXDTO.XMLТипЗнч(). Этот способ работает для всех ссылочных типов и большинства системных данных, поддерживающих сериализацию.

Проанализируем пример кода:


// Пример получения имени типа через XDTO
XMLТип = XMLТипЗнч(ЗначениеНекое);

Если XMLТип <> Неопределено Тогда
    ИмяТипаXML = XMLТип.ИмяТипа; // Вернет, например, "CatalogRef.Контрагенты" или "DocumentRef.ПриходнаяНакладная"
    
    // При необходимости переводим англоязычные фиксированные идентификаторы в русские
    ИмяТипаСтрокой = СтрЗаменить(ИмяТипаXML, "CatalogRef.", "СправочникСсылка.");
    ИмяТипаСтрокой = СтрЗаменить(ИмяТипаСтрокой, "DocumentRef.", "ДокументСсылка.");
    ИмяТипаСтрокой = СтрЗаменить(ИмяТипаСтрокой, "EnumRef.", "ПеречислениеСсылка.");
    
    Сообщить(ИмяТипаСтрокой);
КонецЕсли;

Обратите внимание, что идентификаторы XDTO-типов (такие как CatalogRef, DocumentRef, EnumRef) фиксированы платформой и не зависят от языка интерфейса или конфигурации. В платформе 1С метод Тип("CatalogRef.Контрагенты") успешно распознается так же, как и его русскоязычный аналог.

Способ 2. Поиск через глобальный контекст метаданных

Если требуется получить наименование объекта метаданных без использования XDTO, воспользуемся методом Метаданные.НайтиПоТипу(). Он принимает тип значения и возвращает объект метаданных из дерева конфигурации.

Посмотрим, как определить полное имя метаданных или составить строковое имя ссылочного типа:


ТипЗначения = ТипЗнч(ЗначениеНекое);
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);

Если ОбъектМетаданных <> Неопределено Тогда
    // Имя объекта метаданных (например, "Справочник.Контрагенты")
    ПолноеИмяМетаданных = ОбъектМетаданных.ПолноеИмя(); 
    
    // Выясняем конкретный вид типа (ссылка, объект или менеджер)
    Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
        СтрокаТипа = "СправочникСсылка." + ОбъектМетаданных.Имя;
    ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
        СтрокаТипа = "ДокументСсылка." + ОбъектМетаданных.Имя;
    ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
        СтрокаТипа = "ПеречислениеСсылка." + ОбъектМетаданных.Имя;
    Иначе
        СтрокаТипа = ПолноеИмяМетаданных;
    КонецЕсли;
    
    Сообщить(СтрокаТипа);
КонецЕсли;

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

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

  1. ОбщегоНазначения.ПолноеИмяОбъектаМетаданных(ЗначениеИлиТип) — безопасно возвращает полное имя объекта метаданных (например, "Справочник.Контрагенты").
  2. ОбщегоНазначения.ИмяОбъектаМетаданных(ЗначениеИлиТип) — возвращает краткое имя объекта метаданных (например, "Контрагенты").

Рассмотрим пример вызова функции БСП:


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

Универсальная функция получения типа

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


Функция ПолучитьИмяТипаЗначения(Значение) Экспорт

    ТипЗначения = ТипЗнч(Значение);
    
    // 1. Проверка на примитивные типы
    Если ТипЗначения = Тип("Строка") Тогда
        Возврат "Строка";
    ИначеЕсли ТипЗначения = Тип("Число") Тогда
        Возврат "Число";
    ИначеЕсли ТипЗначения = Тип("Дата") Тогда
        Возврат "Дата";
    ИначеЕсли ТипЗначения = Тип("Булево") Тогда
        Возврат "Булево";
    ИначеЕсли ТипЗначения = Тип("Неопределено") Тогда
        Возврат "Неопределено";
    ИначеЕсли ТипЗначения = Тип("Null") Тогда
        Возврат "Null";
    КонецЕсли;

    // 2. Попытка получить через XDTO
    XMLТип = XMLТипЗнч(Значение);
    Если XMLТип <> Неопределено Тогда
        ИмяТипа = XMLТип.ИмяТипа;
        ИмяТипа = СтрЗаменить(ИмяТипа, "CatalogRef.", "СправочникСсылка.");
        ИмяТипа = СтрЗаменить(ИмяТипа, "DocumentRef.", "ДокументСсылка.");
        ИмяТипа = СтрЗаменить(ИмяТипа, "EnumRef.", "ПеречислениеСсылка.");
        Возврат ИмяТипа;
    КонецЕсли;

    // 3. Поиск по метаданным
    ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);
    Если ОбъектМетаданных <> Неопределено Тогда
        Возврат ОбъектМетаданных.ПолноеИмя();
    КонецЕсли;

    // 4. Резервное строковое представление
    Возврат Строка(ТипЗначения);

КонецФункции

Таким образом, для получения имени типа произвольного значения наиболее лаконичным решением является использование XMLТипЗнч() с заменяемыми префиксами либо связка Метаданные.НайтиПоТипу() с проверкой принадлежности к ссылочным типам.

← На главную