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