Тип реквизита в 1С 8.3: где посмотреть и как проверить программно
Содержание
Тип реквизита в 1С 8.3 быстрее всего узнать в Конфигураторе: откройте дерево метаданных, найдите объект, выделите реквизит и нажмите Alt+Enter. В палитре свойств, в группе «Основные», будет строка «Тип». В работающей программе тип конкретного значения показывает функция ТипЗнч(), а объявленный тип реквизита хранит свойство Тип объекта метаданных — это ОписаниеТипов.
Типичная ситуация: пишете обработку, а поле «Контрагент» в документе может хранить и контрагента, и физлицо, и организацию. Пока не узнаете тип реквизита и не поймёте, составной он или нет, код будет падать на первом же «чужом» значении. Ниже — все способы, от просмотра в Конфигураторе до проверки в запросе. Всё описанное относится к платформе и одинаково работает в любой конфигурации: БП, ЗУП, УТ, ERP.
Где посмотреть тип реквизита в дереве метаданных
Самый надёжный источник — описание объекта в Конфигураторе. Там видно, что разработчик разрешил хранить в реквизите, а не что лежит в нём сейчас.
- Запустите Конфигуратор и откройте конфигурацию:
Конфигурация → Открыть конфигурацию. - Разверните ветку объекта, например
Документы → РеализацияТоваровУслуг → Реквизиты. - Выделите нужный реквизит и откройте палитру свойств:
Alt+Enterили двойной щелчок. - В строке «Тип» прочитайте значение.
Реквизиты табличной части лежат глубже: Документы → <Документ> → Табличные части → <ТЧ> → Реквизиты. Тип стандартных реквизитов (Наименование, Код, Номер, Дата) задаётся на отдельной вкладке. Его смотрят через кнопку «Стандартные реквизиты» в окне редактирования объекта.
💡 Чтобы не листать дерево, встаньте в него курсором и начните набирать имя объекта. Конфигуратор подсветит совпадение.
Что ещё показывает палитра, кроме типа
Рядом с типом стоят квалификаторы. Они так же важны, как сам тип:
- 🔤 Строка — длина и вид длины (фиксированная или переменная). Длина 0 означает неограниченную строку.
- 🔢 Число — общая длина и точность (знаки после запятой), флажок «Неотрицательное».
- 📅 Дата — состав: дата, время или дата и время.
- 🔗 Ссылка — например,
СправочникСсылка.КонтрагентыилиДокументСсылка.ПоступлениеТоваровУслуг.
Если нужно увидеть типы сразу у всех реквизитов, используйте Конфигурация → Отчет по конфигурации. Отчёт выгружает свойства объектов в текст или табличный документ. По нему удобно искать поиском по слову.
Составной и определяемый тип: что скрывается за строкой «Тип»
Иногда в строке «Тип» не одно значение, а перечень через запятую. Это составной тип данных. Откройте его кнопкой с многоточием: в окне редактирования типа стоит флажок «Составной тип данных» и отмечены все допустимые типы.
Определяемые типы
В современных типовых конфигурациях часто встречается запись вида ОпределяемыйТип.Организация или ОпределяемыйТип.ВладелецФайлов. Это не сам тип, а ссылка на общий объект метаданных. Реальный набор типов смотрите так:
- В дереве метаданных откройте
Общие → Определяемые типы. - Найдите элемент с тем же именем.
- Откройте его свойства — в строке «Тип» будет итоговый список.
Определяемые типы появились в платформе 8.3.3. Ими пользуется Библиотека стандартных подсистем: один и тот же реквизит в разных конфигурациях принимает разные наборы типов, а код библиотеки не меняется.
Характеристики
Ещё один вариант — Характеристика.<Имя плана видов характеристик>. Тогда список допустимых типов задан в свойстве «Тип значения характеристик» самого плана видов характеристик. Конкретный тип значения определяет выбранный вид характеристики.
Обратная задача: где используется тип
Бывает нужно узнать не тип реквизита, а наоборот — какие реквизиты ссылаются на справочник. Щёлкните объект правой кнопкой и выберите «Поиск ссылок на объект». Конфигуратор покажет все места, где объект указан в типе.
| Что видно в строке «Тип» | Что это значит | Где смотреть подробности |
|---|---|---|
| Один тип | Простой реквизит | Сразу в палитре |
| Несколько типов через запятую | Составной тип | Окно редактирования типа |
ОпределяемыйТип.… | Набор типов вынесен в общий объект | Общие → Определяемые типы |
Характеристика.… | Типы берутся из плана видов характеристик | Свойства плана видов характеристик |
Как узнать тип значения в отладчике
Метаданные говорят, что реквизит может хранить. Отладчик показывает, что в нём лежит в конкретный момент. Для составных реквизитов это разные вещи.
- В Конфигураторе откройте модуль, где обрабатывается значение.
- Поставьте точку останова на нужной строке:
F9. - Запустите отладку:
F5. - Когда выполнение остановится, выделите переменную и нажмите
Shift+F9— откроется окно «Вычислить выражение». - В колонке «Тип» будет тип текущего значения.
В том же окне можно вычислить любое выражение. Например, Объект.Контрагент покажет тип и значение реквизита, а ТипЗнч(Объект.Контрагент) — сам тип как объект.
Если переменную нужно отслеживать на протяжении нескольких шагов, добавьте её в табло: Отладка → Табло. Там тоже есть колонка с типом, и значения обновляются при каждом шаге.
Отладку запускайте на копии базы или в учебной базе. В рабочей базе код, остановленный на точке, держит транзакцию и блокировки — другие пользователи могут получить ошибку блокировки. В клиент-серверном варианте отладку серверного кода должен разрешить администратор сервера 1С.
Проверка типа значения в коде: ТипЗнч и Тип
В коде тип значения получают функцией ТипЗнч(). Сравнивают его с результатом функции Тип(), в которую передают имя типа строкой:
Если ТипЗнч(Объект.Контрагент) = Тип("СправочникСсылка.Контрагенты") Тогда
// работаем с контрагентом
ИначеЕсли ТипЗнч(Объект.Контрагент) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
// работаем с физлицом
КонецЕсли;
Для примитивных типов имена такие: "Строка", "Число", "Дата", "Булево", "Неопределено". Для ссылок — СправочникСсылка., ДокументСсылка., ПеречислениеСсылка., ПланСчетовСсылка. и так далее, плюс имя объекта.
Проверка по группе типов
Иногда важно не конкретное имя, а класс: «любая ссылка на документ». Для этого у менеджеров есть метод ТипВсеСсылки(), он возвращает ОписаниеТипов:
ТипЗначения = ТипЗнч(Значение);
Если Документы.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
Сообщить("Это ссылка на документ");
ИначеЕсли Справочники.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
Сообщить("Это ссылка на справочник");
КонецЕсли;
Проверка по своему списку типов
Когда допустимых типов три-четыре, цепочка из ИначеЕсли разрастается. Удобнее собрать список в ОписаниеТипов один раз и проверять одним условием:
ДопустимыеТипы = Новый ОписаниеТипов("СправочникСсылка.Контрагенты, СправочникСсылка.ФизическиеЛица");
Если Не ДопустимыеТипы.СодержитТип(ТипЗнч(Значение)) Тогда
ВызватьИсключение "Недопустимый тип значения";
КонецЕсли;
Такой приём особенно полезен в начале процедур общих модулей. Функция сразу отсекает неподходящий параметр, а не падает через двадцать строк на обращении к несуществующему реквизиту.
В конфигурациях на БСП есть готовая функция ОбщегоНазначения.ЭтоСсылка(Тип). Она отвечает, ссылочный ли тип вообще.
Имя объекта метаданных по значению
Чтобы получить имя справочника или документа, к которому относится ссылка, используйте Метаданные.НайтиПоТипу():
ОбъектМД = Метаданные.НайтиПоТипу(ТипЗнч(Значение));
Если ОбъектМД <> Неопределено Тогда
Сообщить(ОбъектМД.ПолноеИмя()); // например, Справочник.Контрагенты
КонецЕсли;
Для строки, числа или даты метод вернёт Неопределено: у примитивных типов нет объекта метаданных.
Объявленный тип реквизита: ОписаниеТипов из метаданных
ТипЗнч() работает со значением. Если значения ещё нет или нужно узнать все допустимые типы, читайте метаданные. Свойство Тип у реквизита возвращает ОписаниеТипов:
ОписаниеТипа = Метаданные.Документы.РеализацияТоваровУслуг.Реквизиты.Контрагент.Тип;
Для Каждого ТекТип Из ОписаниеТипа.Типы() Цикл
ОбъектМД = Метаданные.НайтиПоТипу(ТекТип);
Если ОбъектМД = Неопределено Тогда
Сообщить(Строка(ТекТип)); // примитивный тип
Иначе
Сообщить(ОбъектМД.ПолноеИмя());
КонецЕсли;
КонецЦикла;
Метод Типы() возвращает массив. Если в нём больше одного элемента, реквизит составной. Проверить, допускает ли реквизит конкретный тип, можно короче: ОписаниеТипа.СодержитТип(Тип("Строка")).
Квалификаторы читаются из того же объекта:
Если ОписаниеТипа.СодержитТип(Тип("Строка")) Тогда
Длина = ОписаниеТипа.КвалификаторыСтроки.Длина; // 0 — неограниченная
КонецЕсли;
Если ОписаниеТипа.СодержитТип(Тип("Число")) Тогда
Разрядность = ОписаниеТипа.КвалификаторыЧисла.Разрядность;
Дробная = ОписаниеТипа.КвалификаторыЧисла.РазрядностьДробнойЧасти;
КонецЕсли;
Путь к реквизиту табличной части длиннее: Метаданные.Документы.<Имя>.ТабличныеЧасти.<ТЧ>.Реквизиты.<Реквизит>.Тип. Стандартные реквизиты лежат в коллекции СтандартныеРеквизиты, общие реквизиты — в Метаданные.ОбщиеРеквизиты.
💡 ОписаниеТипов полезно не только для чтения. Метод ПривестиЗначение() приводит значение к допустимому типу: строку обрежет до нужной длины, а недопустимое значение заменит пустым.
Составные реквизиты: как не ошибиться с пустым значением
У составного реквизита есть особенность, на которой спотыкаются чаще всего. Пустое значение у него — Неопределено, а не пустая ссылка. У реквизита с одним ссылочным типом пустое значение — ПустаяСсылка() этого типа.
Поэтому проверка Объект.Контрагент = Справочники.Контрагенты.ПустаяСсылка() для составного реквизита не сработает на незаполненном поле. Универсальный способ — функция ЗначениеЗаполнено(). Она корректно отвечает и для Неопределено, и для пустой ссылки, и для нулевого числа.
Порядок разбора составного значения:
- Проверьте заполненность через
ЗначениеЗаполнено(). - Определите тип через
ТипЗнч(). - Только после этого обращайтесь к реквизитам через точку.
Если сразу написать Объект.Контрагент.ИНН, а в поле окажется организация без такого реквизита, код упадёт с ошибкой «Поле объекта не обнаружено (ИНН)».
Тип поля в запросе и схеме компоновки данных
В тексте запроса
В языке запросов есть свои средства для проверки типа:
- 🔎
ТИПЗНАЧЕНИЯ(Поле)— возвращает тип значения поля; - 🔎
ТИП(Документ.РеализацияТоваровУслуг)— тип для сравнения; - 🔎
Поле ССЫЛКА Документ.РеализацияТоваровУслуг— короткая проверка «ссылается ли поле на эту таблицу»; - 🔎
ВЫРАЗИТЬ(Поле КАК Справочник.Контрагенты)— приведение к одному типу.
Пример для регистра бухгалтерии в БП 3.0:
ВЫБРАТЬ
Хозрасчетный.Регистратор КАК Регистратор,
ТИПЗНАЧЕНИЯ(Хозрасчетный.Регистратор) КАК ТипРегистратора
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
ГДЕ
Хозрасчетный.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
Обращение через точку к составному полю без ВЫРАЗИТЬ замедляет запрос. Платформа соединяет таблицу со всеми таблицами из состава типа. У регистратора таких таблиц бывают десятки. Если нужен реквизит одного документа, сначала приведите поле: ВЫРАЗИТЬ(Хозрасчетный.Регистратор КАК Документ.РеализацияТоваровУслуг).Контрагент.
Тип колонок результата
Типы колонок уже выполненного запроса доступны в коде:
Результат = Запрос.Выполнить();
Для Каждого Колонка Из Результат.Колонки Цикл
Сообщить(Колонка.Имя + ": " + Строка(Колонка.ТипЗначения));
КонецЦикла;
ТипЗначения колонки — тоже ОписаниеТипов. После левого соединения в нём появляется Null: поле может не найтись во второй таблице. Учитывайте это при выгрузке в таблицу значений и при сравнениях.
В схеме компоновки данных
В СКД типы полей набора данных подтягиваются из запроса автоматически. Если тип определился неверно или поле вычисляемое, задайте его вручную в колонке «Тип значения» на вкладке «Наборы данных» или «Вычисляемые поля». Для параметров СКД тип указывается на вкладке «Параметры». От этого зависит, какой выбор пользователь увидит в настройках отчёта: список справочника, календарь или поле для числа.
Частые ошибки при работе с типами
Отдельно о неограниченных строках. В Конфигураторе их видно по длине 0 в палитре свойств. Если реквизит нужен для поиска или отбора в запросах, задайте ему конкретную длину ещё на этапе разработки.