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

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

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

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

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

Главная сложность в том, что реквизит в 1С может иметь составной тип — например, реквизит «Контрагент» часто допускает ссылки на несколько справочников сразу. Поэтому корректная проверка должна учитывать не один тип, а список допустимых. Ниже разобраны рабочие способы с примерами кода и типичными ошибками.

Проверка типа функциями ТипЗначения() и Тип()

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

Типичный пример проверки реквизита документа:

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

// обработка ссылки на справочник Контрагенты

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

// обработка ссылки на справочник Организации

КонецЕсли;

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

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

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

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

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

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

МетаРеквизит = МетаДок.Реквизиты.Найти("Контрагент");

Если МетаРеквизит <> Неопределено Тогда

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

Сообщить(Строка(ТекТип));

КонецЦикла;

КонецЕсли;

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

Тот же подход работает для табличных частей: сначала получают метаданные табличной части через МетаДок.ТабличныеЧасти.Найти("Товары"), затем обращаются к её коллекции реквизитов. Для стандартных реквизитов (Ссылка, Номер, Дата, Проведен) типы фиксированы платформой и отдельно в коллекции СтандартныеРеквизиты.

Порядок действий через метаданные
  1. 1
    Получите объект метаданных: Метаданные.Документы.ИмяДокумента (или Справочники, ПланыСчетов и т.д.)
  2. 2
    Найдите реквизит: коллекция Реквизиты.Найти("ИмяРеквизита") — не забудьте проверить результат на Неопределено
  3. 3
    Обратитесь к свойству Тип — это объект ОписаниеТипов
  4. 4
    Переберите массив Типы() для списка допустимых типов или прочитайте квалификаторы для примитивных типов

Проверка типа в конфигураторе без программирования

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

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

Дополнительно полезно окно «Дополнительно» в свойствах реквизита — там указывается, проверяется ли заполнение и как ведёт себя значение при обмене. Если тип реквизита недавно меняли, стоит проверить историю хранилища конфигурации, чтобы понять, какие данные могли остаться в старом формате.

Определение типа в режиме предприятия: отладчик и консоль запросов

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

Через консоль запросов тип значения в запросе определяется функцией языка запросов ТИПЗНАЧЕНИЯ():

ВЫБРАТЬ

ТИПЗНАЧЕНИЯ(РеализацияТоваровУслуг.Контрагент) КАК ТипКонтрагента

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

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

bsl
ВЫБРАТЬ
	Реализация.Контрагент КАК Контрагент
ИЗ
	Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
	Реализация.Контрагент ССЫЛКА Справочник.Контрагенты

Проверка значения на допустимость перед записью

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

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

Если ОписаниеТипа.СодержитТип(ТипЗначения(НовоеЗначение)) Тогда

ДокументОбъект.Контрагент = НовоеЗначение;

Иначе

Сообщить("Недопустимый тип значения для реквизита Контрагент");

КонецЕсли;

Учтите, что СодержитТип() проверяет только тип, но не квалификаторы: строка длиннее допустимой пройдёт проверку, но при записи будет усечена или вызовет ошибку в зависимости от контекста. Для строк и чисел дополнительно сверяйте длину и разрядность через квалификаторы описания типов.

Ещё один полезный приём — метод ПривестиЗначение(Значение) у «ОписаниеТипов». Он приводит значение к описанному типу: несовместимые значения заменяются на значение по умолчанию (пустая ссылка, 0, пустая строка). Это удобно при загрузке данных из внешних источников, когда тип входного значения заранее неизвестен.

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

Сравнение способов: что выбрать в разных ситуациях

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

Сравнение вариантов

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

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

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

Полный список допустимых типов и квалификаторов. Требует больше кода, но даёт исчерпывающий ответ

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

Разовый просмотр типа без программирования. Не подходит для автоматизации и работы в режиме предприятия

Отладчик и Табло

Диагностика фактического значения в конкретном объекте. Требует права на отладку

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

Анализ типов сразу по множеству записей. Только для чтения, без квалификаторов

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

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

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

Результат ТипЗначения()
Норма

Возвращается тип, совпадающий с ожидаемым объектом конфигурации

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

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

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

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

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

Реквизит не найден (Найти вернул Неопределено) — ошибка в имени или реквизит в табличной части

Присвоение значения после проверки СодержитТип()
Норма

Запись объекта проходит без исключений

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

Ошибка несоответствия типов при записи — проверьте квалификаторы и составной тип

Частые вопросы о проверке типов реквизитов

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

Через метаданные: получите ОписаниеТипов реквизита и посмотрите размер массива Типы(). Если элементов больше одного — тип составной. В конфигураторе это видно в палитре свойств по надписи «Составной тип данных» в поле «Тип».

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

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

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

Через метаданные: Метаданные.Документы.ИмяДокумента.ТабличныеЧасти.Найти("ИмяТЧ").Реквизиты.Найти("ИмяРеквизита").Тип. Дальше работа с ОписаниеТипов такая же, как для шапки: Типы(), квалификаторы, СодержитТип().

Почему Тип("СправочникСсылка.Партнеры") вызывает ошибку?

Объекта с таким именем нет в вашей конфигурации — функция Тип() не проверяет существование и сразу вызывает исключение. Перед обращением проверьте наличие объекта: Метаданные.Справочники.Найти("Партнеры") <> Неопределено.

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

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

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

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

Итог

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

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