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