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

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

При разработке универсальных механизмов, выгрузок данных или систем автоматического документирования конфигурации часто возникает задача: получить строковое представление типа реквизита. Казалось бы, задача тривиальная, но стандартная функция Строка(Тип) часто возвращает локализованное представление (например, "Справочник ссылка: Номенклатура"), которое не подходит для программного анализа или записи в технические файлы. В этой статье мы подробно разберем, как получить техническое имя типа, такое как СправочникСсылка.Номенклатура или ДокументОбъект.РеализацияТоваровУслуг, используя различные подходы.

Проблема использования стандартных методов

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

Метод 1: Использование коллекции метаданных (Самый надежный способ)

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

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


&НаСервере
Функция ПолучитьСтроковоеИмяТипа(ТипИлиОписаниеТипов)
    
    МассивТиповСтроками = Новый Массив;
    МассивТипов = Новый Массив;
    
    // Проверяем, что пришло на вход: конкретный Тип или ОписаниеТипов
    Если ТипЗнч(ТипИлиОписаниеТипов) = Тип("Тип") Тогда
        МассивТипов.Добавить(ТипИлиОписаниеТипов);
    ИначеЕсли ТипЗнч(ТипИлиОписаниеТипов) = Тип("ОписаниеТипов") Тогда
        МассивТипов = ТипИлиОписаниеТипов.Типы();
    КонецЕсли;
    
    Для Каждого ТекущийТип Из МассивТипов Цикл
        // Ищем объект метаданных по типу
        ОбъектМетаданных = Метаданные.НайтиПоТипу(ТекущийТип);
        
        Если ОбъектМетаданных = Неопределено Тогда
            // Если метаданные не найдены, это примитивный тип (Число, Строка и т.д.)
            ТипСтрокой = Строка(ТекущийТип);
        Иначе
            // Получаем полное имя (например, "Справочник.Номенклатура")
            ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
            
            // Для ссылочных типов принято добавлять суффикс "Ссылка"
            // Чтобы получить "СправочникСсылка.Номенклатура" вместо "Справочник.Номенклатура"
            ТипСтрокой = СтрЗаменить(ПолноеИмя, ".", "Ссылка.");
        КонецЕсли;
        
        МассивТиповСтроками.Добавить(ТипСтрокой);
    КонецЦикла;
    
    Возврат СтрСоединить(МассивТиповСтроками, "; ");
    
КонецФункции

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

Метод 2: Использование механизмов XML-сериализации

Выясним, как получить имя типа без обращения к метаданным. В 1С существует возможность получить тип через XML-представление. Это работает быстро и возвращает "технические" имена типов, которые используются в платформе для сериализации.

Разберем пример функции, использующей XMLТип:


Функция ТипВТехническуюСтроку(Значение)
    Попытка
        // Получаем структуру XMLТип, содержащую имя типа и URI пространства имен
        ДанныеXML = XMLТип(ТипЗнч(Значение));
        ТипСтрокой = ДанныеXML.ИмяТипа;
        
        // Переводим системные названия на понятный язык (при необходимости)
        ТипСтрокой = СтрЗаменить(ТипСтрокой, "decimal", "Число");
        ТипСтрокой = СтрЗаменить(ТипСтрокой, "string", "Строка");
        ТипСтрокой = СтрЗаменить(ТипСтрокой, "boolean", "Булево");
        ТипСтрокой = СтрЗаменить(ТипСтрокой, "dateTime", "Дата");
        ТипСтрокой = СтрЗаменить(ТипСтрокой, "CatalogRef", "СправочникСсылка");
        ТипСтрокой = СтрЗаменить(ТипСтрокой, "DocumentRef", "ДокументСсылка");
        
        Возврат ТипСтрокой;
    Исключение
        Возврат "Неопределено";
    КонецПопытки;
КонецФункции

Этот метод удобен тем, что он возвращает канонические имена CatalogRef, DocumentRef, что часто используется при интеграции со сторонними системами или при веб-разработке.

Метод 3: Функции Библиотеки стандартных подсистем (БСП)

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

Проанализируем полезные функции БСП:

  1. ОбщегоНазначения.СтроковоеПредставлениеТипа(Тип) — возвращает строку вида "СправочникСсылка.Номенклатура".
  2. ОбщегоНазначения.ИмяТаблицыПоСсылке(Ссылка) — возвращает полное имя объекта метаданных (например, "Справочник.Валюты").
  3. ОбщегоНазначения.ОписаниеТипаСтрокой(ОписаниеТипов) — формирует читаемое, но технически верное описание для составных типов.

Метод 4: Обработка квалификаторов (Строки и Числа)

Иногда простого названия типа "Число" недостаточно. Для полноценной документации или создания структуры таблиц нам нужны параметры: длина строки, разрядность числа и т.д. Посмотрим, как извлечь эти данные из ОписаниеТипов.


Функция ПолучитьПодробноеОписаниеТипа(РеквизитМетаданных)
    
    ТипОбъекта = РеквизитМетаданных.Тип;
    Результат = Строка(ТипОбъекта);
    
    Если ТипОбъекта.СодержитТип(Тип("Строка")) Тогда
        Квалификатор = ТипОбъекта.КвалификаторыСтроки;
        Длина = ?(Квалификатор.Длина = 0, "Неограниченная", Строка(Квалификатор.Длина));
        Результат = Результат + " (длина: " + Длина + ")";
        
    ИначеЕсли ТипОбъекта.СодержитТип(Тип("Число")) Тогда
        Квалификатор = ТипОбъекта.КвалификаторыЧисла;
        Результат = Результат + " (точность: " + Квалификатор.Разрядность + ", дробная: " + Квалификатор.РазрядностьДробнойЧасти + ")";
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции

Рекомендации по производительности

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

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

Подведем итог: Для получения чистого технического имени лучше всего подходит метод с использованием метаданных (Метод 1). Для быстрых задач интеграции можно использовать XML (Метод 2). А в типовых конфигурациях всегда стоит начинать с проверки наличия готовых функций в БСП.

← На главную