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