Разработка и Конфигурация · 10 мин
Как проверить тип переменной в 1С
Как проверить тип переменной в 1С: функции Тип(), ТипЗнч(), сравнение типов, проверка ссылочных и примитивных значений, типичные ошибки и примеры кода.
Проверка типа переменной — одна из базовых операций во встроенном языке 1С. Она нужна, когда процедура получает параметр, который может содержать значения разных типов: например, ссылку на справочник или строку, число или дату. Без проверки типа код легко «падает» с ошибкой при попытке вызвать метод, которого у значения нет, или получить неверный результат сравнения.
Во встроенном языке 1С для работы с типами используются две основные функции: Тип() и ТипЗнч(). Первая возвращает описание типа по его имени, вторая — тип конкретного значения. Их комбинация позволяет сравнить тип переменной с ожидаемым и построить ветвление логики.
Важно понимать, что тип в 1С — это объект специального вида «ОписаниеТипов» / «Тип», а не строка. Поэтому проверка вида Если Переменная = "СправочникСсылка" не сработает: сравнивать нужно именно типы, полученные функциями платформы. Ниже разобраны рабочие способы проверки, их ограничения и типичные ошибки.
Функция ТипЗнч(): как узнать тип конкретного значения
Функция ТипЗнч(Значение) принимает любое значение и возвращает объект типа «Тип», описывающий его тип. Это основной инструмент проверки: вы передаёте переменную, получаете её тип и дальше сравниваете с эталоном.
Пример базового использования:
Значение = 123;
ТекущийТип = ТипЗнч(Значение);
Сообщить(ТекущийТип); // выведет: Число
Обратите внимание: если переменная содержит Неопределено, функция вернёт тип «Неопределено», а не вызовет ошибку. То же самое с Null — у него собственный тип. Это удобно, потому что проверку можно делать до любых обращений к свойствам значения.
Если переменная вообще не объявлена, обращение к ней вызовет ошибку «Переменная не определена» — это ошибка компиляции/выполнения модуля, а не ситуация, которую можно перехватить через ТипЗнч. Поэтому ТипЗнч применяют к параметрам процедур, реквизитам объектов и элементам коллекций, а не к необъявленным идентификаторам.
Функция Тип(): как получить эталонный тип для сравнения
Функция Тип("ИмяТипа") создаёт объект типа по строковому имени. Именно её результат используют как «эталон» в сравнении с ТипЗнч(). Имя типа для объектов конфигурации строится по шаблону: вид объекта, точка, имя объекта метаданных — например, "СправочникСсылка.Контрагенты", "ДокументСсылка.РеализацияТоваровУслуг", "ПеречислениеСсылка.СтавкиНДС".
Для примитивных типов используются короткие имена: "Строка", "Число", "Дата", "Булево". Также существуют имена встроенных типов платформы: "ТаблицаЗначений", "Массив", "Структура", "Соответствие", "СписокЗначений" и другие.
Если ТипЗнч(Параметр) = Тип("Строка") Тогда
// работаем как со строкой
ИначеЕсли ТипЗнч(Параметр) = Тип("Число") Тогда
// работаем как с числом
КонецЕсли;
Сравнение типов: полный пример ветвления по типу параметра
Типичная задача — универсальная процедура, которая принимает параметр и ведёт себя по-разному в зависимости от того, что передали. Правильный шаблон выглядит так:
Процедура ОбработатьЗначение(ВходноеЗначение) Экспорт
ТекущийТип = ТипЗнч(ВходноеЗначение);
Если ТекущийТип = Тип("СправочникСсылка.Номенклатура") Тогда
Сообщить("Это номенклатура: " + ВходноеЗначение);
ИначеЕсли ТекущийТип = Тип("ДокументСсылка.ЗаказКлиента") Тогда
Сообщить("Это заказ клиента");
ИначеЕсли ТекущийТип = Тип("Строка") Тогда
Сообщить("Передана строка длиной " + СтрДлина(ВходноеЗначение));
ИначеЕсли ВходноеЗначение = Неопределено Тогда
Сообщить("Значение не задано");
Иначе
Сообщить("Неожиданный тип: " + ТекущийТип);
КонецЕсли;
КонецПроцедуры
Обратите внимание на последнюю ветку: вывод самого типа через Сообщить(ТипЗнч(...)) помогает при отладке — вы сразу видите, что именно пришло в процедуру. Это полезный приём при разборе ошибок «ожидался один тип, пришёл другой».
- 1Получите тип значения: ТекущийТип = ТипЗнч(Переменная)
- 2Сформируйте эталон: Тип("СправочникСсылка.Номенклатура") или Тип("Строка")
- 3Сравните типы оператором = в конструкции Если...Тогда
- 4Добавьте ветку Иначе с выводом фактического типа для диагностики
- 5Проверьте код на значениях Неопределено и Null, если они возможны
Как проверить, является ли значение ссылкой
Часто нужно проверить не конкретный тип, а целый класс: «это ссылка на объект базы или примитивное значение?». Перечислять все возможные ссылочные типы неудобно, поэтому применяют проверку имени типа через строковое представление:
ЭтоСсылка = СтрНайти(Строка(ТипЗнч(Значение)), "Ссылка") > 0;
Строковое представление ссылочных типов содержит слово «Ссылка»: «СправочникСсылка.Номенклатура», «ДокументСсылка.ЗаказКлиента» и т.д. У объектных типов («СправочникОбъект», «ДокументОбъект») этого слова нет, поэтому проверка корректно отличает ссылку от объекта.
Альтернативный способ — воспользоваться тем, что у ссылочных значений есть уникальный идентификатор, но обращение к свойствам без проверки типа небезопасно. Более строгий вариант для типовых механизмов — использование функций общих модулей (в конфигурациях на БСП есть готовые функции проверки ссылочных типов), если библиотека подключена.
Функция ЭтоСсылка(Значение) Экспорт
Возврат СтрНайти(Строка(ТипЗнч(Значение)), "Ссылка") > 0;
КонецФункцииПроверка типа реквизита объекта и составного типа
Реквизиты объектов метаданных могут иметь составной тип — например, реквизит «Контрагент» допускает ссылки на несколько справочников. В этом случае сравнение с одним типом через ТипЗнч() = Тип(...) работает корректно: фактическое значение всегда имеет один конкретный тип, даже если реквизит объявлен составным.
Если нужно узнать, какие типы допускает сам реквизит, обращаются к метаданным: Метаданные.Документы.ЗаказКлиента.Реквизиты.Контрагент.Тип.Типы() вернёт массив допустимых типов. Это используется при построении универсальных механизмов обмена и заполнения.
Для проверки «входит ли тип значения в список допустимых» удобен такой приём:
ДопустимыеТипы = Новый Массив;
ДопустимыеТипы.Добавить(Тип("СправочникСсылка.Контрагенты"));
ДопустимыеТипы.Добавить(Тип("СправочникСсылка.Организации"));
Если ДопустимыеТипы.Найти(ТипЗнч(Значение)) <> Неопределено Тогда
// тип подходит
КонецЕсли;
Проверка типа в запросах и СКД
В языке запросов 1С проверка типа делается иначе — через оператор ССЫЛКА и функцию ТИПЗНАЧЕНИЯ(). Пример отбора документов, где реквизит составного типа ссылается на конкретный справочник:
ВЫБРАТЬ
Реализация.Контрагент
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Контрагент ССЫЛКА Справочник.Контрагенты
Функция ВЫРАЗИТЬ(... КАК ...) позволяет привести значение составного типа к конкретному, что одновременно служит фильтром: значения других типов превращаются в NULL. Это стандартный приём при работе с составными полями в запросах и СКД.
Способы проверки типа
Универсальный способ во встроенном языке. Подходит для точного сравнения с конкретным типом
Быстрая проверка класса значения (ссылка/не ссылка). Не подходит для точного определения типа
Единственный вариант внутри запросов и СКД; работает только для ссылочных типов
Приведение составного типа к конкретному с фильтрацией; значения других типов дают NULL
Отладка: как быстро увидеть тип значения
При отладке тип переменной виден прямо в конфигураторе: в табло (окно «Вычислить выражение», Shift+F9) введите ТипЗнч(Переменная) — отобразится тип. В окне «Локальные переменные» и всплывающей подсказке при наведении на переменную тип также показывается рядом со значением.
В пользовательском режиме без конфигуратора помогает временный вывод через Сообщить(ТипЗнч(Значение)) или запись в журнал регистрации. После диагностики отладочный вывод следует убрать, чтобы не засорять журнал и не замедлять выполнение.
Как проверить результат
Ветка Если срабатывает на ожидаемом типе значения
Всегда попадает в Иначе — проверьте имя типа и фактический тип через Сообщить(ТипЗнч(...))
Код выполняется без ошибок
Ошибка выполнения — имя объекта метаданных указано с опечаткой
СправочникСсылка и ДокументСсылка распознаются как ссылка
СправочникОбъект тоже проходит проверку — значит условие составлено неверно
Что важно запомнить
Тип переменной получают через ТипЗнч(Значение) и сравнивают с Тип("ИмяТипа"). Для ссылок удобна проверка подстроки "Ссылка" в строковом представлении типа. В запросах используются ССЫЛКА, ТИПЗНАЧЕНИЯ() и ВЫРАЗИТЬ(). Всегда учитывайте Неопределено и Null и добавляйте ветку Иначе с выводом фактического типа для диагностики.
Частые вопросы
Чем отличаются Тип() и ТипЗнч()?
Тип("ИмяТипа") создаёт объект типа по строковому имени и используется как эталон. ТипЗнч(Значение) возвращает фактический тип конкретного значения. Проверка строится как их сравнение: ТипЗнч(Переменная) = Тип("Строка").
Как проверить, что переменная — число?
Сравните тип с примитивным: Если ТипЗнч(Переменная) = Тип("Число") Тогда ... КонецЕсли. Учтите, что строка с цифрами — это тип «Строка», а не «Число»; при необходимости её нужно преобразовывать отдельно.
Что вернёт ТипЗнч() для Неопределено и Null?
Для Неопределено вернётся тип «Неопределено», для Null — тип «Null». Ошибки не возникает, поэтому эти значения можно безопасно проверять через ТипЗнч до обращения к их свойствам.
Можно ли проверить тип без функции Тип(), сравнив строки?
Можно сравнивать строковые представления: Строка(ТипЗнч(Значение)) = "СправочникСсылка.Номенклатура". Это работает, но менее надёжно и читаемо, чем сравнение типов, поэтому обычно применяется только для проверки класса значения (например, «это ссылка»).
Как проверить тип значения в запросе 1С?
Используйте оператор ССЫЛКА (Поле ССЫЛКА Справочник.Контрагенты) или функцию ТИПЗНАЧЕНИЯ(Поле) в сочетании с сравнением. Для приведения составного типа к конкретному применяйте ВЫРАЗИТЬ(Поле КАК Справочник.Контрагенты).
Почему сравнение типов не срабатывает, хотя тип вроде верный?
Чаще всего причина в опечатке в имени типа внутри Тип() или в том, что фактический тип отличается от ожидаемого. Выведите Сообщить(ТипЗнч(Значение)) перед сравнением — так вы увидите реальный тип и сможете сверить его с эталоном.