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

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

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

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

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

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

Материал рассчитан на разработчиков и администраторов, работающих с платформой 1С:Предприятие 8.x. Примеры приведены на встроенном языке и подходят как для управляемых, так и для обычных форм.

Функция ТипЗнч() — основной способ определения типа

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

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

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

Возвращаемое значение — не строка, а специальный объект. Его можно сравнивать с другим объектом типа Тип, передавать в процедуры, использовать в условиях. Но напрямую сравнивать его со строкой нельзя — сравнение ТипЗнч(Х) = "Число" всегда даст Ложь.

Для примитивных типов функция вернёт: Число, Строка, Дата, Булево, Неопределено, Null. Для объектов конфигурации — конкретный вид, например ДокументСсылка.РеализацияТоваровУслуг или ДокументОбъект.ПоступлениеТоваровУслуг.

Как сравнить тип значения с нужным: функция Тип()

Чтобы проверить, является ли значение, например, ссылкой на конкретный справочник, используется связка ТипЗнч() и Тип(). Функция Тип(<ИмяТипа>) принимает строковое имя типа и возвращает соответствующий объект Тип.

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

// работаем как со ссылкой на справочник

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

// пришла строка — ищем по наименованию

КонецЕсли;

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

Для примитивных типов имена совпадают с названиями: Тип("Число"), Тип("Строка"), Тип("Дата"), Тип("Булево").

bsl
Если ТипЗнч(Значение) = Тип("Число") Тогда
	Сумма = Сумма + Значение;
ИначеЕсли ТипЗнч(Значение) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
	ОбработатьДокумент(Значение);
КонецЕсли;

ТипЗначения() и ТипЗначенияСтрокой(): где применяются

Функция ТипЗначения(<Значение>) — наследие платформы 7.7, доступное в 8.x для совместимости. Она возвращает строковое представление типа, но в некоторых контекстах ведёт себя иначе, чем ТипЗнч(). В новом коде предпочтительнее ТипЗнч(), а ТипЗначения() встречается в основном в старых доработках.

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

Сообщить("Получен параметр типа: " + ТипЗначенияСтрокой(Параметр));

Альтернативный приём — преобразование результата ТипЗнч() в строку через конкатенацию: СтрокаТипа = "" + ТипЗнч(Значение);. Результат аналогичен: строка вида «СправочникСсылка.Номенклатура».

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

ТипЗнч()

Возвращает объект Тип. Подходит для программного сравнения с Тип(). Основной способ в новом коде.

ТипЗначенияСтрокой()

Возвращает строку с именем типа. Удобна для сообщений, логов и отладки, не подходит для надёжных сравнений.

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

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

Проверка «ссылка или объект» и составные типы

Частая задача — отличить ссылку от объекта. Например, ДокументСсылка.РеализацияТоваровУслуг и ДокументОбъект.РеализацияТоваровУслуг — разные типы, и методы у них разные. Прямое сравнение через Тип() работает, но перебирать все виды документов долго.

Для групповой проверки удобнее получить строковое представление и проверить вхождение подстроки:

СтрокаТипа = ТипЗначенияСтрокой(Значение);

Если СтрНайти(СтрокаТипа, "ДокументСсылка") > 0 Тогда

// это ссылка на документ любого вида

КонецЕсли;

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

Порядок действий при проверке составного реквизита
  1. 1
    Получите значение реквизита в переменную
  2. 2
    Вызовите ТипЗнч(Значение) и сравните с Тип("ИмяНужногоТипа")
  3. 3
    Для каждого допустимого варианта добавьте ветку ИначеЕсли
  4. 4
    В ветке Иначе обработайте непредусмотренный тип — сообщение или исключение
  5. 5
    Проверьте поведение на пустом значении (Неопределено, пустая ссылка)

Определение типа в запросе: ТИПЗНАЧЕНИЯ и ССЫЛКА

В языке запросов 1С есть свои механизмы. Оператор ТИПЗНАЧЕНИЯ(Поле) возвращает тип значения поля, а ТИП(ПредставлениеТипа) — тип для сравнения. Это позволяет фильтровать составные поля прямо в запросе.

ВЫБРАТЬ

Расчёты.Регистратор

ИЗ

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

ГДЕ

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

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

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

В режиме отладки тип любой переменной виден в табло или окне «Вычислить выражение» (Shift+F9): рядом со значением отображается и его тип. Это самый быстрый способ понять, что реально пришло в процедуру, без изменения кода.

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

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

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

Практический пример: универсальная функция проверки

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

Функция ОписаниеТипаЗначения(Значение) Экспорт

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

Возврат "Неопределено";

ИначеЕсли Значение = Null Тогда

Возврат "Null";

Иначе

Возврат ТипЗначенияСтрокой(Значение);

КонецЕсли;

КонецФункции

Для проверки «ожидаемый ли тип пришёл» в интеграциях (HTTP-сервисы, обмены) лучше сразу формировать понятное сообщение об ошибке с указанием фактического типа — это сокращает время поиска проблемы в разы по сравнению с голым «Ошибка преобразования».

Итог

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

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

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

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

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

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

Возьмите строковое представление: СтрокаТипа = ТипЗначенияСтрокой(Значение), затем проверьте СтрНайти(СтрокаТипа, "СправочникСсылка") > 0. В запросе для этого есть оператор ССЫЛКА: Поле ССЫЛКА Справочник.ИмяСправочника.

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

ТипЗнч() возвращает объект Тип, а не строку. Сравнение объекта со строкой всегда даёт Ложь. Правильно: ТипЗнч(Х) = Тип("Строка").

Как узнать все допустимые типы составного реквизита?

Через метаданные: Метаданные.Документы.ИмяДокумента.Реквизиты.ИмяРеквизита.Тип.Типы() вернёт массив объектов Тип. Само значение реквизита через ТипЗнч() покажет только тип текущего содержимого.

Что вернёт ТипЗнч() для пустой ссылки?

Конкретный тип ссылки, например СправочникСсылка.Номенклатура. Пустота ссылки не меняет её тип. Для проверки заполненности используйте ЗначениеЗаполнено() или сравнение с пустой ссылкой.

Можно ли использовать ТипЗнч() на тонком клиенте и в веб-клиенте?

Да, функция доступна во всех режимах исполнения: толстый, тонкий, веб-клиент и сервер. Ограничений по контексту у неё нет.