К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить полное имя типа в 1С

Как получить полное имя типа в 1С через ТипЗнч, Метаданные.НайтиПоТипу и ПолноеИмя(). Примеры кода, различия строкового представления и полного имени метаданных.

Во встроенном языке 1С «имя типа» может означать два разных значения. Первое — строковое представление типа, например «СправочникСсылка.Номенклатура», которое возвращает функция ТипЗнч() в связке со Строка() или XMLТипЗнч(). Второе — полное имя объекта метаданных, например «Справочник.Номенклатура», которое получают через объект описания метаданного. Путаница между этими двумя сущностями — самая частая причина ошибок при разработке универсальных механизмов.

Выбор способа зависит от задачи. Если нужно сравнить типы, построить описание типов для отбора или вывести тип в сообщение пользователю — достаточно ТипЗнч(). Если требуется имя для обращения к метаданным, построения запроса, динамического создания объекта или сериализации — нужен именно объект метаданных и его метод ПолноеИмя().

Ниже разобраны все рабочие способы: от простого получения типа значения до получения полного имени по ссылке, по типу и по строке, а также ограничения каждого подхода и типичные ошибки.

Что именно считается «полным именем типа» в 1С

Терминология здесь неформальная, поэтому важно зафиксировать определения. Строковое представление типа — это то, что возвращает преобразование типа в строку: «СправочникСсылка.Номенклатура», «ДокументСсылка.РеализацияТоваровУслуг», «Число», «Строка». Такое представление удобно для отладки и сообщений, но не является идентификатором объекта конфигурации.

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

Для примитивных типов (Число, Строка, Дата, Булево) объекта метаданных не существует вовсе, поэтому Метаданные.НайтиПоТипу() для них вернёт Неопределено. Это принципиальное ограничение, которое нужно учитывать в универсальном коде.

Получаем строковое представление типа через ТипЗнч()

Базовый способ — функция ТипЗнч(Значение), которая возвращает объект типа «Тип». Чтобы получить читаемую строку, тип преобразуют функцией Строка():

ТипЗначения = ТипЗнч(СсылкаНаОбъект);

ИмяТипа = Строка(ТипЗначения);

// Результат: "СправочникСсылка.Номенклатура"

Такой вариант подходит для вывода в сообщения, журнал регистрации, отладочную печать и для сравнения типов через строки (хотя сравнивать лучше сами объекты типов через оператор равенства — это надёжнее и быстрее).

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

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

Получаем полное имя метаданных через НайтиПоТипу

Когда нужен именно идентификатор объекта конфигурации, последовательность такая: сначала получаем тип значения, затем по типу находим объект описания метаданных, затем вызываем ПолноеИмя():

ТипЗначения = ТипЗнч(Ссылка);

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

Если ОбъектМетаданных <> Неопределено Тогда

ПолноеИмя = ОбъектМетаданных.ПолноеИмя();

// Результат: "Справочник.Номенклатура"

КонецЕсли;

Проверка на Неопределено обязательна: для примитивных типов, типов вида «ХранилищеЗначения», «УникальныйИдентификатор» и ряда системных типов метаданных нет, и без проверки код упадёт с ошибкой обращения к методу.

Для ссылочных значений есть более короткий путь — получить метаданные прямо из ссылки: Ссылка.Метаданные().ПолноеИмя(). Метод Метаданные() доступен у всех ссылочных значений и у объектов данных, поэтому промежуточный поиск по типу не нужен.

Порядок получения полного имени по значению
  1. 1
    Проверьте, что значение не Неопределено и не NULL
  2. 2
    Получите тип: ТипЗнч(Значение)
  3. 3
    Найдите метаданные: Метаданные.НайтиПоТипу(ТипЗначения)
  4. 4
    Проверьте, что результат не Неопределено (для примитивных типов метаданных нет)
  5. 5
    Вызовите ОбъектМетаданных.ПолноеИмя() и используйте строку
  6. 6
    Для ссылок вместо шагов 2–4 можно сразу вызвать Ссылка.Метаданные().ПолноеИмя()

Полное имя по ссылке, объекту и строке: три сценария

По ссылке или объекту данных

Самый короткий и надёжный вариант для ссылочных значений — метод Метаданные():

ПолноеИмя = Ссылка.Метаданные().ПолноеИмя();

// "Документ.РеализацияТоваровУслуг"

Метод работает и для объектов (результат ПолучитьОбъект()), и для ссылок, и для значений перечислений. Для записей регистров метаданные получают через набор записей или менеджер регистра.

По строковому имени

Обратная задача — по строке «Справочник.Номенклатура» получить метаданные и тип — решается методом Метаданные.НайтиПоПолномуИмени():

ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени("Справочник.Номенклатура");

Если ОбъектМетаданных <> Неопределено Тогда

ТипСсылки = Тип("СправочникСсылка." + ОбъектМетаданных.Имя);

КонецЕсли;

По типу без значения

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

Сравнение способов получения имени

Строка(ТипЗнч(Значение))

Быстро и просто; подходит для сообщений и отладки. Не подходит для обращения к метаданным и построения запросов.

Ссылка.Метаданные().ПолноеИмя()

Короткий и надёжный вариант для ссылочных значений. Не работает для примитивных типов — у них нет метода Метаданные().

Метаданные.НайтиПоТипу(Тип).ПолноеИмя()

Универсален: работает с типом без значения. Требует проверки на Неопределено и чуть длиннее в записи.

Практические применения: где нужно полное имя

Наиболее частый сценарий — динамическое построение запроса. Текст запроса принимает полное имя таблицы, поэтому универсальные функции выборки строят его так: "ВЫБРАТЬ Ссылка ИЗ " + Ссылка.Метаданные().ПолноеИмя(). Это позволяет писать один код для любых справочников и документов.

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

Третий сценарий — универсальные проверки и подписки на события. В обработчике, который получает источник произвольного типа, по полному имени определяют, какую ветку логики выполнять, или проверяют, входит ли тип источника в список обрабатываемых.

Если полное имя нужно часто (например, в цикле по тысячам ссылок), получите его один раз до цикла и сохраните в переменную. Вызов Метаданные() и НайтиПоТипу() — не бесплатная операция, и в массовых обработках её повторение заметно увеличивает время выполнения.
ПЗ
Практическое замечание

Ограничения и типичные ошибки

Главное ограничение уже упоминалось: примитивные типы не имеют метаданных. Попытка получить Метаданные.НайтиПоТипу(Тип("Число")) вернёт Неопределено, а обращение Значение.Метаданные() к числу или строке вызовет ошибку времени выполнения. В универсальном коде сначала проверяют, является ли значение ссылочным, например через ОбщегоНазначения.ЭтоСсылка() в типовых конфигурациях или через сравнение с шаблонами типов.

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

Третья ошибка — использование НайтиПоТипу() для типов, которые существуют только как типы платформы, а не как объекты конфигурации: «ТаблицаЗначений», «Запрос», «ОписаниеТипов» и подобные. Для них метаданных также нет.

Типичные ошибки
01
Вызов Значение.Метаданные() без проверки, что значение ссылочное — ошибка времени выполнения на числах и строках
02
Передача строки «СправочникСсылка.Номенклатура» в НайтиПоПолномуИмени() — возвращает Неопределено, нужен формат «Справочник.Номенклатура»
03
Отсутствие проверки результата НайтиПоТипу() на Неопределено — падение при вызове ПолноеИмя() для примитивных типов
04
Сравнение типов по строкам вместо сравнения объектов типов — лишние преобразования и риск ошибок при переименовании
05
Повторный вызов Метаданные().ПолноеИмя() внутри цикла — замедление массовых обработок

Проверка результата и отладка

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

При отладке удобно выводить обе формы рядом: строковое представление типа и полное имя метаданных. Совпадение «хвостов» (имени объекта) и различие префиксов наглядно показывает, какая из форм нужна в конкретном месте кода.

Контрольные точки

Как проверить результат

Формат строки
Норма

«Справочник.Номенклатура» — вид объекта и имя через точку, без суффиксов Ссылка/Объект

Тревожный признак

«СправочникСсылка.Номенклатура» — это строковое представление типа, а не полное имя метаданных

Обратный поиск
Норма

Метаданные.НайтиПоПолномуИмени(ПолноеИмя) возвращает объект метаданных

Тревожный признак

Возвращает Неопределено — имя сформировано неверно или объект переименован

Поведение на примитивных типах
Норма

Код проверяет результат НайтиПоТипу() на Неопределено и обрабатывает эту ветку

Тревожный признак

Ошибка «Метод объекта не обнаружен (ПолноеИмя)» на числах, строках, датах

Частые вопросы

Чем отличается ТипЗнч() от Метаданные().ПолноеИмя()?

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

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

У отдельной записи регистра метода Метаданные() нет. Полное имя получают через менеджер регистра (например, РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей().Метаданные().ПолноеИмя()) или через Метаданные.НайтиПоТипу() по типу набора записей.

Можно ли получить тип по полному имени метаданных?

Да. Из полного имени извлекают вид объекта и имя, затем формируют строку вида «СправочникСсылка.Имя» или «ДокументОбъект.Имя» и передают её в функцию Тип(). Вид объекта сопоставляют с нужным суффиксом по таблице соответствия.

Почему НайтиПоПолномуИмени() возвращает Неопределено, хотя объект есть?

Чаще всего передана строка в формате представления типа («СправочникСсылка.Номенклатура») вместо формата метаданных («Справочник.Номенклатура»). Реже — лишние пробелы, неверный регистр не влияет, но лишние суффиксы и префиксы — да.

Как получить список полных имён всех документов конфигурации?

Пройдите циклом по коллекции Метаданные.Документы и для каждого элемента вызовите ПолноеИмя(). Аналогично работают коллекции Справочники, Перечисления, РегистрыСведений и другие корневые ветки дерева метаданных.

Работает ли ПолноеИмя() на веб-клиенте и в мобильной платформе?

Метод ПолноеИмя() и коллекция Метаданные доступны на сервере и толстом клиенте. На веб-клиенте и тонком клиенте доступ к метаданным ограничен — вычисляйте полное имя в серверной процедуре и передавайте на клиент готовую строку.

Итог

Что важно запомнить

Для ссылочных значений полное имя получают через Ссылка.Метаданные().ПолноеИмя(), универсальный вариант — Метаданные.НайтиПоТипу(ТипЗнч(Значение)) с обязательной проверкой на Неопределено. Строковое представление типа («СправочникСсылка.Номенклатура») и полное имя метаданных («Справочник.Номенклатура») — разные форматы, не взаимозаменяемые в НайтиПоПолномуИмени(). Примитивные типы метаданных не имеют.