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

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

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

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

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

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

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

Как получить тип значения функцией ТипЗнч

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

Пример базового использования:

Переменная = 42;

ТипПеременной = ТипЗнч(Переменная);

Сообщить(ТипПеременной); // выведет: Число

Переменная = "Текст";

Сообщить(ТипЗнч(Переменная)); // выведет: Строка

Функция работает с любыми значениями: примитивными типами (Число, Строка, Дата, Булево, Неопределено, Null), ссылками на объекты базы данных, коллекциями (Массив, Структура, ТаблицаЗначений) и объектами метаданных. Важно понимать: ТипЗнч возвращает тип значения, которое лежит в переменной прямо сейчас, а не тип, задуманный разработчиком.

Как проверить переменную на конкретный тип

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

Типовая конструкция проверки:

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

Сумма = Сумма + Параметр;

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

Сообщить("Передана строка: " + Параметр);

Иначе

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

КонецЕсли;

Для ссылочных типов имя строится по шаблону ВидОбъекта.ИмяОбъекта: СправочникСсылка.Номенклатура, ДокументСсылка.РеализацияТоваровУслуг, ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения. Если в имени допущена ошибка, функция Тип() вызовет исключение в момент выполнения, поэтому имя лучше перепроверять по конфигуратору.

Проверка «это вообще ссылка?»

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

bsl
Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
    Сообщить("Это ссылка на номенклатуру");
ИначеЕсли Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда
    Сообщить("Это ссылка на другой справочник");
Иначе
    Сообщить("Примитивный тип: " + ТипЗнч(Значение));
КонецЕсли;

Как посмотреть тип переменной в отладчике

Во время отладки тип виден без написания кода. Достаточно установить точку останова, запустить отладку и навести курсор на переменную или добавить её в табло (Ctrl+Shift+W). В табло рядом со значением отображается и тип — например, «СправочникСсылка.Номенклатура» или «Строка(50)».

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

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

Порядок действий в отладчике
  1. 1
    Установите точку останова на строке, где переменная уже заполнена
  2. 2
    Запустите отладку (F5) и дождитесь остановки
  3. 3
    Добавьте переменную в табло: правый клик — Вычислить выражение или Ctrl+Shift+W
  4. 4
    Посмотрите колонку с типом рядом со значением
  5. 5
    Для проверки введите в табло выражение ТипЗнч(Переменная)

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

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

МетаданныеЗначения = Значение.Метаданные();

Если Метаданные.Справочники.Содержит(МетаданныеЗначения) Тогда

Сообщить("Это справочник: " + МетаданныеЗначения.Имя);

КонецЕсли;

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

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

Если ОписаниеТиповРеквизита.СодержитТип(ТипЗнч(ПереданноеЗначение)) Тогда

// значение допустимо для этого реквизита

КонецЕсли;

Такой подход надёжнее жёсткого перечисления типов в коде: при добавлении нового типа в состав реквизита проверка продолжит работать без изменений.

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

ТипЗнч + Тип

Подходит для проверки конкретного типа в коде. Ограничение: имя типа нужно знать заранее и писать без ошибок.

Отладчик и табло

Лучший вариант для разового анализа. Не подходит для логики, которая должна работать в коде.

Метаданные()

Подходит для ссылочных значений и групповых проверок. Не работает с примитивными типами — у них нет метаданных.

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

Подходит для проверки допустимости значения в составном типе. Требует получить само описание типов из метаданных или создать вручную.

Особенности работы с составными типами и Неопределено

Реквизиты составного типа могут хранить значения разных типов, и ТипЗнч всегда вернёт один конкретный тип текущего значения, а не весь состав. Поэтому логику «если контрагент — это организация, то…» пишут через сравнение с конкретным ссылочным типом, а не пытаются получить «список типов переменной».

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

Для ссылок дополнительно полезна проверка ЗначениеЗаполнено(): пустая ссылка имеет корректный ссылочный тип, но не указывает ни на один объект базы. Сравнение типов при этом пройдёт успешно, а дальнейшая работа с данными объекта даст пустые значения.

Типичные ошибки
01
Сравнение ТипЗнч(Зн) со строкой "Число" вместо Тип("Число") — условие никогда не выполняется
02
Опечатка в имени типа внутри Тип() — приводит к исключению в момент выполнения, а не на этапе проверки модуля
03
Обращение к методу Метаданные() у числа или строки — ошибка, у примитивных типов метаданных нет
04
Проверка только типа без проверки заполненности — пустая ссылка проходит проверку типа, но данные объекта недоступны
05
Игнорирование Null из запросов — значение NULL результата запроса ломает последующие сравнения и вычисления

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

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

ВЫБОР

КОГДА Регистр.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг

ТОГДА "Реализация"

КОГДА ТИПЗНАЧЕНИЯ(Регистр.Регистратор) = ТИП(Документ.ВозвратТоваровОтКлиента)

ТОГДА "Возврат"

ИНАЧЕ "Прочее"

КОНЕЦ

Для приведения составного поля к одному типу используют ВЫРАЗИТЬ(Поле КАК Документ.РеализацияТоваровУслуг) — значения других типов станут NULL. Это часто нужно перед соединением таблиц по составному полю.

Частые вопросы

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

ТипЗнч(Значение) возвращает тип уже существующего значения, а Тип("ИмяТипа") создаёт объект типа по строковому имени. Первая функция отвечает на вопрос «что лежит в переменной», вторая нужна как эталон для сравнения.

Как узнать тип в виде строки для сообщения пользователю?

Объект типа автоматически преобразуется в строку при конкатенации: Сообщить("Тип: " + ТипЗнч(Значение)). Для ссылок дополнительно можно вывести полное имя через Значение.Метаданные().ПолноеИмя().

Почему ТипЗнч возвращает Неопределено, хотя переменной присваивали значение?

Чаще всего присваивание находится в ветке условия, которая не выполнилась, либо функция не вернула значение через Возврат. Проверьте в отладчике, проходила ли строка присваивания до точки проверки типа.

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

Сравнением с типом: ТипЗнч(Зн) = Тип("ТаблицаЗначений"). Аналогично проверяются Массив, Структура, Соответствие, СписокЗначений и другие коллекции.

Работает ли проверка типа для значения NULL из запроса?

Да, ТипЗнч вернёт тип Null. Но сравнение NULL с чем-либо в самом запросе даёт неопределённый результат, поэтому в запросах используйте ЕСТЬ NULL, а в коде — явную проверку Значение = NULL.

Итог

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

Основная пара для определения типа — ТипЗнч(Значение) для получения типа и Тип("ИмяТипа") для сравнения. Для разового анализа используйте отладчик и табло, для ссылочных групп — метаданные, для составных типов — ОписаниеТипов.СодержитТип. Перед работой со значением проверяйте его на Неопределено, Null и заполненность ссылки.