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

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

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

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

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

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

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

Функция ТипЗнч(): основной способ узнать тип значения

Функция ТипЗнч(<Значение>) принимает любое значение и возвращает объект типа «Тип», описывающий его тип. Это работает для примитивов (Строка, Число, Дата, Булево), ссылок на объекты базы, структур, массивов и специальных значений вроде Неопределено и NULL.

Перем = 42;

Т = ТипЗнч(Перем); // Тип "Число"

Перем = "Текст";

Т = ТипЗнч(Перем); // Тип "Строка"

Док = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000001", ТекущаяДатаСеанса());

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

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

bsl
ТекущийТип = ТипЗнч(Значение);
Сообщить("Тип значения: " + Строка(ТекущийТип));
Если ТекущийТип = Тип("Число") Тогда
    Сообщить("Это число");
КонецЕсли;

Функция Тип(): получение типа по имени для сравнения

Функция Тип(<ИмяТипа>) создаёт объект типа по строковому имени. Сама по себе она не анализирует переменную — её задача дать эталон, с которым сравнивают результат ТипЗнч(). Имя для ссылочных типов строится по шаблону: вид объекта, точка, имя объекта метаданных, например «СправочникСсылка.Контрагенты» или «ДокументСсылка.ПоступлениеТоваровУслуг».

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

// работаем как со ссылкой на номенклатуру

ИначеЕсли ТипЗнч(Параметр) = Тип("Строка") Тогда

// обрабатываем строку

Иначе

ВызватьИсключение "Недопустимый тип параметра";

КонецЕсли;

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

Как узнать тип без изменения кода: отладчик

Когда нужно просто посмотреть, что лежит в переменной в конкретный момент, править код не обязательно. Поставьте точку останова на нужной строке, запустите отладку и используйте табло (Ctrl+Alt+W) или окно «Вычислить выражение» (Shift+F9). Введите имя переменной — среда покажет и значение, и его тип в отдельной колонке.

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

Проверка типа в отладчике
  1. 1
    Установите точку останова после присвоения значения переменной
  2. 2
    Запустите сеанс в режиме отладки и дойдите до точки
  3. 3
    Откройте табло (Ctrl+Alt+W) и добавьте имя переменной
  4. 4
    Посмотрите колонку «Тип» — там отображается точный тип значения
  5. 5
    Для уточнения вычислите выражение ТипЗнч(Переменная) через Shift+F9

Сравнение типов: равенство, ветвление и составные типы

Объекты типа «Тип» корректно сравниваются оператором равенства — это штатный способ ветвления. Для множественных проверок удобнее конструкция Если/ИначеЕсли, а в новых версиях платформы — оператор выбора по типу там, где он поддерживается.

Составные типы и перебор допустимых вариантов

Реквизит с составным типом (например, «СправочникСсылка.Контрагенты или СправочникСсылка.Организации») в каждом конкретном значении хранит только один тип. Поэтому ТипЗнч() всегда вернёт один конкретный тип, а проверку строят на перечислении вариантов:

ДопустимыеТипы = Новый Массив;

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

ДопустимыеТипы.Добавить(Тип("СправочникСсылка.Организации"));

Если ДопустимыеТипы.Найти(ТипЗнч(Владелец)) = Неопределено Тогда

ВызватьИсключение "Недопустимый тип владельца";

КонецЕсли;

Проверка примитивов

Для примитивных типов имена в функции Тип() совпадают с названиями: «Число», «Строка», «Дата», «Булево». Помните, что «1» (строка) и 1 (число) — разные типы, и сравнение ТипЗнч("1") = Тип("Число") даст Ложь. Если входные данные приходят из внешних источников, сначала определяйте тип, потом преобразовывайте значение.

Типичные ошибки
01
Сравнение ТипЗнч(Значение) со строкой: ТипЗнч(Значение) = "Число" всегда ложно, сравнивать нужно с Тип("Число")
02
Проверка ссылки по имени вида без учёта типа: строка "ДокументСсылка.Реализация" вместо полного имени объекта метаданных
03
Игнорирование Неопределено: у пустого параметра тип «Неопределено», и обращение к его реквизитам вызывает ошибку
04
Опечатка в имени типа внутри Тип(): исключение возникает только при выполнении ветки и легко проскакивает тестирование
05
Сравнение числа и строки с числом как одного типа при разборе данных из файлов и веб-сервисов

Особые значения: Неопределено, NULL и пустые ссылки

Значение Неопределено имеет собственный тип «Неопределено» — его корректно проверять и через ТипЗнч(), и через сравнение Значение = Неопределено. NULL обычно приходит из запросов при левых соединениях; его тип — «NULL», и передача такого значения в функции без проверки часто приводит к ошибкам.

Отдельный случай — пустая ссылка. У неё вполне определённый тип (например, «СправочникСсылка.Номенклатура»), поэтому проверка типа не заменяет проверку на пустоту: используйте ЗначениеЗаполнено(Ссылка) или сравнение с Справочники.Номенклатура.ПустаяСсылка(). Полноценная валидация обычно включает обе проверки: тип соответствует ожидаемому и ссылка не пустая.

Альтернативные приёмы: метаданные и описание типов

Определение типа ссылки через метаданные

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

Описание типов для проверки допустимости

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

Способы определения типа

ТипЗнч() + Тип()

Универсальный способ для проверок в коде; требует точных имён типов

Отладчик (табло, вычисление выражения)

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

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

Подходит для универсальных механизмов; применимо только к типам, описанным в метаданных

ОписаниеТипов.СодержитТип()

Удобно для проверки по динамическому списку типов; требует предварительного построения описания

Как проверить, что логика работает правильно

После внедрения проверок типа убедитесь, что каждая ветка реально достижима и ведёт себя как задумано. Минимальный набор — тестовые вызовы с каждым поддерживаемым типом, с Неопределено и с заведомо «чужим» типом, который должен отклоняться.

Признак корректной работы: значения ожидаемых типов проходят в свои ветки, неподдерживаемые — вызывают понятное сообщение об ошибке, а Неопределено и NULL обрабатываются до обращения к реквизитам. Если ветка отклонения срабатывает на корректных данных, чаще всего причина в опечатке в имени типа или в сравнении типа со строкой.

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

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

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

ТипЗнч(Значение) сравнивается с Тип("ИмяТипа")

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

Тип сравнивается со строкой в кавычках — условие всегда ложно

Обработка пустых значений
Норма

Неопределено и NULL проверяются до обращения к свойствам

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

Ошибка «Поле объекта не обнаружено» на пустых параметрах

Имена ссылочных типов
Норма

Имя совпадает с объектом метаданных, включая вид

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

Исключение «Недопустимое значение» при вызове Тип()

Пустые ссылки
Норма

После проверки типа есть проверка ЗначениеЗаполнено()

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

Пустая ссылка проходит как корректное значение

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

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

ТипЗнч() анализирует переданное значение и возвращает его тип. Тип() не анализирует ничего — она создаёт объект типа по строковому имени, чтобы было с чем сравнивать. В связке: ТипЗнч(Значение) = Тип("Строка").

Как вывести тип переменной в сообщение пользователю?

Преобразуйте результат ТипЗнч() в строку: Сообщить("Тип: " + Строка(ТипЗнч(Переменная))). Для ссылок будет выведено имя вида «ДокументСсылка.РеализацияТоваровУслуг», для примитивов — «Строка», «Число» и т.п.

Можно ли проверить, что значение — любая ссылка, без перечисления видов?

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

Почему сравнение ТипЗнч(Значение) = "Число" не работает?

Потому что ТипЗнч() возвращает объект типа «Тип», а не строку. Объект типа никогда не равен строке, поэтому условие всегда ложно. Правильно: ТипЗнч(Значение) = Тип("Число").

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

В языке запросов есть оператор ВЫРАЗИТЬ и функция ТИПЗНАЧЕНИЯ(), а проверка выполняется через конструкцию ВЫБОР КОГДА Ссылка ССЫЛКА Документ.РеализацияТоваровУслуг ТОГДА ... . Ключевое слово ССЫЛКА — основной способ проверки типа ссылки прямо в тексте запроса.

Что вернёт ТипЗнч() для результата пустого запроса?

Если выборка пуста, вы не получите значения вообще — проверяйте Выборка.Следующий() или Результат.Пустой(). Если поле в строке результата содержит NULL из-за левого соединения, ТипЗнч() вернёт тип «NULL», и такое значение нужно обработать отдельно.

Итог

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

Тип переменной в 1С определяют функцией ТипЗнч(), а сравнивают с эталоном, созданным через Тип("ИмяТипа"). Для быстрого просмотра без изменения кода используйте табло отладчика. Проверку типа дополняйте проверками на Неопределено, NULL и пустые ссылки — сам по себе тип не гарантирует заполненность значения.