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

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

Как узнать тип реквизита в 1С

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

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

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

Ниже разобраны основные методы: просмотр в конфигураторе, получение типа через метаданные в коде, функции ТипЗнч и Тип, а также определение типа значения в запросе. Для каждого способа указаны условия применения и ограничения.

Как посмотреть тип реквизита в конфигураторе

Самый наглядный способ — открыть структуру объекта в конфигураторе. Найдите нужный объект (справочник, документ, регистр) в дереве конфигурации, раскройте ветку «Реквизиты» и дважды щёлкните по нужному реквизиту. В палитре свойств поле «Тип» покажет заданный тип: например, «Строка(150)», «Число(15,2)», «СправочникСсылка.Номенклатура».

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

Дополнительные характеристики — длина строки, точность числа, состав даты (дата, время или дата и время) — задаются там же, через кнопку выбора у поля «Тип». Их нужно учитывать при загрузке данных: строка большей длины будет обрезана без предупреждения.

Как определить тип реквизита через метаданные в коде

Когда тип нужен программно — например, для универсальной обработки любых документов — используется объект «Метаданные». У каждого реквизита есть свойство «Тип», которое возвращает объект «ОписаниеТипов».

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

Для Каждого Реквизит Из МетаДок.Реквизиты Цикл

Сообщить(Реквизит.Имя + " : " + Строка(Реквизит.Тип));

КонецЦикла;

Объект «ОписаниеТипов» позволяет проверить, входит ли конкретный тип в состав: метод СодержитТип(Тип) возвращает Истина или Ложь. Это удобно, когда обработка должна по-разному работать со ссылочными и примитивными реквизитами.

Через метаданные также доступны квалификаторы: КвалификаторыСтроки.Длина, КвалификаторыЧисла.Разрядность и РазрядностьДробнойЧасти, КвалификаторыДаты.ЧастиДаты. Они нужны при программном создании объектов или проверке совместимости полей.

bsl
ОписаниеТипа = Метаданные.Справочники.Номенклатура.Реквизиты.Артикул.Тип;
Если ОписаниеТипа.СодержитТип(Тип("Строка")) Тогда
    Длина = ОписаниеТипа.КвалификаторыСтроки.Длина;
КонецЕсли;

Как узнать тип конкретного значения: ТипЗнч и Тип

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

Функция Тип("ИмяТипа") создаёт объект типа по имени, что позволяет сравнивать: ТипЗнч(Значение) = Тип("СправочникСсылка.Контрагенты"). Такое сравнение — стандартный приём при разборе составных полей и реквизитов с типом «Характеристика».

Для ссылочных значений имя типа формируется как вид объекта плюс имя метаданных: «ДокументСсылка.ПоступлениеТоваровУслуг», «ПеречислениеСсылка.СтавкиНДС». Опечатка в имени вызовет ошибку выполнения, поэтому имя удобно получать из метаданных, а не писать вручную.

Сравнение подходов

Метаданные (Реквизит.Тип)

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

ТипЗнч(Значение)

Показывает фактический тип значения в переменной. Подходит для ветвления логики, но требует самого значения.

Палитра свойств в конфигураторе

Быстрый визуальный способ. Не работает без доступа к конфигуратору и не подходит для автоматизации.

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

В языке запросов 1С есть функция ТИПЗНАЧЕНИЯ(Поле), которая возвращает тип значения поля. Её применяют в условиях ГДЕ и в конструкции ВЫБОР, чтобы отфильтровать записи по фактическому типу составного реквизита.

ВЫБРАТЬ

ХозрасчетныйОбороты.Субконто1 КАК Субконто

ГДЕ

ТИПЗНАЧЕНИЯ(ХозрасчетныйОбороты.Субконто1) = ТИП(Справочник.Номенклатура)

Обратная задача — привести поле к нужному типу — решается оператором ВЫРАЗИТЬ(Поле КАК Справочник.Номенклатура). Приведение обязательно, когда по составному полю строится соединение: без ВЫРАЗИТЬ запрос может вернуть NULL или работать заметно медленнее из-за соединения по всем таблицам составного типа.

Проверить результат удобно в консоли запросов: выполните выборку с ТИПЗНАЧЕНИЯ по нескольким записям и убедитесь, что типы соответствуют ожиданиям, прежде чем переносить текст запроса в код.

Порядок действий при анализе составного реквизита
  1. 1
    Откройте реквизит в конфигураторе и выпишите все типы, входящие в составной тип
  2. 2
    В консоли запросов выберите несколько записей с функцией ТИПЗНАЧЕНИЯ по этому полю
  3. 3
    Определите, какие типы реально встречаются в данных
  4. 4
    В коде добавьте ветвление через ТипЗнч для каждого значимого типа
  5. 5
    Проверьте обработку на записи с пустым значением реквизита

Особые случаи: характеристики, определяемые типы и планы видов характеристик

В типовых конфигурациях часто встречаются определяемые типы — например, «ВладелецДополнительныхСвойств». Это не конкретный тип, а именованный составной тип, объявленный в ветке «Определяемые типы» дерева конфигурации. Чтобы узнать фактический состав, откройте соответствующий определяемый тип и посмотрите его свойство «Тип».

Реквизиты с типом «Характеристика.<Имя плана видов характеристик>» хранят значение, допустимое для конкретной строки плана видов характеристик. Фактический тип значения определяется свойством «ТипЗначения» самой характеристики, поэтому анализировать его нужно в два шага: сначала получить характеристику, затем тип её значения.

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

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

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

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

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

Типичные ошибки
01
Сравнение ТипЗнч со строкой вместо Тип("ИмяТипа") — условие никогда не выполняется
02
Игнорирование составного типа — обрабатывается только часть значений
03
Соединение в запросе по составному полю без ВЫРАЗИТЬ — NULL в результате и лишняя нагрузка
04
Отсутствие проверки на Неопределено и пустые ссылки — ошибки на незаполненных реквизитах
05
Ручной ввод имени типа с опечаткой вместо получения из метаданных — ошибка выполнения
Контрольные точки

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

Сравнение типов в коде
Норма

Условие срабатывает на тестовых значениях каждого ожидаемого типа

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

Условие не срабатывает ни разу — вероятно, тип задан строкой или с опечаткой

Запрос с ТИПЗНАЧЕНИЯ
Норма

В консоли запросов возвращаются только записи нужного типа

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

Пустой результат при заведомо существующих данных — проверьте имя типа в ТИП(...)

Анализ составного реквизита
Норма

Перечислены все типы из палитры свойств и подтверждены реальными данными

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

В обработку попали значения непредусмотренного типа

FAQ

Как узнать тип реквизита, если нет доступа к конфигуратору?

Используйте внешние инструменты: консоль кода или обработки анализа структуры метаданных, которые выводят состав реквизитов и их типы через объект Метаданные. Также тип значения конкретного поля можно проверить, выведя его в табличный документ и посмотрев расшифровку, либо через запрос с функцией ТИПЗНАЧЕНИЯ в консоли запросов.

Чем отличается ТипЗнч от свойства Тип в метаданных?

Свойство Тип в метаданных описывает, какие значения реквизит может хранить в принципе, включая составной тип и квалификаторы. ТипЗнч показывает фактический тип конкретного значения в конкретный момент. Для анализа структуры используют метаданные, для ветвления логики по реальным данным — ТипЗнч.

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

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

Почему запрос с ТИПЗНАЧЕНИЯ возвращает пустой результат?

Чаще всего причина в неверно указанном типе в конструкции ТИП(...): имя объекта метаданных должно точно совпадать с именем в конфигурации, включая регистр букв в некоторых контекстах. Также проверьте, что поле действительно содержит значения этого типа, — выберите несколько записей без фильтра и посмотрите, что возвращает ТИПЗНАЧЕНИЯ.

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

Получите описание типа реквизита через метаданные и обратитесь к квалификаторам: Реквизит.Тип.КвалификаторыСтроки.Длина. Аналогично для чисел доступны Разрядность и РазрядностьДробнойЧасти в КвалификаторыЧисла, а для дат — ЧастиДаты в КвалификаторыДаты.

Что делать, если реквизит имеет тип «Характеристика»?

Такой реквизит ссылается на строку плана видов характеристик, а фактический тип её значения задан в свойстве ТипЗначения этой характеристики. Сначала получите саму характеристику, затем проанализируйте её ТипЗначения. В запросах для фильтрации по значениям характеристик обычно используют ВЫРАЗИТЬ с нужным типом.

Итог

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

Тип реквизита смотрят в палитре свойств конфигуратора, программно — через метаданные (объявленный тип) и ТипЗнч (фактический тип значения), в запросах — через ТИПЗНАЧЕНИЯ и ВЫРАЗИТЬ. Для составных типов проверяйте все входящие типы и не забывайте про пустые значения.