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