Разработка и Конфигурация · 11 мин
Как получить полное имя типа в 1С
Как получить полное имя типа в 1С через ТипЗнч, Метаданные.НайтиПоТипу и ПолноеИмя(). Примеры кода, различия строкового представления и полного имени метаданных.
Во встроенном языке 1С «имя типа» может означать два разных значения. Первое — строковое представление типа, например «СправочникСсылка.Номенклатура», которое возвращает функция ТипЗнч() в связке со Строка() или XMLТипЗнч(). Второе — полное имя объекта метаданных, например «Справочник.Номенклатура», которое получают через объект описания метаданного. Путаница между этими двумя сущностями — самая частая причина ошибок при разработке универсальных механизмов.
Выбор способа зависит от задачи. Если нужно сравнить типы, построить описание типов для отбора или вывести тип в сообщение пользователю — достаточно ТипЗнч(). Если требуется имя для обращения к метаданным, построения запроса, динамического создания объекта или сериализации — нужен именно объект метаданных и его метод ПолноеИмя().
Ниже разобраны все рабочие способы: от простого получения типа значения до получения полного имени по ссылке, по типу и по строке, а также ограничения каждого подхода и типичные ошибки.
Что именно считается «полным именем типа» в 1С
Терминология здесь неформальная, поэтому важно зафиксировать определения. Строковое представление типа — это то, что возвращает преобразование типа в строку: «СправочникСсылка.Номенклатура», «ДокументСсылка.РеализацияТоваровУслуг», «Число», «Строка». Такое представление удобно для отладки и сообщений, но не является идентификатором объекта конфигурации.
Полное имя объекта метаданных — это идентификатор вида «Справочник.Номенклатура» или «Документ.РеализацияТоваровУслуг», который возвращает метод ПолноеИмя() объекта описания метаданных. Именно эта строка принимается методами Метаданные.НайтиПоПолномуИмени(), используется в текстах запросов и в механизмах обмена.
Для примитивных типов (Число, Строка, Дата, Булево) объекта метаданных не существует вовсе, поэтому Метаданные.НайтиПоТипу() для них вернёт Неопределено. Это принципиальное ограничение, которое нужно учитывать в универсальном коде.
Получаем строковое представление типа через ТипЗнч()
Базовый способ — функция ТипЗнч(Значение), которая возвращает объект типа «Тип». Чтобы получить читаемую строку, тип преобразуют функцией Строка():
ТипЗначения = ТипЗнч(СсылкаНаОбъект);
ИмяТипа = Строка(ТипЗначения);
// Результат: "СправочникСсылка.Номенклатура"
Такой вариант подходит для вывода в сообщения, журнал регистрации, отладочную печать и для сравнения типов через строки (хотя сравнивать лучше сами объекты типов через оператор равенства — это надёжнее и быстрее).
Если нужна строка, пригодная для обратного преобразования через Тип(), используют XMLТипЗнч() или формируют имя в формате, который понимает конструктор типа. Для ссылочных типов корректно работает связка с полным именем метаданных, рассмотренная ниже.
ТипЗначения = ТипЗнч(Значение);
ИмяТипаСтрокой = Строка(ТипЗначения); // "ДокументСсылка.ПриходныйОрдер"
Если ТипЗначения = Тип("ДокументСсылка.ПриходныйОрдер") Тогда
// сравнение по объекту типа, а не по строке
КонецЕсли;Получаем полное имя метаданных через НайтиПоТипу
Когда нужен именно идентификатор объекта конфигурации, последовательность такая: сначала получаем тип значения, затем по типу находим объект описания метаданных, затем вызываем ПолноеИмя():
ТипЗначения = ТипЗнч(Ссылка);
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);
Если ОбъектМетаданных <> Неопределено Тогда
ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
// Результат: "Справочник.Номенклатура"
КонецЕсли;
Проверка на Неопределено обязательна: для примитивных типов, типов вида «ХранилищеЗначения», «УникальныйИдентификатор» и ряда системных типов метаданных нет, и без проверки код упадёт с ошибкой обращения к методу.
Для ссылочных значений есть более короткий путь — получить метаданные прямо из ссылки: Ссылка.Метаданные().ПолноеИмя(). Метод Метаданные() доступен у всех ссылочных значений и у объектов данных, поэтому промежуточный поиск по типу не нужен.
- 1Проверьте, что значение не Неопределено и не NULL
- 2Получите тип: ТипЗнч(Значение)
- 3Найдите метаданные: Метаданные.НайтиПоТипу(ТипЗначения)
- 4Проверьте, что результат не Неопределено (для примитивных типов метаданных нет)
- 5Вызовите ОбъектМетаданных.ПолноеИмя() и используйте строку
- 6Для ссылок вместо шагов 2–4 можно сразу вызвать Ссылка.Метаданные().ПолноеИмя()
Полное имя по ссылке, объекту и строке: три сценария
По ссылке или объекту данных
Самый короткий и надёжный вариант для ссылочных значений — метод Метаданные():
ПолноеИмя = Ссылка.Метаданные().ПолноеИмя();
// "Документ.РеализацияТоваровУслуг"
Метод работает и для объектов (результат ПолучитьОбъект()), и для ссылок, и для значений перечислений. Для записей регистров метаданные получают через набор записей или менеджер регистра.
По строковому имени
Обратная задача — по строке «Справочник.Номенклатура» получить метаданные и тип — решается методом Метаданные.НайтиПоПолномуИмени():
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени("Справочник.Номенклатура");
Если ОбъектМетаданных <> Неопределено Тогда
ТипСсылки = Тип("СправочникСсылка." + ОбъектМетаданных.Имя);
КонецЕсли;
По типу без значения
Если значения нет, а есть только тип (например, из описания типов реквизита), Метаданные.НайтиПоТипу() работает точно так же — ему нужен именно объект типа, а не значение. Это удобно при обходе реквизитов метаданных и анализе состава типов.
Сравнение способов получения имени
Быстро и просто; подходит для сообщений и отладки. Не подходит для обращения к метаданным и построения запросов.
Короткий и надёжный вариант для ссылочных значений. Не работает для примитивных типов — у них нет метода Метаданные().
Универсален: работает с типом без значения. Требует проверки на Неопределено и чуть длиннее в записи.
Практические применения: где нужно полное имя
Наиболее частый сценарий — динамическое построение запроса. Текст запроса принимает полное имя таблицы, поэтому универсальные функции выборки строят его так: "ВЫБРАТЬ Ссылка ИЗ " + Ссылка.Метаданные().ПолноеИмя(). Это позволяет писать один код для любых справочников и документов.
Второй сценарий — сериализация и обмен. При выгрузке данных в универсальном формате полное имя метаданных сохраняют вместе со ссылкой, чтобы на стороне приёмника восстановить тип через Метаданные.НайтиПоПолномуИмени() и Тип(). Строковое представление типа для этого менее удобно: его приходится разбирать и сопоставлять с видами объектов вручную.
Третий сценарий — универсальные проверки и подписки на события. В обработчике, который получает источник произвольного типа, по полному имени определяют, какую ветку логики выполнять, или проверяют, входит ли тип источника в список обрабатываемых.
Если полное имя нужно часто (например, в цикле по тысячам ссылок), получите его один раз до цикла и сохраните в переменную. Вызов Метаданные() и НайтиПоТипу() — не бесплатная операция, и в массовых обработках её повторение заметно увеличивает время выполнения.
Ограничения и типичные ошибки
Главное ограничение уже упоминалось: примитивные типы не имеют метаданных. Попытка получить Метаданные.НайтиПоТипу(Тип("Число")) вернёт Неопределено, а обращение Значение.Метаданные() к числу или строке вызовет ошибку времени выполнения. В универсальном коде сначала проверяют, является ли значение ссылочным, например через ОбщегоНазначения.ЭтоСсылка() в типовых конфигурациях или через сравнение с шаблонами типов.
Вторая тонкость — различие между «СправочникСсылка.Номенклатура» и «Справочник.Номенклатура». Если строку первого вида передать в Метаданные.НайтиПоПолномуИмени(), поиск вернёт Неопределено: метод ожидает имя без суффикса «Ссылка»/«Объект». Преобразование между форматами делают заменой подстроки или через объект метаданных.
Третья ошибка — использование НайтиПоТипу() для типов, которые существуют только как типы платформы, а не как объекты конфигурации: «ТаблицаЗначений», «Запрос», «ОписаниеТипов» и подобные. Для них метаданных также нет.
Проверка результата и отладка
Проверить корректность полученного имени просто: передайте его обратно в Метаданные.НайтиПоПолномуИмени() — для валидного полного имени метод обязан вернуть тот же объект метаданных. Если вернулось Неопределено, значит, строка сформирована не в том формате или объект переименован.
При отладке удобно выводить обе формы рядом: строковое представление типа и полное имя метаданных. Совпадение «хвостов» (имени объекта) и различие префиксов наглядно показывает, какая из форм нужна в конкретном месте кода.
Как проверить результат
«Справочник.Номенклатура» — вид объекта и имя через точку, без суффиксов Ссылка/Объект
«СправочникСсылка.Номенклатура» — это строковое представление типа, а не полное имя метаданных
Метаданные.НайтиПоПолномуИмени(ПолноеИмя) возвращает объект метаданных
Возвращает Неопределено — имя сформировано неверно или объект переименован
Код проверяет результат НайтиПоТипу() на Неопределено и обрабатывает эту ветку
Ошибка «Метод объекта не обнаружен (ПолноеИмя)» на числах, строках, датах
Частые вопросы
Чем отличается ТипЗнч() от Метаданные().ПолноеИмя()?
ТипЗнч() возвращает объект типа платформы, а ПолноеИмя() — строковый идентификатор объекта конфигурации. Первое описывает тип значения вообще (включая примитивные), второе существует только для объектов, описанных в дереве конфигурации: справочников, документов, регистров и т.д.
Как получить полное имя для записи регистра сведений?
У отдельной записи регистра метода Метаданные() нет. Полное имя получают через менеджер регистра (например, РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей().Метаданные().ПолноеИмя()) или через Метаданные.НайтиПоТипу() по типу набора записей.
Можно ли получить тип по полному имени метаданных?
Да. Из полного имени извлекают вид объекта и имя, затем формируют строку вида «СправочникСсылка.Имя» или «ДокументОбъект.Имя» и передают её в функцию Тип(). Вид объекта сопоставляют с нужным суффиксом по таблице соответствия.
Почему НайтиПоПолномуИмени() возвращает Неопределено, хотя объект есть?
Чаще всего передана строка в формате представления типа («СправочникСсылка.Номенклатура») вместо формата метаданных («Справочник.Номенклатура»). Реже — лишние пробелы, неверный регистр не влияет, но лишние суффиксы и префиксы — да.
Как получить список полных имён всех документов конфигурации?
Пройдите циклом по коллекции Метаданные.Документы и для каждого элемента вызовите ПолноеИмя(). Аналогично работают коллекции Справочники, Перечисления, РегистрыСведений и другие корневые ветки дерева метаданных.
Работает ли ПолноеИмя() на веб-клиенте и в мобильной платформе?
Метод ПолноеИмя() и коллекция Метаданные доступны на сервере и толстом клиенте. На веб-клиенте и тонком клиенте доступ к метаданным ограничен — вычисляйте полное имя в серверной процедуре и передавайте на клиент готовую строку.
Что важно запомнить
Для ссылочных значений полное имя получают через Ссылка.Метаданные().ПолноеИмя(), универсальный вариант — Метаданные.НайтиПоТипу(ТипЗнч(Значение)) с обязательной проверкой на Неопределено. Строковое представление типа («СправочникСсылка.Номенклатура») и полное имя метаданных («Справочник.Номенклатура») — разные форматы, не взаимозаменяемые в НайтиПоПолномуИмени(). Примитивные типы метаданных не имеют.