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

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

Как определить тип реквизита в 1С

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

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

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

Ниже разобраны все рабочие подходы с примерами кода, ограничениями и типичными ошибками, которые приводят к неработающим проверкам и ложным срабатываниям.

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

Самый быстрый способ узнать тип реквизита — открыть объект метаданных в конфигураторе. Найдите нужный справочник, документ или регистр в дереве конфигурации, раскройте ветку «Реквизиты» и выделите интересующий реквизит. В палитре свойств (открывается по правой кнопке мыши — «Свойства» или сочетанием Alt+Enter) первое же поле «Тип» покажет назначенный тип данных.

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

Для стандартных реквизитов (Ссылка, Код, Наименование, Дата, Номер) тип задаётся на уровне объекта целиком, а не отдельного реквизита. Например, тип кода справочника меняется в свойствах самого справочника на вкладке «Данные».

Определение типа значения в коде: ТипЗнч() и Тип()

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

Если ТипЗнч(ЗначениеРеквизита) = Тип("СправочникСсылка.Контрагенты") Тогда

// работаем как со ссылкой на контрагента

КонецЕсли;

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

Учтите важный нюанс: ТипЗнч определяет тип значения, которое лежит в реквизите прямо сейчас, а не тип, объявленный в метаданных. Если составной реквизит пуст, в нём может лежать Неопределено, и ТипЗнч вернёт тип «Неопределено», хотя по конфигурации реквизит допускает ссылки на справочники.

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

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

МетаданныеДокумента = ДокументОбъект.Метаданные();

ОписаниеТипа = МетаданныеДокумента.Реквизиты.Найти("Контрагент").Тип;

Для Каждого ТекущийТип Из ОписаниеТипа.Типы() Цикл

Сообщить(ТекущийТип);

КонецЦикла;

Метод Типы() возвращает массив всех типов, входящих в описание. Если массив содержит один элемент — реквизит простой, если несколько — составной. Дополнительно у ОписанияТипов доступны квалификаторы: КвалификаторыЧисла (длина и точность), КвалификаторыСтроки (длина, фиксированная или переменная), КвалификаторыДаты (состав даты: только дата, только время или дата и время).

Удобный метод объекта ОписаниеТипов — СодержитТип(Тип). Он возвращает Истина, если указанный тип входит в описание. Это позволяет проверить совместимость значения с реквизитом до попытки присвоения и избежать ошибки преобразования.

bsl
ОписаниеТипа = Объект.Метаданные().Реквизиты.Найти("Плательщик").Тип;
Если ОписаниеТипа.СодержитТип(ТипЗнч(НовоеЗначение)) Тогда
    Объект.Плательщик = НовоеЗначение;
Иначе
    Сообщить("Тип значения не соответствует реквизиту");
КонецЕсли;

Проверка составных реквизитов и значения Неопределено

Составной реквизит требует перебора вариантов. Типичный сценарий — реквизит «Контрагент», который может ссылаться и на справочник «Контрагенты», и на «Организации». Проверка через ТипЗнч выполняется последовательно по каждому ожидаемому типу, либо значение сначала приводится к метаданным:

Если ТипЗнч(Контрагент) = Тип("СправочникСсылка.Контрагенты") Тогда

// ветка для контрагентов

ИначеЕсли ТипЗнч(Контрагент) = Тип("СправочникСсылка.Организации") Тогда

// ветка для организаций

КонецЕсли;

Отдельно обрабатывайте пустые значения. Для ссылочных типов пустое значение — это не Неопределено, а пустая ссылка конкретного типа, которую проверяют методом Пустая() или функцией ЗначениеЗаполнено(). Смешение этих проверок — частая причина ошибок: Неопределено не имеет метода Пустая(), а обращение к нему вызовет исключение.

Типичные ошибки
01
Сравнение ТипЗнч со строкой вместо Тип("Имя") — сравнение всегда ложно, так как сравниваются объект типа и строка
02
Проверка составного реквизита только на один тип — остальные варианты попадают в необработанную ветку
03
Вызов метода Пустая() у значения Неопределено — ошибка выполнения, сначала проверяйте на Неопределено
04
Определение типа реквизита по текущему значению вместо метаданных — пустой реквизит даёт неверный вывод

Определение типа в запросе и через СхемуЗапроса

В языке запросов тип значения проверяется оператором ССЫЛКА и функцией ТИПЗНАЧЕНИЯ(). Конструкция ГДЕ Таблица.Контрагент ССЫЛКА Справочник.Контрагенты отбирает только записи, где реквизит содержит ссылку указанного вида. Функция ТИПЗНАЧЕНИЯ(Поле) возвращает тип значения и используется в сравнении с литералом ТИП(Справочник.Контрагенты).

Для приведения составного реквизита к одному типу в запросе применяют ВЫРАЗИТЬ(Поле КАК Справочник.Контрагенты). Значения несовместимых типов превратятся в NULL, что нужно учитывать при соединениях. Через объект СхемаЗапроса типы полей можно анализировать программно при динамическом построении запросов, хотя на практике чаще достаточно метаданных.

Сравнение способов определения типа

Конфигуратор

Подходит для разового просмотра при разработке. Не работает в режиме предприятия и не применим в коде

ТипЗнч() + Тип()

Проверка типа конкретного значения в рантайме. Не показывает объявленный состав реквизита

Метаданные() + ОписаниеТипов

Даёт полный состав допустимых типов и квалификаторы. Требует обращения к объекту метаданных

Запрос (ССЫЛКА, ТИПЗНАЧЕНИЯ)

Фильтрация и приведение типов на уровне выборки. Не заменяет проверки в коде модулей

Практический сценарий: универсальная функция проверки

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

Функция ЭтоТип(Значение, ИмяТипа) Экспорт

Если Значение = Неопределено Тогда

Возврат Ложь;

КонецЕсли;

Возврат ТипЗнч(Значение) = Тип(ИмяТипа);

КонецФункции;

Обратите внимание на защиту от Неопределено: без неё вызов Тип() с некорректным именем или работа с пустым значением могут привести к ошибке. Также помните, что функция Тип() с несуществующим именем типа вызывает исключение, поэтому имя должно соответствовать реальному объекту конфигурации.

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

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

Полезная практика — временный вывод диагностики через Сообщить() или в журнал регистрации: выведите ТипЗнч(Значение) и само значение, чтобы увидеть, с чем реально работает код. В отладчике тип переменной виден в табло при наведении на переменную или в окне «Вычислить выражение» (Shift+F9).

Контрольные точки

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

Тип заполненного реквизита
Норма

ТипЗнч возвращает ожидаемый ссылочный или примитивный тип

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

Возвращается Неопределено или неожиданный тип — реквизит не заполнен или данные другого вида

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

Массив Типы() содержит все ожидаемые типы

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

Типа нет в списке — проверьте, тот ли реквизит найден методом Найти()

Поведение на пустом значении
Норма

Код корректно обрабатывает пустую ссылку и Неопределено без исключений

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

Ошибка выполнения на пустых данных — нет защитных проверок

Частые вопросы

Чем ТипЗнч отличается от Метаданные().Тип?

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

Как узнать тип реквизита табличной части?

Через метаданные: Метаданные().ТабличныеЧасти.Найти("ИмяТЧ").Реквизиты.Найти("ИмяРеквизита").Тип. Логика та же, что для шапки, только сначала обращаетесь к коллекции табличных частей, затем к её реквизитам.

Можно ли определить тип реквизита в режиме Предприятие без конфигуратора?

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

Что вернёт ТипЗнч для реквизита со значением NULL из запроса?

Для значения NULL, полученного из выборки запроса, ТипЗнч вернёт тип «Null». Это отдельный тип, отличный от Неопределено, и его нужно обрабатывать отдельно — например, проверкой Значение = NULL или функцией ЕСТЬNULL в самом запросе.

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

Используйте проверку через метод СсылкаСуществует или универсальный приём: попытаться получить метаданные значения — у примитивных типов метода Метаданные() нет. Также есть функции вида «ЭтоСсылка» в типовых общих модулях (например, ОбщегоНазначения.ЭтоСсылка в БСП), которые проверяют принадлежность типа к ссылочным.

Почему сравнение ТипЗнч(Значение) = "Строка" не работает?

Потому что ТипЗнч возвращает объект типа «Тип», а не строку. Сравнивать нужно с результатом функции Тип("Строка"). Сравнение объекта типа со строкой всегда даёт Ложь без сообщения об ошибке, что делает такую ошибку трудноуловимой.

Итог

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

Тип значения проверяется парой ТипЗнч() и Тип(), допустимые типы реквизита — через метаданные и ОписаниеТипов, в запросах — операторами ССЫЛКА и ТИПЗНАЧЕНИЯ. Всегда обрабатывайте Неопределено, NULL и пустые ссылки, и не судите о составе реквизита по его текущему значению.