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