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

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

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

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

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

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

Важно понимать, что тип в 1С — это объект специального вида «ОписаниеТипов» / «Тип», а не строка. Поэтому проверка вида Если Переменная = "СправочникСсылка" не сработает: сравнивать нужно именно типы, полученные функциями платформы. Ниже разобраны рабочие способы проверки, их ограничения и типичные ошибки.

Функция ТипЗнч(): как узнать тип конкретного значения

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

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

Значение = 123;

ТекущийТип = ТипЗнч(Значение);

Сообщить(ТекущийТип); // выведет: Число

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

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

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

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

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

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

// работаем как со строкой

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

// работаем как с числом

КонецЕсли;

Сравнение типов: полный пример ветвления по типу параметра

Типичная задача — универсальная процедура, которая принимает параметр и ведёт себя по-разному в зависимости от того, что передали. Правильный шаблон выглядит так:

Процедура ОбработатьЗначение(ВходноеЗначение) Экспорт

ТекущийТип = ТипЗнч(ВходноеЗначение);

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

Сообщить("Это номенклатура: " + ВходноеЗначение);

ИначеЕсли ТекущийТип = Тип("ДокументСсылка.ЗаказКлиента") Тогда

Сообщить("Это заказ клиента");

ИначеЕсли ТекущийТип = Тип("Строка") Тогда

Сообщить("Передана строка длиной " + СтрДлина(ВходноеЗначение));

ИначеЕсли ВходноеЗначение = Неопределено Тогда

Сообщить("Значение не задано");

Иначе

Сообщить("Неожиданный тип: " + ТекущийТип);

КонецЕсли;

КонецПроцедуры

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

Порядок действий при проверке типа
  1. 1
    Получите тип значения: ТекущийТип = ТипЗнч(Переменная)
  2. 2
    Сформируйте эталон: Тип("СправочникСсылка.Номенклатура") или Тип("Строка")
  3. 3
    Сравните типы оператором = в конструкции Если...Тогда
  4. 4
    Добавьте ветку Иначе с выводом фактического типа для диагностики
  5. 5
    Проверьте код на значениях Неопределено и Null, если они возможны

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

Часто нужно проверить не конкретный тип, а целый класс: «это ссылка на объект базы или примитивное значение?». Перечислять все возможные ссылочные типы неудобно, поэтому применяют проверку имени типа через строковое представление:

ЭтоСсылка = СтрНайти(Строка(ТипЗнч(Значение)), "Ссылка") > 0;

Строковое представление ссылочных типов содержит слово «Ссылка»: «СправочникСсылка.Номенклатура», «ДокументСсылка.ЗаказКлиента» и т.д. У объектных типов («СправочникОбъект», «ДокументОбъект») этого слова нет, поэтому проверка корректно отличает ссылку от объекта.

Альтернативный способ — воспользоваться тем, что у ссылочных значений есть уникальный идентификатор, но обращение к свойствам без проверки типа небезопасно. Более строгий вариант для типовых механизмов — использование функций общих модулей (в конфигурациях на БСП есть готовые функции проверки ссылочных типов), если библиотека подключена.

bsl
Функция ЭтоСсылка(Значение) Экспорт
    Возврат СтрНайти(Строка(ТипЗнч(Значение)), "Ссылка") > 0;
КонецФункции

Проверка типа реквизита объекта и составного типа

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

Если нужно узнать, какие типы допускает сам реквизит, обращаются к метаданным: Метаданные.Документы.ЗаказКлиента.Реквизиты.Контрагент.Тип.Типы() вернёт массив допустимых типов. Это используется при построении универсальных механизмов обмена и заполнения.

Для проверки «входит ли тип значения в список допустимых» удобен такой приём:

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

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

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

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

// тип подходит

КонецЕсли;

Типичные ошибки
01
Сравнение значения со строкой имени типа: Если Переменная = "Строка" — всегда ложь, сравнивать нужно ТипЗнч(Переменная) = Тип("Строка")
02
Опечатка в имени типа внутри Тип() — приводит к ошибке выполнения, а не к ложному результату сравнения
03
Игнорирование Неопределено и Null: обращение к свойствам такого значения до проверки типа вызывает ошибку
04
Ожидание, что составной тип реквизита вернёт несколько типов через ТипЗнч — функция всегда возвращает один фактический тип значения
05
Использование ТипЗнч к необъявленной переменной — это ошибка компиляции модуля, а не проверяемая ситуация

Проверка типа в запросах и СКД

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

ВЫБРАТЬ

Реализация.Контрагент

ИЗ

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

ГДЕ

Реализация.Контрагент ССЫЛКА Справочник.Контрагенты

Функция ВЫРАЗИТЬ(... КАК ...) позволяет привести значение составного типа к конкретному, что одновременно служит фильтром: значения других типов превращаются в NULL. Это стандартный приём при работе с составными полями в запросах и СКД.

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

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

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

СтрНайти(Строка(ТипЗнч()), "Ссылка")

Быстрая проверка класса значения (ссылка/не ссылка). Не подходит для точного определения типа

ССЫЛКА и ТИПЗНАЧЕНИЯ() в запросе

Единственный вариант внутри запросов и СКД; работает только для ссылочных типов

ВЫРАЗИТЬ(... КАК ...)

Приведение составного типа к конкретному с фильтрацией; значения других типов дают NULL

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

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

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

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

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

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

Ветка Если срабатывает на ожидаемом типе значения

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

Всегда попадает в Иначе — проверьте имя типа и фактический тип через Сообщить(ТипЗнч(...))

Имя типа в Тип()
Норма

Код выполняется без ошибок

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

Ошибка выполнения — имя объекта метаданных указано с опечаткой

Проверка ссылочности
Норма

СправочникСсылка и ДокументСсылка распознаются как ссылка

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

СправочникОбъект тоже проходит проверку — значит условие составлено неверно

Итог

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

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

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

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

Тип("ИмяТипа") создаёт объект типа по строковому имени и используется как эталон. ТипЗнч(Значение) возвращает фактический тип конкретного значения. Проверка строится как их сравнение: ТипЗнч(Переменная) = Тип("Строка").

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

Сравните тип с примитивным: Если ТипЗнч(Переменная) = Тип("Число") Тогда ... КонецЕсли. Учтите, что строка с цифрами — это тип «Строка», а не «Число»; при необходимости её нужно преобразовывать отдельно.

Что вернёт ТипЗнч() для Неопределено и Null?

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

Можно ли проверить тип без функции Тип(), сравнив строки?

Можно сравнивать строковые представления: Строка(ТипЗнч(Значение)) = "СправочникСсылка.Номенклатура". Это работает, но менее надёжно и читаемо, чем сравнение типов, поэтому обычно применяется только для проверки класса значения (например, «это ссылка»).

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

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

Почему сравнение типов не срабатывает, хотя тип вроде верный?

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