Тип реквизита в 1С 8.3: где посмотреть и как проверить программно

· 9 мин

Содержание

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

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

Где посмотреть тип реквизита в дереве метаданных

Самый надёжный источник — описание объекта в Конфигураторе. Там видно, что разработчик разрешил хранить в реквизите, а не что лежит в нём сейчас.

  1. Запустите Конфигуратор и откройте конфигурацию: Конфигурация → Открыть конфигурацию.
  2. Разверните ветку объекта, например Документы → РеализацияТоваровУслуг → Реквизиты.
  3. Выделите нужный реквизит и откройте палитру свойств: Alt+Enter или двойной щелчок.
  4. В строке «Тип» прочитайте значение.

Реквизиты табличной части лежат глубже: Документы → <Документ> → Табличные части → <ТЧ> → Реквизиты. Тип стандартных реквизитов (Наименование, Код, Номер, Дата) задаётся на отдельной вкладке. Его смотрят через кнопку «Стандартные реквизиты» в окне редактирования объекта.

💡 Чтобы не листать дерево, встаньте в него курсором и начните набирать имя объекта. Конфигуратор подсветит совпадение.

Что ещё показывает палитра, кроме типа

Рядом с типом стоят квалификаторы. Они так же важны, как сам тип:

  • 🔤 Строка — длина и вид длины (фиксированная или переменная). Длина 0 означает неограниченную строку.
  • 🔢 Число — общая длина и точность (знаки после запятой), флажок «Неотрицательное».
  • 📅 Дата — состав: дата, время или дата и время.
  • 🔗 Ссылка — например, СправочникСсылка.Контрагенты или ДокументСсылка.ПоступлениеТоваровУслуг.

Если нужно увидеть типы сразу у всех реквизитов, используйте Конфигурация → Отчет по конфигурации. Отчёт выгружает свойства объектов в текст или табличный документ. По нему удобно искать поиском по слову.

Составной и определяемый тип: что скрывается за строкой «Тип»

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

Определяемые типы

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

  1. В дереве метаданных откройте Общие → Определяемые типы.
  2. Найдите элемент с тем же именем.
  3. Откройте его свойства — в строке «Тип» будет итоговый список.

Определяемые типы появились в платформе 8.3.3. Ими пользуется Библиотека стандартных подсистем: один и тот же реквизит в разных конфигурациях принимает разные наборы типов, а код библиотеки не меняется.

Характеристики

Ещё один вариант — Характеристика.<Имя плана видов характеристик>. Тогда список допустимых типов задан в свойстве «Тип значения характеристик» самого плана видов характеристик. Конкретный тип значения определяет выбранный вид характеристики.

Обратная задача: где используется тип

Бывает нужно узнать не тип реквизита, а наоборот — какие реквизиты ссылаются на справочник. Щёлкните объект правой кнопкой и выберите «Поиск ссылок на объект». Конфигуратор покажет все места, где объект указан в типе.

Что видно в строке «Тип»Что это значитГде смотреть подробности
Один типПростой реквизитСразу в палитре
Несколько типов через запятуюСоставной типОкно редактирования типа
ОпределяемыйТип.…Набор типов вынесен в общий объектОбщие → Определяемые типы
Характеристика.…Типы берутся из плана видов характеристикСвойства плана видов характеристик

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

Метаданные говорят, что реквизит может хранить. Отладчик показывает, что в нём лежит в конкретный момент. Для составных реквизитов это разные вещи.

  1. В Конфигураторе откройте модуль, где обрабатывается значение.
  2. Поставьте точку останова на нужной строке: F9.
  3. Запустите отладку: F5.
  4. Когда выполнение остановится, выделите переменную и нажмите Shift+F9 — откроется окно «Вычислить выражение».
  5. В колонке «Тип» будет тип текущего значения.

В том же окне можно вычислить любое выражение. Например, Объект.Контрагент покажет тип и значение реквизита, а ТипЗнч(Объект.Контрагент) — сам тип как объект.

Если переменную нужно отслеживать на протяжении нескольких шагов, добавьте её в табло: Отладка → Табло. Там тоже есть колонка с типом, и значения обновляются при каждом шаге.

Отладку запускайте на копии базы или в учебной базе. В рабочей базе код, остановленный на точке, держит транзакцию и блокировки — другие пользователи могут получить ошибку блокировки. В клиент-серверном варианте отладку серверного кода должен разрешить администратор сервера 1С.

Проверка типа значения в коде: ТипЗнч и Тип

В коде тип значения получают функцией ТипЗнч(). Сравнивают его с результатом функции Тип(), в которую передают имя типа строкой:

Если ТипЗнч(Объект.Контрагент) = Тип("СправочникСсылка.Контрагенты") Тогда
    // работаем с контрагентом
ИначеЕсли ТипЗнч(Объект.Контрагент) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
    // работаем с физлицом
КонецЕсли;

Для примитивных типов имена такие: "Строка", "Число", "Дата", "Булево", "Неопределено". Для ссылок — СправочникСсылка., ДокументСсылка., ПеречислениеСсылка., ПланСчетовСсылка. и так далее, плюс имя объекта.

Проверка по группе типов

Иногда важно не конкретное имя, а класс: «любая ссылка на документ». Для этого у менеджеров есть метод ТипВсеСсылки(), он возвращает ОписаниеТипов:

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

Если Документы.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
    Сообщить("Это ссылка на документ");
ИначеЕсли Справочники.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
    Сообщить("Это ссылка на справочник");
КонецЕсли;

Проверка по своему списку типов

Когда допустимых типов три-четыре, цепочка из ИначеЕсли разрастается. Удобнее собрать список в ОписаниеТипов один раз и проверять одним условием:

ДопустимыеТипы = Новый ОписаниеТипов("СправочникСсылка.Контрагенты, СправочникСсылка.ФизическиеЛица");

Если Не ДопустимыеТипы.СодержитТип(ТипЗнч(Значение)) Тогда
    ВызватьИсключение "Недопустимый тип значения";
КонецЕсли;

Такой приём особенно полезен в начале процедур общих модулей. Функция сразу отсекает неподходящий параметр, а не падает через двадцать строк на обращении к несуществующему реквизиту.

В конфигурациях на БСП есть готовая функция ОбщегоНазначения.ЭтоСсылка(Тип). Она отвечает, ссылочный ли тип вообще.

Имя объекта метаданных по значению

Чтобы получить имя справочника или документа, к которому относится ссылка, используйте Метаданные.НайтиПоТипу():

ОбъектМД = Метаданные.НайтиПоТипу(ТипЗнч(Значение));
Если ОбъектМД <> Неопределено Тогда
    Сообщить(ОбъектМД.ПолноеИмя()); // например, Справочник.Контрагенты
КонецЕсли;

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

Объявленный тип реквизита: ОписаниеТипов из метаданных

ТипЗнч() работает со значением. Если значения ещё нет или нужно узнать все допустимые типы, читайте метаданные. Свойство Тип у реквизита возвращает ОписаниеТипов:

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

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

Метод Типы() возвращает массив. Если в нём больше одного элемента, реквизит составной. Проверить, допускает ли реквизит конкретный тип, можно короче: ОписаниеТипа.СодержитТип(Тип("Строка")).

Квалификаторы читаются из того же объекта:

Если ОписаниеТипа.СодержитТип(Тип("Строка")) Тогда
    Длина = ОписаниеТипа.КвалификаторыСтроки.Длина; // 0 — неограниченная
КонецЕсли;

Если ОписаниеТипа.СодержитТип(Тип("Число")) Тогда
    Разрядность = ОписаниеТипа.КвалификаторыЧисла.Разрядность;
    Дробная = ОписаниеТипа.КвалификаторыЧисла.РазрядностьДробнойЧасти;
КонецЕсли;

Путь к реквизиту табличной части длиннее: Метаданные.Документы.<Имя>.ТабличныеЧасти.<ТЧ>.Реквизиты.<Реквизит>.Тип. Стандартные реквизиты лежат в коллекции СтандартныеРеквизиты, общие реквизиты — в Метаданные.ОбщиеРеквизиты.

💡 ОписаниеТипов полезно не только для чтения. Метод ПривестиЗначение() приводит значение к допустимому типу: строку обрежет до нужной длины, а недопустимое значение заменит пустым.

Составные реквизиты: как не ошибиться с пустым значением

У составного реквизита есть особенность, на которой спотыкаются чаще всего. Пустое значение у него — Неопределено, а не пустая ссылка. У реквизита с одним ссылочным типом пустое значение — ПустаяСсылка() этого типа.

Поэтому проверка Объект.Контрагент = Справочники.Контрагенты.ПустаяСсылка() для составного реквизита не сработает на незаполненном поле. Универсальный способ — функция ЗначениеЗаполнено(). Она корректно отвечает и для Неопределено, и для пустой ссылки, и для нулевого числа.

Порядок разбора составного значения:

  1. Проверьте заполненность через ЗначениеЗаполнено().
  2. Определите тип через ТипЗнч().
  3. Только после этого обращайтесь к реквизитам через точку.

Если сразу написать Объект.Контрагент.ИНН, а в поле окажется организация без такого реквизита, код упадёт с ошибкой «Поле объекта не обнаружено (ИНН)».

Тип поля в запросе и схеме компоновки данных

В тексте запроса

В языке запросов есть свои средства для проверки типа:

  • 🔎 ТИПЗНАЧЕНИЯ(Поле) — возвращает тип значения поля;
  • 🔎 ТИП(Документ.РеализацияТоваровУслуг) — тип для сравнения;
  • 🔎 Поле ССЫЛКА Документ.РеализацияТоваровУслуг — короткая проверка «ссылается ли поле на эту таблицу»;
  • 🔎 ВЫРАЗИТЬ(Поле КАК Справочник.Контрагенты) — приведение к одному типу.

Пример для регистра бухгалтерии в БП 3.0:

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

Обращение через точку к составному полю без ВЫРАЗИТЬ замедляет запрос. Платформа соединяет таблицу со всеми таблицами из состава типа. У регистратора таких таблиц бывают десятки. Если нужен реквизит одного документа, сначала приведите поле: ВЫРАЗИТЬ(Хозрасчетный.Регистратор КАК Документ.РеализацияТоваровУслуг).Контрагент.

Тип колонок результата

Типы колонок уже выполненного запроса доступны в коде:

Результат = Запрос.Выполнить();
Для Каждого Колонка Из Результат.Колонки Цикл
    Сообщить(Колонка.Имя + ": " + Строка(Колонка.ТипЗначения));
КонецЦикла;

ТипЗначения колонки — тоже ОписаниеТипов. После левого соединения в нём появляется Null: поле может не найтись во второй таблице. Учитывайте это при выгрузке в таблицу значений и при сравнениях.

В схеме компоновки данных

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

Частые ошибки при работе с типами

Диагностика: выберите симптом

Отдельно о неограниченных строках. В Конфигураторе их видно по длине 0 в палитре свойств. Если реквизит нужен для поиска или отбора в запросах, задайте ему конкретную длину ещё на этапе разработки.

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

Можно ли узнать тип реквизита, не открывая Конфигуратор?
Пользователю без прав разработчика — нет, интерфейс 1С:Предприятия тип не показывает. Разработчик может выполнить код с ТипЗнч или прочитать Метаданные из внешней обработки.
Чем ТипЗнч отличается от свойства Тип у метаданных?
ТипЗнч возвращает тип конкретного значения в момент выполнения. Свойство Тип у реквизита в метаданных возвращает ОписаниеТипов — все типы, которые реквизит допускает.
Как получить имя типа строкой для записи в лог или файл?
Для ссылок — Метаданные.НайтиПоТипу(ТипЗнч(Значение)).ПолноеИмя(). Для обмена в XML подойдёт XMLТипЗнч(Значение).ИмяТипа: вернёт имя вида CatalogRef.Контрагенты.
Где посмотреть тип реквизита формы?
В Конфигураторе откройте форму, перейдите на вкладку «Реквизиты» редактора формы и откройте свойства реквизита. Строка «Тип» там такая же, как у реквизитов объекта.
Почему в одной базе реквизит простой, а в другой составной?
Чаще всего тип задан через определяемый тип, а его состав зависит от конфигурации и встроенных библиотек. Откройте Общие → Определяемые типы в каждой базе и сравните.