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