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

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

Как узнать тип объекта в 1С

Как определить тип объекта в 1С: функция ТипЗнч, метаданные, проверка типа документа, справочника и значения в запросе. Примеры кода и типичные ошибки.

Во встроенном языке 1С тип объекта определяется через функцию ТипЗнч() и сравнение с конструкцией Тип(). Это базовый приём, который понадобится при написании обработок, проверке входящих параметров процедур и отладке кода, когда заранее неизвестно, какое значение пришло в переменную — ссылка на документ, строка, число или структура.

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

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

Как определить тип через функцию ТипЗнч()

Функция ТипЗнч() возвращает тип переданного значения. Сам по себе результат — объект типа «Тип», который можно сравнить с другим типом или вывести в сообщение для отладки. Это самый простой и быстрый способ, доступный во всех контекстах: на клиенте, на сервере, в тонком и веб-клиенте.

Значение = СсылкаНаДокумент;

ТипЗначения = ТипЗнч(Значение);

Если ТипЗначения = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда

Сообщить("Это ссылка на реализацию");

КонецЕсли;

Обратите внимание на различие ссылок и объектов. ДокументСсылка и ДокументОбъект — это разные типы. Если в переменной лежит объект документа (после ПолучитьОбъект()), сравнение с типом ссылки вернёт Ложь, и проверка не сработает. Это одна из самых частых причин «непонятного» поведения кода.

Для примитивных типов используются имена без указания конфигурации: Тип("Строка"), Тип("Число"), Тип("Дата"), Тип("Булево"), Тип("Неопределено"). Для коллекций — Тип("Массив"), Тип("Структура"), Тип("Соответствие"), Тип("ТаблицаЗначений").

Типичные ошибки
01
Сравнение объекта с типом ссылки: ДокументОбъект не равен ДокументСсылка, проверка возвращает Ложь
02
Опечатка в имени типа в кавычках: Тип("ДокументСсылка.Реализация") с несуществующим именем вызовет исключение в момент выполнения
03
Проверка ТипЗнч(Значение) = Неопределено вместо сравнения самого значения: тип пустого значения — это Неопределено, а не тип Неопределено

Как узнать вид объекта через метаданные

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

МетаданныеОбъекта = Значение.Метаданные();

ИмяВида = МетаданныеОбъекта.Имя; // например, "РеализацияТоваровУслуг"

ПолноеИмя = МетаданныеОбъекта.ПолноеИмя(); // "Документ.РеализацияТоваровУслуг"

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

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

bsl
Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Значение)) Тогда
    ИмяВида = Значение.Метаданные().Имя;
КонецЕсли;

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

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

ВЫБРАТЬ

Взаиморасчеты.Контрагент

ИЗ

РегистрНакопления.Взаиморасчеты КАК Взаиморасчеты

ГДЕ

ТИПЗНАЧЕНИЯ(Взаиморасчеты.Контрагент) = ТИП(Справочник.Контрагенты)

Для полей составного типа рекомендуется также применять оператор ВЫРАЗИТЬ() — он приводит значение к нужному типу и позволяет безопасно обращаться к реквизитам через точку. Без приведения обращение к реквизиту составного поля может дать NULL или ошибку при построении запроса.

Учтите ограничение: проверка типа в условии запроса не всегда эффективна с точки зрения производительности на больших таблицах. Если выборка по типу выполняется часто и по миллионам записей, рассмотрите индексацию или пересмотр структуры хранения данных.

Как определить тип значения в отладчике и без программирования

Не всегда нужно писать код. В режиме отладки тип значения виден прямо в табло или в окне «Вычислить выражение»: рядом со значением отображается его тип, например «ДокументСсылка.ЗаказКлиента». Это самый быстрый способ понять, что реально пришло в переменную в конкретной точке выполнения.

Для интерактивной проверки в пользовательском режиме можно использовать внешние обработки «консоль кода» или «консоль запросов», которые позволяют выполнить произвольное выражение и посмотреть тип результата. Такие инструменты полезны администраторам и консультантам, которые не пишут конфигурацию, но анализируют данные.

Ещё один косвенный признак — представление значения. Ссылка на документ обычно отображается с номером и датой, справочник — наименованием, перечисление — значением без дополнительных атрибутов. Но полагаться только на представление нельзя: строка может выглядеть как номер документа, а быть обычным текстом.

Маршрут решения

Как выбрать способ проверки

Нужна проверка в коде модуляИспользуйте ТипЗнч(Значение) = Тип("ИмяТипа")
Нужно узнать конкретный вид ссылочного объектаВызовите Значение.Метаданные().Имя или ПолноеИмя()
Фильтрация идёт в запросе по составному полюПрименяйте ТИПЗНАЧЕНИЯ(Поле) = ТИП(ВидОбъекта) и ВЫРАЗИТЬ
Нужно быстро посмотреть тип при отладкеОткройте табло или «Вычислить выражение» — тип показывается рядом со значением

Как работать с составными типами и значением Неопределено

Реквизиты в 1С часто имеют составной тип: один и тот же параметр может быть справочником, документом или строкой. Перед обращением к свойствам такого значения обязательно проверяйте тип, иначе код упадёт с ошибкой при первом же «не том» значении.

Отдельный случай — значения Неопределено и NULL. Неопределено — это значение встроенного языка, NULL — результат левого соединения в запросе. Оба не имеют метаданных, и вызов у них любых методов приведёт к ошибке. Проверка выполняется прямым сравнением: Если Значение = Неопределено Тогда, а для NULL в результате запроса — через ЕСТЬNULL() в тексте запроса или проверку после обхода выборки.

Пустая ссылка — ещё одна ловушка. Пустая ссылка на справочник имеет вполне определённый тип СправочникСсылка.Номенклатура, но не содержит данных. Проверяйте её через Значение.Пустая() или ЗначениеЗаполнено(Значение), прежде чем обращаться к реквизитам.

Как проверить результат и какие ограничения учитывать

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

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

При доработке типовой конфигурации помните об обновлениях: если вы вставляете проверку типа в переопределяемый модуль, убедитесь, что при обновлении конфигурации логика не потеряется. Используйте механизм расширений там, где это возможно, — он безопаснее прямого изменения модулей.

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

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

Проверка на ожидаемый тип
Норма

Условие срабатывает для нужного вида объекта

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

Условие не срабатывает — возможно, сравнивается объект со ссылкой

Обработка Неопределено и NULL
Норма

Код не падает на пустых значениях

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

Ошибка «Значение не является значением объектного типа»

Работа на тонком клиенте
Норма

Проверки выполняются без ошибок недоступности типа

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

Ошибка о недопустимом типе в данном контексте

Часто задаваемые вопросы

Чем отличается ТипЗнч() от Тип()?

ТипЗнч() получает тип конкретного значения, переданного в аргументе. Тип("ИмяТипа") создаёт описание типа по его строковому имени. Обычно они используются вместе: результат ТипЗнч сравнивается с результатом Тип для проверки соответствия.

Почему сравнение типа возвращает Ложь, хотя объект нужного вида?

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

Как узнать тип объекта без программирования?

В режиме отладки тип показывается рядом со значением в табло и в окне «Вычислить выражение». Также можно воспользоваться внешними консолями кода или запросов, которые выводят тип результата выражения.

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

Используйте конструкцию Метаданные.Документы.Содержит(Значение.Метаданные()) — она вернёт Истина для ссылки на любой документ. В типовых конфигурациях есть также функции общих модулей, например проверка «это ссылка».

Что делать, если Тип("ИмяТипа") вызывает ошибку?

Ошибка означает, что типа с таким именем в конфигурации нет — например, документ переименовали или удалели. Проверьте точное имя объекта в конфигураторе и учтите, что имя чувствительно к написанию, хотя регистр букв роли не играет.

Можно ли определить тип значения в запросе без ТИПЗНАЧЕНИЯ?

Да, через сравнение поля со ссылкой конкретного вида или через ВЫРАЗИТЬ с последующей проверкой на NULL. Но ТИПЗНАЧЕНИЯ остаётся наиболее читаемым и универсальным способом для составных полей.

Итог

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

Тип значения в 1С определяется функцией ТипЗнч() и сравнением с Тип(), вид ссылочного объекта — через Метаданные(), в запросе — через ТИПЗНАЧЕНИЯ(). Всегда различайте ссылку и объект, проверяйте значения на Неопределено и пустоту перед обращением к свойствам.