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

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

Как узнать тип значения переменной в 1С

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

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

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

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

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

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

Простейший пример вывода типа в сообщение:

Значение = 123.45;

Сообщить(ТипЗнч(Значение)); // Выведет: Число

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

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

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

Если переменная содержит Неопределено или NULL, функция вернёт соответствующие типы — «Неопределено» и «Null». Это полезно при проверке результата запроса или функции, которая может не вернуть значение.

Функция Тип: сравнение типа переменной с эталоном

На практике чаще нужно не просто узнать тип, а проверить, является ли значение, например, ссылкой на конкретный справочник. Для этого функция Тип("ИмяТипа") создаёт объект типа по строковому имени, а результат сравнивается с результатом ТипЗнч().

Канонический шаблон проверки выглядит так:

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

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

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

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

Иначе

// Тип не поддерживается

КонецЕсли;

Имена типов для примитивных значений пишутся без уточнения: Тип("Строка"), Тип("Число"), Тип("Дата"), Тип("Булево"), Тип("Массив"), Тип("Структура"), Тип("ТаблицаЗначений"). Для прикладных объектов указывается вид и имя объекта метаданных: Тип("ДокументСсылка.ПоступлениеТоваровУслуг"), Тип("ПеречислениеСсылка.СтавкиНДС").

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

Как посмотреть тип переменной в отладчике без изменения кода

Когда нужно разово узнать тип значения при поиске ошибки, менять код не требуется — достаточно отладчика конфигуратора. Установите точку останова на нужной строке, запустите отладку (меню «Отладка» → «Начать отладку») и дождитесь остановки.

Дальше есть несколько способов посмотреть тип:

  • Табло (Ctrl+Shift+T или меню «Отладка» → «Табло»): введите имя переменной — в колонке «Тип» отобразится её текущий тип, а в колонке «Значение» — само значение.
  • Вычислить выражение (Shift+F9): введите ТипЗнч(Переменная) — результатом будет объект типа с его строковым представлением.
  • Локальные переменные: окно показывает все переменные текущей процедуры вместе с типами автоматически.

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

Порядок действий в отладчике
  1. 1
    Установите точку останова на строке, где переменная уже заполнена
  2. 2
    Запустите отладку и дождитесь остановки выполнения
  3. 3
    Откройте табло и введите имя переменной
  4. 4
    Посмотрите колонку «Тип» — там фактический тип значения
  5. 5
    При необходимости вычислите выражение ТипЗнч(Переменная) через Shift+F9

Проверка составных типов и значения Неопределено

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

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

Если Параметр = Неопределено Тогда

Возврат;

КонецЕсли;

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

Или ТипЗнч(Параметр) = Тип("СправочникСсылка.Организации") Тогда

// Обработка контрагента любого из двух видов

КонецЕсли;

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

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

Альтернативные приёмы: ОписаниеТипов и проверка по строковому представлению

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

Описание = Метаданные.Справочники.ДоговорыКонтрагентов.Реквизиты.Владелец.Тип;

Для Каждого ТекТип Из Описание.Типы() Цикл

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

КонецЦикла;

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

Встречается и приём сравнения типа через строку: Строка(ТипЗнч(Значение)) = "Число". Он работает, но менее надёжен, чем сравнение объектов типа, — строковое представление зависит от локализации и формата вывода. Использовать его в прикладном коде не рекомендуется, оставьте этот способ для быстрой диагностики.

Сравнение вариантов

ТипЗнч + Тип

Стандартная проверка типа значения в коде. Подходит почти всегда; ограничение — имя типа задаётся строкой и зависит от метаданных.

Отладчик (табло, выражения)

Разовая диагностика без изменения кода. Не подходит для логики внутри алгоритма.

ОписаниеТипов через метаданные

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

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

Быстрый диагностический приём. Ненадёжен в прикладном коде из-за зависимости от строкового представления.

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

Первая распространённая ошибка — сравнение результата ТипЗнч напрямую со строкой: Если ТипЗнч(Значение) = "Число" Тогда. Такое сравнение всегда даёт Ложь, потому что слева объект «Тип», а справа строка. Правильно — ТипЗнч(Значение) = Тип("Число").

Вторая ошибка — опечатка или устаревшее имя объекта в строке Тип("СправочникСсылка.Контрагент"), когда справочник называется «Контрагенты». Ошибка проявится только в момент выполнения этой ветки кода, поэтому редко используемые ветки стоит покрывать тестовым запуском.

Третья группа ошибок связана с ложными допущениями: разработчик считает, что параметр процедуры всегда содержит ссылку, а вызывающий код передаёт структуру или Неопределено. Защитная проверка типа в начале экспортных процедур общих модулей — хорошая практика, которая превращает непонятную ошибку «где-то внутри» в явное сообщение о неверном параметре.

Типичные ошибки
01
Сравнение ТипЗнч(Значение) со строкой вместо Тип("ИмяТипа") — условие никогда не выполняется, ветка кода молча пропускается
02
Устаревшее имя объекта в строке Тип("...") после переименования метаданных — ошибка выполнения в момент вызова
03
Отсутствие проверки на Неопределено и NULL перед обращением к реквизитам — аварийное прерывание обработки
04
Игнорирование составного типа реквизита — часть значений попадает в ветку «Иначе» и обрабатывается неверно

Проверка результата и ограничения подхода

После добавления проверки типа убедитесь, что каждая ветка логики реально достижима и выполняется. Самый надёжный способ — пройти код в отладчике с тестовыми данными каждого ожидаемого типа: ссылкой нужного вида, значением другого типа, Неопределено и пустой ссылкой.

Признак корректной работы — осмысленное поведение во всех ветках, включая ветку «Иначе». Если значение неподдерживаемого типа молча проглатывается, добавьте запись в журнал регистрации или сообщение пользователю: это упростит поиск проблем при обмене данными и пакетных обработках.

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

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

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

Ветка с нужным типом
Норма

При передаче значения целевого типа выполняется именно она

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

Условие не срабатывает — проверьте имя типа в Тип("...")

Значение Неопределено или NULL
Норма

Код корректно отрабатывает защитную ветку без ошибки

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

Ошибка выполнения при обращении к реквизитам

Неподдерживаемый тип
Норма

Выполняется ветка Иначе с понятной реакцией

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

Значение молча игнорируется без следа в журнале

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

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

ТипЗнч(Значение) возвращает фактический тип конкретного значения, а Тип("ИмяТипа") создаёт объект типа по строковому имени для сравнения. В проверках они используются в паре: слева ТипЗнч от переменной, справа Тип с именем эталонного типа.

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

Используйте условие Если ТипЗнч(Значение) = Тип("Число") Тогда. Учтите, что строка с цифрами типом «Число» не является — если данные приходят извне, сначала проверьте тип, а преобразование выполняйте только осознанно.

Как узнать тип значения в запросе 1С?

В языке запросов есть оператор ТИПЗНАЧЕНИЯ(Выражение) и функция ТИП("ИмяТипа") для сравнения, а также ВЫРАЗИТЬ() для приведения типа. Проверка по типу в запросе полезна для полей составного типа, например регистраторов.

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

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

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

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

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

Корректный тип ссылки, например «СправочникСсылка.Номенклатура», — пустота значения на тип не влияет. Чтобы отличить пустую ссылку от заполненной, дополнительно используйте проверку ЗначениеЗаполнено() или сравнение с ПустаяСсылка().

Итог

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

Тип значения переменной определяется функцией ТипЗнч(), а сравнение выполняется через Тип("ИмяТипа"). Для разовой диагностики достаточно табло отладчика. Всегда проверяйте значение на Неопределено и NULL до обращения к реквизитам, помните про составные типы и пустые ссылки, а строковые имена типов обновляйте после переименования объектов метаданных.