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

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

Как проверить тип данных в 1С

Основные способы проверки типа данных в 1С: ТипЗнч, Тип(), строковые описания типов, проверка в отладчике. Примеры кода, ошибки и рекомендации для разработчиков.

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

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

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

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

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

Значение = 42;

ТипЗначения = ТипЗнч(Значение); // вернёт тип "Число"

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

Сообщить("Это число");

КонецЕсли;

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

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

Сравнение с типом по имени и проверка ссылочных типов

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

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

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

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

// работаем с документом

КонецЕсли;

Когда нужно проверить принадлежность к целой группе типов (любой документ, любой справочник), удобнее использовать методы объекта Метаданные или функции общего назначения. В Библиотеке стандартных подсистем для этого есть ОбщегоНазначения.ЭтоСсылка(), ОбщегоНазначения.ЭтоДокумент() и аналогичные проверки по менеджеру объекта.

bsl
Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
    Сообщить("Это ссылка на номенклатуру");
КонецЕсли;

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

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

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

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

.Реквизиты.Контрагент.Тип;

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

// реквизит может хранить контрагента

КонецЕсли;

Обратная задача — привести значение к нужному типу или создать пустое значение заданного типа. Для этого у ОписаниеТипов есть метод ПривестиЗначение(), который безопасно преобразует значение или вернёт значение по умолчанию для типа.

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

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

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

Для приведения составного поля к конкретному типу в запросе используется ВЫРАЗИТЬ(Поле КАК Документ.РеализацияТоваровУслуг). Это позволяет обратиться к реквизитам конкретного вида документа через точку — без выражения такая попытка вызовет ошибку построения запроса.

Определение типа в отладчике без изменения кода

Когда код уже работает и нужно просто посмотреть тип значения, менять программу не требуется. В конфигураторе тип виден в нескольких местах.

Как посмотреть тип в отладчике
  1. 1
    Поставьте точку останова на нужной строке и запустите отладку (F5)
  2. 2
    Выделите переменную и нажмите Shift+F9 — откроется окно «Вычислить выражение»
  3. 3
    В поле «Выражение» введите ТипЗнч(ИмяПеременной) — в колонке «Значение» появится тип
  4. 4
    В колонке «Тип» того же окна тип отображается и без вызова функции — достаточно вычислить саму переменную
  5. 5
    Для глубокого анализа откройте значение двойным щелчком и изучите структуру объекта

В табло (Ctrl+Alt+W) и в окне «Вычислить выражение» у каждого значения есть колонка «Тип», где платформа показывает имя типа: Число, Строка, СправочникСсылка.Номенклатура и так далее. Это самый быстрый способ понять, что пришло в процедуру извне.

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

Проверка примитивных типов и особые значения

Примитивные типы — Число, Строка, Дата, Булево — проверяются стандартным сравнением. Но в 1С есть особые значения, которые требуют отдельной обработки: Неопределено и NULL.

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

// параметр не передан

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

// пустое значение из запроса

ИначеЕсли НЕ ЗначениеЗаполнено(Значение) Тогда

// пустая ссылка, пустая строка, ноль, пустая дата

КонецЕсли;

Частая ошибка — сравнивать с Неопределено значение, полученное из запроса. Запрос возвращает NULL для отсутствующих соединений, и сравнение NULL = Неопределено даёт Ложь. В результате проверка «на пустоту» молча не срабатывает, и дальше код падает при обращении к реквизитам.

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

Сравнение способов и выбор подходящего

Универсального способа нет — выбор зависит от контекста: встроенный код, запрос, отладка или работа с метаданными.

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

ТипЗнч + Тип

Точечная проверка конкретного типа в коде. Ограничение: имя типа должно существовать, иначе исключение

ОписаниеТипов.СодержитТип

Проверка допустимости типа для реквизита или параметра. Не проверяет фактическое значение

ССЫЛКА и ВЫРАЗИТЬ в запросе

Фильтрация и приведение составных полей на уровне СУБД. Не работает вне запроса

Отладчик и табло

Исследование типов без изменения кода. Требует воспроизведения ситуации под отладкой

Функции БСП (ЭтоСсылка и др.)

Групповые проверки в типовых конфигурациях. Требуют наличия Библиотеки стандартных подсистем

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

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

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

Ветка кода по типу
Норма

При тестовом значении нужного типа выполняется правильная ветка

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

Выполняется ветка Иначе при корректном значении — проверьте точность имени типа

Работа с NULL из запроса
Норма

Отсутствующие данные обрабатываются отдельной веткой

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

Код падает при обращении к полю NULL-значения

Устойчивость к переименованию
Норма

После переименования объекта метаданных проверка либо работает, либо контролируемо сообщает об ошибке

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

Исключение «Тип не найден» в рабочей базе

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

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

Используйте сравнение ТипЗнч(Значение) = Тип("Число"). Учтите, что строка "123" числом не является — если нужно проверить возможность преобразования, используйте ОписаниеТипов с квалификатором числа и метод ПривестиЗначение(), а затем сравните результат с исходной строкой.

Чем отличается NULL от Неопределено?

Неопределено — значение по умолчанию для необъявленных переменных и отсутствующих параметров. NULL — значение из запроса, когда соединение таблиц не нашло соответствия. Они не равны друг другу, и проверять их нужно отдельными сравнениями.

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

Преобразуйте результат ТипЗнч(Значение) в строку обычным присваиванием строковой переменной или через Строка(ТипЗнч(Значение)). Для ссылочных типов получится строка вида "СправочникСсылка.Номенклатура". Также имя можно получить через XMLТипЗнч(Значение).ИмяТипа.

Как проверить тип, если объект могли переименовать?

Оберните вызов Тип("Имя") в конструкцию Попытка...Исключение или проверьте наличие объекта через Метаданные.НайтиПоПолномуИмени() до создания типа. В конфигурациях с БСП используйте ОбщегоНазначения.ЭтоСсылка() и родственные функции — они не зависят от конкретных имён.

Можно ли проверить тип в условии СКД или динамического списка?

Да, в языке выражений СКД доступны те же конструкции, что и в запросах: проверка ССЫЛКА и функция ВЫРАЗИТЬ. Для отбора по типу регистратора или составного поля добавьте условие вида «Поле ССЫЛКА Документ.ИмяДокумента» в текст запроса набора данных.

Что быстрее: ТипЗнч или проверка через метаданные?

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

Итог

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

Основной инструмент проверки типа — связка ТипЗнч(Значение) и Тип("Имя"). Для составных реквизитов используйте ОписаниеТипов.СодержитТип(), в запросах — ССЫЛКА и ВЫРАЗИТЬ, для анализа без изменения кода — отладчик. Различайте NULL и Неопределено и защищайте вызовы Тип() от несуществующих имён.