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