При разработке универсальных механизмов, выгрузок данных или систем автоматического документирования конфигурации часто возникает задача: получить строковое представление типа реквизита. Казалось бы, задача тривиальная, но стандартная функция Строка(Тип) часто возвращает локализованное представление (например, "Справочник ссылка: Номенклатура"), которое не подходит для программного анализа или записи в технические файлы. В этой статье мы подробно разберем, как получить техническое имя типа, такое как СправочникСсылка.Номенклатура или ДокументОбъект.РеализацияТоваровУслуг, используя различные подходы.
Рассмотрим ситуацию: у нас есть объект ОписаниеТипов. Если мы попытаемся просто преобразовать его в строку, платформа выдаст дружелюбное для пользователя описание. Однако для кода нам нужно каноническое имя. Основная сложность заключается в том, что реквизиты метаданных хранят именно ОписаниеТипов, которое может содержать массив простых типов или ссылок (составной тип). Нам необходимо извлечь каждый конкретный Тип и преобразовать его в строковый идентификатор.
Проанализируем наиболее правильный подход с точки зрения платформы — использование метода Метаданные.НайтиПоТипу(). Этот метод позволяет получить объект метаданных, которому соответствует данный тип, а затем обратиться к его свойству ПолноеИмя().
Рассмотрим по шагам реализацию функции, которая будет корректно обрабатывать как одиночные типы, так и целые описания типов:
&НаСервере
Функция ПолучитьСтроковоеИмяТипа(ТипИлиОписаниеТипов)
МассивТиповСтроками = Новый Массив;
МассивТипов = Новый Массив;
// Проверяем, что пришло на вход: конкретный Тип или ОписаниеТипов
Если ТипЗнч(ТипИлиОписаниеТипов) = Тип("Тип") Тогда
МассивТипов.Добавить(ТипИлиОписаниеТипов);
ИначеЕсли ТипЗнч(ТипИлиОписаниеТипов) = Тип("ОписаниеТипов") Тогда
МассивТипов = ТипИлиОписаниеТипов.Типы();
КонецЕсли;
Для Каждого ТекущийТип Из МассивТипов Цикл
// Ищем объект метаданных по типу
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТекущийТип);
Если ОбъектМетаданных = Неопределено Тогда
// Если метаданные не найдены, это примитивный тип (Число, Строка и т.д.)
ТипСтрокой = Строка(ТекущийТип);
Иначе
// Получаем полное имя (например, "Справочник.Номенклатура")
ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
// Для ссылочных типов принято добавлять суффикс "Ссылка"
// Чтобы получить "СправочникСсылка.Номенклатура" вместо "Справочник.Номенклатура"
ТипСтрокой = СтрЗаменить(ПолноеИмя, ".", "Ссылка.");
КонецЕсли;
МассивТиповСтроками.Добавить(ТипСтрокой);
КонецЦикла;
Возврат СтрСоединить(МассивТиповСтроками, "; ");
КонецФункции
Важный нюанс: Метод ПолноеИмя() возвращает путь в формате ТипМетаданных.ИмяОбъекта. Если вам нужно формировать типы для программного создания объектов (например, через Новый), помните о различиях между СправочникСсылка и СправочникОбъект.
Выясним, как получить имя типа без обращения к метаданным. В 1С существует возможность получить тип через XML-представление. Это работает быстро и возвращает "технические" имена типов, которые используются в платформе для сериализации.
Разберем пример функции, использующей XMLТип:
Функция ТипВТехническуюСтроку(Значение)
Попытка
// Получаем структуру XMLТип, содержащую имя типа и URI пространства имен
ДанныеXML = XMLТип(ТипЗнч(Значение));
ТипСтрокой = ДанныеXML.ИмяТипа;
// Переводим системные названия на понятный язык (при необходимости)
ТипСтрокой = СтрЗаменить(ТипСтрокой, "decimal", "Число");
ТипСтрокой = СтрЗаменить(ТипСтрокой, "string", "Строка");
ТипСтрокой = СтрЗаменить(ТипСтрокой, "boolean", "Булево");
ТипСтрокой = СтрЗаменить(ТипСтрокой, "dateTime", "Дата");
ТипСтрокой = СтрЗаменить(ТипСтрокой, "CatalogRef", "СправочникСсылка");
ТипСтрокой = СтрЗаменить(ТипСтрокой, "DocumentRef", "ДокументСсылка");
Возврат ТипСтрокой;
Исключение
Возврат "Неопределено";
КонецПопытки;
КонецФункции
Этот метод удобен тем, что он возвращает канонические имена CatalogRef, DocumentRef, что часто используется при интеграции со сторонними системами или при веб-разработке.
Если ваша конфигурация построена на базе БСП (а это большинство современных решений: УТ 11, ERP, БП 3.0), то изобретать велосипед не нужно. В общем модуле ОбщегоНазначения уже реализованы все необходимые инструменты. Мы рекомендуем использовать их, так как они учитывают множество нюансов и оптимизированы по производительности.
Проанализируем полезные функции БСП:
ОбщегоНазначения.СтроковоеПредставлениеТипа(Тип) — возвращает строку вида "СправочникСсылка.Номенклатура".ОбщегоНазначения.ИмяТаблицыПоСсылке(Ссылка) — возвращает полное имя объекта метаданных (например, "Справочник.Валюты").ОбщегоНазначения.ОписаниеТипаСтрокой(ОписаниеТипов) — формирует читаемое, но технически верное описание для составных типов.Иногда простого названия типа "Число" недостаточно. Для полноценной документации или создания структуры таблиц нам нужны параметры: длина строки, разрядность числа и т.д. Посмотрим, как извлечь эти данные из ОписаниеТипов.
Функция ПолучитьПодробноеОписаниеТипа(РеквизитМетаданных)
ТипОбъекта = РеквизитМетаданных.Тип;
Результат = Строка(ТипОбъекта);
Если ТипОбъекта.СодержитТип(Тип("Строка")) Тогда
Квалификатор = ТипОбъекта.КвалификаторыСтроки;
Длина = ?(Квалификатор.Длина = 0, "Неограниченная", Строка(Квалификатор.Длина));
Результат = Результат + " (длина: " + Длина + ")";
ИначеЕсли ТипОбъекта.СодержитТип(Тип("Число")) Тогда
Квалификатор = ТипОбъекта.КвалификаторыЧисла;
Результат = Результат + " (точность: " + Квалификатор.Разрядность + ", дробная: " + Квалификатор.РазрядностьДробнойЧасти + ")";
КонецЕсли;
Возврат Результат;
КонецФункции
Обращение к метаданным через НайтиПоТипу() — это относительно ресурсоемкая операция. Если вы обрабатываете тысячи строк в цикле (например, при генерации отчета по всем типам документов в базе), мы советуем использовать кэширование.
Создадим простое Соответствие, где ключом будет сам Тип, а значением — уже вычисленная строка. При повторном обращении к тому же типу программа мгновенно возьмет результат из памяти, не опрашивая дерево метаданных конфигурации. Это ускорит выполнение кода в десятки раз в высоконагруженных циклах.
Подведем итог: Для получения чистого технического имени лучше всего подходит метод с использованием метаданных (Метод 1). Для быстрых задач интеграции можно использовать XML (Метод 2). А в типовых конфигурациях всегда стоит начинать с проверки наличия готовых функций в БСП.