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

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

Как узнать тип данных в 1С

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

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

Основная пара функций — Тип() и ТипЗначения() — решает большинство задач, но у них есть тонкости: например, для реквизитов составного типа результат не всегда очевиден, а в запросах используется отдельный оператор ТИПЗНАЧЕНИЯ() и функция ЕСТЬNULL() влияет на итоговый тип. Ниже разобраны все рабочие способы с примерами кода, типичными ошибками и ограничениями.

Функция ТипЗначения: узнать тип переменной в коде

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

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

Значение = Справочники.Номенклатура.НайтиПоКоду("000001");

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

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

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

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

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

КонецЕсли;

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

Функция Тип: получить тип по имени и проверить соответствие

Функция Тип("ИмяТипа") сама по себе тип значения не определяет — она создаёт описание типа по строковому имени. Её основная роль — сравнение: вы получаете эталонный тип и сверяете с ним результат ТипЗначения(). Для примитивных типов используются имена «Строка», «Число», «Дата», «Булево», «Неопределено», «NULL».

Типичная проверка перед обработкой значения:

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

Результат = Параметр * 1.2;

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

Результат = СокрЛП(Параметр);

Иначе

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

КонецЕсли;

Для коллекций тоже есть свои имена: «Массив», «Структура», «Соответствие», «ТаблицаЗначений», «СписокЗначений». Это удобно, когда процедура принимает параметр, который может быть и массивом, и одиночным значением.

ОписаниеТипов и составные типы реквизитов

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

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

Для Каждого ТекТип Из МетаРеквизит.Тип.Типы() Цикл

Сообщить(ТекТип);

КонецЦикла;

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

ТипЗначения()Тип конкретного значения в переменной

Работает только в коде на встроенном языке

Метаданные + ОписаниеТиповВсе допустимые типы реквизита

Показывает составной тип и квалификаторы

ТИПЗНАЧЕНИЯ() в запросеТип поля в результате запроса

Единственный способ внутри текста запроса

ОтладчикТип в конкретной точке выполнения

Быстрее всего при разовой проверке

Как определить тип поля в запросе

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

ВЫБРАТЬ

ХозрасчетныйОстатки.Субконто1 КАК Субконто

ГДЕ

ТИПЗНАЧЕНИЯ(ХозрасчетныйОстатки.Субконто1) = ТИП(Справочник.Номенклатура)

Для приведения составного поля к конкретному типу применяют оператор ВЫРАЗИТЬ(... КАК ...) — это не только уточняет тип, но и позволяет безопасно обращаться к реквизитам через точку. Параллельно стоит помнить про ЕСТЬNULL(): если поле может содержать NULL (например, после левого соединения), тип результата будет включать NULL, и сравнения с конкретным типом могут не сработать.

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

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

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

Проверка типа через отладчик
  1. 1
    Установите точку останова после присвоения значения переменной
  2. 2
    Запустите отладку и дождитесь остановки
  3. 3
    Выделите имя переменной и нажмите Shift+F9
  4. 4
    В окне результата посмотрите колонку с типом значения

Типичные ошибки при определении типа

Самая распространённая ошибка — сравнение типа со строкой: конструкция Если ТипЗнч(Х) = "Строка" всегда ложна, потому что слева объект типа «Тип», а справа строка. Корректно: ТипЗнч(Х) = Тип("Строка"). Вторая частая проблема — путаница между Неопределено и NULL: это разные значения, и тип у них разный; NULL в обычном коде почти не встречается, он приходит из запросов.

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

Типичные ошибки
01
Сравнение ТипЗнч(Х) со строкой "Строка" вместо Тип("Строка") — условие никогда не выполняется
02
Смешение NULL и Неопределено — разные типы, проверки нужны отдельные
03
Ожидание составного типа от ТипЗначения() — функция возвращает тип только текущего значения
04
Вызов Тип() с именем несуществующего объекта — исключение в момент выполнения

Проверка результата и практические рекомендации

Надёжный шаблон защитного кода выглядит так: сначала проверка на Неопределено и NULL, затем сравнение типа через ТипЗнч() = Тип(...), и только потом работа со значением. Такой порядок исключает обращения к реквизитам несуществующего типа и падение кода в исключение.

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

Итог

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

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

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

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

Ничем, это полное и сокращённое имя одной и той же функции. Обе возвращают объект типа «Тип» для переданного значения и взаимозаменяемы в любом коде.

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

Используйте метод Справочники.ТипВсеСсылки(): Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда ... — так не придётся перечислять каждый справочник по имени.

Почему ТипЗнч() возвращает NULL после запроса?

При левом соединении таблиц несовпавшие поля дают NULL. Обработайте поле функцией ЕСТЬNULL() в запросе или проверяйте значение на NULL в коде перед сравнением типов.

Как узнать тип значения в тонком клиенте без конфигуратора?

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

Можно ли узнать тип колонки таблицы значений?

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

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

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