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

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

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

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

Вопрос «как узнать тип» в 1С возникает в нескольких разных ситуациях: нужно определить тип значения переменной в коде, проверить тип реквизита объекта в конфигураторе, выяснить тип поля в запросе или понять, что за объект перед вами в пользовательском режиме. Для каждой задачи есть свой инструмент, и подмена одного другим — частая причина ошибок в коде.

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

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

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

Значение = Справочники.Номенклатура.НайтиПоКоду("000001");

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

Сообщить(ТипЗначения); // СправочникСсылка.Номенклатура

Обратите внимание: ТипЗначения и ТипЗнч — это одна и та же функция, второе имя — просто общепринятое сокращение. Результат можно сравнивать с конкретным типом через функцию Тип("ИмяТипа"), которая принимает строковое имя типа.

bsl
Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
	// обработка ссылки на номенклатуру
КонецЕсли;

Как проверить тип без создания объекта типа

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

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

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

Если Метаданные.Документы.Содержит(МетаОбъект) Тогда

// это ссылка на документ

КонецЕсли;

Как узнать тип реквизита в конфигураторе

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

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

Программно тип реквизита получают через метаданные:

Реквизит = Метаданные.Документы.РеализацияТоваровУслуг.Реквизиты.Контрагент;

Для Каждого Тип Из Реквизит.Тип.Типы() Цикл

Сообщить(Тип); // СправочникСсылка.Контрагенты

КонецЦикла;

Порядок действий в конфигураторе
  1. 1
    Откройте конфигуратор и найдите объект в дереве конфигурации
  2. 2
    Раскройте ветку «Реквизиты» и выделите нужный реквизит
  3. 3
    Откройте палитру свойств и посмотрите поле «Тип»
  4. 4
    Для составного типа нажмите кнопку выбора и изучите список типов
  5. 5
    Проверьте дополнительные квалификаторы: длину, точность, неограниченную длину

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

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

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

ТИПЗНАЧЕНИЯ(Взаиморасчеты.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)

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

Типичные ошибки
01
Сравнение типа со строкой вместо объекта типа — проверка ломается при переименовании объекта конфигурации
02
Использование ТИПЗНАЧЕНИЯ без учёта NULL: для NULL-значений тип не определён, и сравнение не сработает
03
Ожидание, что ТипЗнч вернёт имя типа строкой: функция возвращает объект «Тип», а не строку
04
Проверка только одного типа у составного реквизита — остальные типы проходят мимо обработки

Как узнать тип объекта в пользовательском режиме

Пользователю без доступа к конфигуратору тип объекта обычно очевиден из интерфейса: заголовок формы, панель навигации и имя раздела показывают, с чем открыт объект. Если нужно точное техническое имя (например, для сообщения разработчику), помогает команда «Ещё → Вывести список» в форме списка или открытие объекта через «Все функции», где объекты сгруппированы по видам.

В тонком клиенте с включённым режимом технического специалиста доступна информация о форме: сочетание клавиш и пункт меню зависят от версии платформы, но обычно сведения об объекте и форме доступны через «Сервис → Параметры» и служебные команды. Точное техническое имя объекта надёжнее всего уточнить у администратора или в конфигураторе.

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

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

Нужно проверить тип в коде модуляИспользуйте ТипЗнч(Значение) и сравнение с Тип("ИмяТипа")
Нужно узнать тип реквизита при настройке конфигурацииОткройте палитру свойств реквизита в конфигураторе
Нужно отфильтровать записи по типу в запросеПримените ТИПЗНАЧЕНИЯ(Поле) = ТИП(ВидОбъекта)
Нужно определить, документ это или справочникПроверьте принадлежность метаданных через Метаданные.Документы.Содержит()

Особые случаи: составные типы, NULL и примитивные типы

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

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

Примитивные типы — «Строка», «Число», «Дата», «Булево» — проверяются так же, через Тип("Строка") и аналогичные имена. Для дат и чисел уточняющие квалификаторы (точность, части даты) видны только в описании типов реквизита, а не у самого значения.

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

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

Сравнение типов в коде
Норма

Условие срабатывает на тестовом значении ожидаемого типа

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

Условие всегда ложно — проверьте, не сравниваете ли вы тип со строкой

Тип реквизита в конфигураторе
Норма

Поле «Тип» показывает ожидаемый тип или список типов

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

Тип составной, а вы учли только один вариант

Фильтр по типу в запросе
Норма

В выборку попадают только записи нужного вида документа

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

Записи с NULL в поле потеряны или попали лишние типы

FAQ: частые вопросы о типах в 1С

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

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

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

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

Почему ТипЗнч() возвращает «Неопределено»?

Это значит, что переменной не присвоено значение или функция вернула Неопределено. Проверьте инициализацию переменной и результат вызова, который её заполнял, прежде чем анализировать тип.

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

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

Можно ли узнать тип данных без запуска кода?

Да, для реквизитов объектов достаточно конфигуратора: палитра свойств показывает тип, квалификаторы и состав составного типа. Тип конкретного значения переменной без выполнения кода определить нельзя — он известен только в момент выполнения.

Как узнать тип значения в отладчике?

Остановитесь на точке останова, выделите переменную и нажмите «Вычислить выражение» (Shift+F9) либо посмотрите табло. В окне вычисления рядом со значением отображается его тип, а выражение ТипЗнч(Переменная) покажет тип явно.

Итог

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

Тип значения в коде определяют через ТипЗнч() с сравнением через Тип(), тип реквизита — в палитре свойств конфигуратора, в запросе — через ТИПЗНАЧЕНИЯ(). Учитывайте составные типы, NULL и Неопределено: они требуют отдельной обработки и часто становятся причиной ошибок.