Разработка и Конфигурация · 10 мин
Как получить вид объекта в 1С: практическое руководство
Способы определить вид объекта в 1С: функция ТипЗнч, работа с метаданными, XMLТип и проверка типа в запросах. Примеры кода, типичные ошибки и FAQ.
Задача определить вид объекта возникает в 1С постоянно: при отладке, в универсальных обработках, при проверке входных параметров процедур и при построении запросов. Под «видом объекта» обычно понимают либо его тип (например, «СправочникСсылка.Номенклатура»), либо конкретный вид прикладного объекта — имя справочника, документа или перечисления, заданное в конфигураторе.
Во встроенном языке 1С для этого есть несколько инструментов: функция ТипЗнч(), свойство Метаданные() у ссылок и объектов, функции XMLТипЗнч() и XMLТип(), а в запросах — оператор ССЫЛКА и функция ТИПЗНАЧЕНИЯ(). Каждый из них решает свою задачу, и выбор зависит от контекста: тонкий клиент или сервер, встроенный язык или запрос, нужно имя вида или сам тип.
Ниже разобраны все основные способы с примерами кода, ограничениями и типичными ошибками. Материал ориентирован на разработчиков и продвинутых пользователей, работающих с типовыми и самописными конфигурациями.
Как получить тип объекта функцией ТипЗнч()
Основной инструмент — функция ТипЗнч(<Значение>). Она принимает любое значение и возвращает объект типа «Тип», описывающий вид этого значения. Работает и на клиенте, и на сервере, доступна во всех современных версиях платформы.
ТекущийТип = ТипЗнч(ДокументСсылка);
Сообщить(ТекущийТип); // "Документ ссылка: Реализация товаров и услуг"
Если ТипЗнч(Параметр) = Тип("СправочникСсылка.Номенклатура") Тогда
// обработка ссылки на номенклатуру
КонецЕсли;
Функция Тип("...") создаёт значение типа по строковому имени, что позволяет сравнивать типы напрямую. Имя типа строится по шаблону: вид прикладного объекта + точка + имя объекта метаданных, например СправочникСсылка.Контрагенты или ДокументОбъект.ПоступлениеТоваровУслуг.
Важно понимать разницу: у ссылки и у объекта, полученного методом ПолучитьОбъект(), типы разные. Для одной и той же сущности это будут, например, СправочникСсылка.Номенклатура и СправочникОбъект.Номенклатура. Проверка типа, рассчитанная на ссылку, не сработает для объекта — это одна из самых частых причин ошибок в универсальных процедурах.
Как узнать имя вида объекта через метаданные
Когда нужно получить именно имя вида прикладного объекта — «Номенклатура», «РеализацияТоваровУслуг», «ФизическиеЛица» — удобнее обратиться к метаданным. У любой ссылки и объекта есть метод Метаданные(), возвращающий объект описания конфигурации.
Мета = Ссылка.Метаданные();
ИмяВида = Мета.Имя; // "Номенклатура"
Синоним = Мета.Синоним; // "Номенклатура" (представление)
ПолноеИмя = Мета.ПолноеИмя(); // "Справочник.Номенклатура"
Метод ПолноеИмя() особенно полезен, когда объект нужно однозначно идентифицировать: он возвращает строку вида «Справочник.Номенклатура» или «Документ.ЗаказПокупателя», которую затем можно использовать для обратного поиска через Метаданные.НайтиПоПолномуИмени() или для построения типа функцией Тип().
Обратный приём — определить, к какому классу метаданных относится объект, без сравнения строк:
Если Метаданные.Справочники.Содержит(Ссылка.Метаданные()) Тогда
// это справочник
ИначеЕсли Метаданные.Документы.Содержит(Ссылка.Метаданные()) Тогда
// это документ
КонецЕсли;
- 1Вызовите Ссылка.Метаданные() для получения описания объекта конфигурации
- 2Прочитайте свойство Имя — это имя вида, заданное в конфигураторе
- 3Вызовите ПолноеИмя(), если нужна строка вида «Справочник.Номенклатура»
- 4Проверьте принадлежность через Метаданные.Справочники.Содержит(), если важен класс объекта
- 5Сравните результат с ожидаемым значением и выведите его для контроля
Проверка типа составного поля и перечислений
Реквизиты составного типа (например, «Контрагент» в документе, который может быть справочником «Контрагенты» или «Организации») требуют проверки фактического типа хранимого значения. Здесь снова работает связка ТипЗнч() + Тип(), но проверять нужно значение реквизита, а не описание типа реквизита в метаданных.
Описание допустимых типов реквизита получают через Метаданные().Реквизиты.ИмяРеквизита.Тип — это объект «ОписаниеТипов». Метод Типы() возвращает массив всех допустимых типов, а СодержитТип() проверяет, входит ли конкретный тип в состав.
Для перечислений вид значения определяется так же через метаданные: ЗначениеПеречисления.Метаданные().Имя вернёт имя перечисления, а чтобы узнать имя конкретного значения, используют XMLСтрока(ЗначениеПеречисления) — она вернёт имя значения, заданное в конфигураторе.
ОписаниеТипа = Документ.Метаданные().Реквизиты.Контрагент.Тип;
Если ОписаниеТипа.СодержитТип(ТипЗнч(Документ.Контрагент)) Тогда
// тип значения допустим для реквизита
КонецЕсли;
Как определить вид объекта в запросе
В языке запросов функция ТипЗнч недоступна — вместо неё используются оператор ССЫЛКА и функция ТИПЗНАЧЕНИЯ(). Оператор ССЫЛКА проверяет принадлежность ссылки конкретной таблице, а ТИПЗНАЧЕНИЯ() возвращает тип значения поля.
ВЫБРАТЬ
ВЫБОР
КОГДА Реестр.Документ ССЫЛКА Документ.ПоступлениеТоваровУслуг
ТОГДА "Поступление"
КОГДА Реестр.Документ ССЫЛКА Документ.РеализацияТоваровУслуг
ТОГДА "Реализация"
ИНАЧЕ "Прочее"
КОНЕЦ КАК ВидДокумента
ИЗ РегистрСведений.РеестрДокументов КАК Реестр
Функция ТИПЗНАЧЕНИЯ(Поле) чаще применяется в условиях отбора и в СКД, где нужно сгруппировать или отфильтровать записи по типу. Учтите, что сравнение типов в запросе работает медленнее прямого обращения к конкретной таблице, поэтому при больших объёмах данных предпочтительнее объединение запросов к конкретным таблицам.
Способы определения вида объекта
Универсально, работает везде во встроенном языке. Ограничение: требует точного строкового имени типа, ошибка в строке вызовет исключение.
Возвращает имя вида без риска опечатки в сравнении. Ограничение: недоступно для примитивных типов (число, строка).
Единственный способ проверить вид внутри запроса. Ограничение: работает только со ссылочными типами.
Нужен при обмене и сериализации, когда тип определяется по XML-представлению. Для обычной логики избыточен.
XML-типы и определение вида при обмене данными
При обмене данными (планы обмена, веб-сервисы, XDTO-пакеты) вид объекта часто определяют через XML-типы. Функция XMLТипЗнч(Значение) возвращает структуру с именем типа и URI пространства имён, а XMLТип(Тип) выполняет обратное преобразование.
XMLОписание = XMLТипЗнч(Ссылка);
// XMLОписание.ИмяТипа = "CatalogRef.Номенклатура"
// XMLОписание.URIПространстваИмен = "http://v8.1c.ru/8.1/data/enterprise/current-config"
Этот способ незаменим, когда тип приходит извне в виде строки XML-представления и его нужно сопоставить с типом текущей конфигурации. Для повседневных задач внутри одной базы он избыточен — используйте ТипЗнч() и метаданные.
Типичные ошибки и как их избежать
Первая распространённая ошибка — сравнение типа со строкой: ТипЗнч(Объект) = "СправочникСсылка.Номенклатура". Такое сравнение всегда ложно, потому что слева объект типа «Тип», а справа строка. Правильно — сравнивать с Тип("...").
Вторая ошибка — смешение ссылки и объекта. Если процедура получает объект через ПолучитьОбъект(), а проверка написана на ссылочный тип, условие не выполнится. Универсальное решение — проверять метаданные: Метаданные.Справочники.Номенклатура = Значение.Метаданные() работает и для ссылки, и для объекта.
Третья ошибка — обращение к Метаданные() у примитивных значений. У числа, строки или даты этого метода нет, и попытка вызова завершится ошибкой. Перед обращением проверяйте, что значение ссылочного типа, например через XMLТипЗнч() или ветвление по ТипЗнч().
Как проверить результат и границы самостоятельной работы
Проверить корректность определения вида проще всего в отладчике: установите точку останова и посмотрите значение ТипЗнч(Переменная) в табло или выведите Переменная.Метаданные().ПолноеИмя() через Сообщить(). Для запросов удобна консоль запросов — она показывает типы полей результата.
Безопасная граница самостоятельной работы — чтение типов и метаданных: эти операции ничего не изменяют в базе. Риск появляется, когда по результату определения вида выполняется запись или удаление объектов. Такие обработки сначала тестируйте на копии базы и в режиме без записи (вывод списка найденных объектов вместо обработки).
Что важно запомнить
Тип объекта получают через ТипЗнч(), имя вида — через Метаданные().Имя и ПолноеИмя(), в запросах — через ССЫЛКА и ТИПЗНАЧЕНИЯ. Сравнивайте типы через Тип(), а принадлежность к классу — через коллекции метаданных.
Частые вопросы
Как получить имя вида документа в виде строки?
Вызовите ДокументСсылка.Метаданные().Имя — вернётся имя, заданное в конфигураторе, например «РеализацияТоваровУслуг». Если нужно представление для пользователя, используйте свойство Синоним или строковое представление ссылки.
Чем отличается ТипЗнч от Тип?
ТипЗнч(Значение) возвращает тип существующего значения, а Тип("ИмяТипа") создаёт объект типа по строковому имени. Первую используют для анализа данных, вторую — для сравнения и проверок.
Как проверить, является ли значение ссылкой?
Надёжный способ — проверить через Метаданные: попытаться получить Значение.Метаданные() внутри Попытка...Исключение или сравнить тип с известными ссылочными. В типовых конфигурациях часто есть общая функция вида «ЭтоСсылка» в общем модуле.
Можно ли определить вид объекта в СКД?
Да. В выражениях СКД доступна функция ТипЗначения() языка запросов, а в вычисляемых полях и отборах — оператор ССЫЛКА. Для вывода имени вида обычно строят ВЫБОР с перечислением нужных таблиц.
Почему ТипЗнч возвращает «Неопределено» для пустого реквизита?
Если реквизит не заполнен, его значение — Неопределено или пустая ссылка. Тип значения Неопределено — это «Неопределено», а не ожидаемый ссылочный тип. Перед анализом проверяйте заполненность через ЗначениеЗаполнено().
Как получить список всех видов документов конфигурации?
Переберите коллекцию Метаданные.Документы в цикле — у каждого элемента доступны свойства Имя и Синоним. Аналогично работают коллекции Справочники, Перечисления, ПланыСчетов и другие.