Работа с составными типами данных — ежедневная задача разработчика на платформе «1С:Предприятие 8»; Реквизиты объектов метаданных (справочников‚ документов‚ регистров) часто имеют составной тип‚ включающий несколько ссылочных типов (например‚ СправочникСсылка.Контрагенты‚ СправочникСсылка.Сотрудники) и примитивные типы (Строка‚ Число). В запросах к базе данных необходимо уметь определять‚ значение какого именно типа хранится в конкретной записи‚ чтобы строить корректные отборы‚ соединения и вычисляемые поля.
В языке запросов 1С для решения этой задачи предназначены три основных инструмента:
- Функция ТИПЗНАЧЕНИЯ — определяет тип конкретного значения в строке результата.
- Функция ТИП — возвращает описание типа по его строковому имени для использования в сравнениях.
- Оператор ССЫЛКА — проверяет‚ является ли выражение ссылкой на указанную таблицу (объект метаданных).
Функция ТИПЗНАЧЕНИЯ (TYPEVALUE)
Это основной инструмент диагностики и ветвления логики по типам. Она полностью аналогична функции ТипЗнч встроенного языка.
Синтаксис
ТИПЗНАЧЕНИЯ(Выражение) Параметр: Выражение — поле таблицы‚ параметр запроса‚ вычисляемое выражение или результат другой функции.
Результат: Значение системного типа Тип. Это не строка‚ а специальный объект типа‚ с которым можно сравнивать‚ группировать и передавать в параметры.
Пример: Диагностика составного реквизита
Рассмотрим документ РеализацияТоваров с реквизитом Контрагент составного типа: СправочникСсылка.Контрагенты‚ СправочникСсылка.Сотрудники‚ СправочникСсылка.ФизическиеЛица.
ВЫБРАТЬ
Реализация.Ссылка КАК Документ‚
Реализация.Контрагент КАК Контрагент‚
ТИПЗНАЧЕНИЯ(Реализация.Контрагент) КАК ТипКонтрагента
ИЗ
Документ.РеализацияТоваров КАК Реализация Результат запроса вернет колонку ТипКонтрагента‚ в которой для каждой строки будет указано точное значение типа: СправочникСсылка.Контрагенты‚ СправочникСсылка.Сотрудники и т.д. Это критически важно для отладки и анализа данных.
Использование в условии отбора (ГДЕ)
Чтобы отобрать только те документы‚ где контрагентом является сотрудник‚ сравниваем результат ТИПЗНАЧЕНИЯ с эталонным типом‚ полученным через функцию ТИП:
ВЫБРАТЬ
Реализация.Ссылка‚
Реализация.Контрагент
ИЗ
Документ.РеализацияТоваров КАК Реализация
ГДЕ
ТИПЗНАЧЕНИЯ(Реализация.Контрагент) = ТИП(СправочникСсылка.Сотрудники) Функция ТИП (TYPE)
Функция служит для получения значения типа Тип по имени типа метаданных или примитивного типа. Она необходима‚ так как в языке запросов нельзя написать имя типа напрямую как литерал (в отличие от встроенного языка‚ где можно написать Тип("СправочникСсылка.Контрагенты")).
ТИП(ИмяТипа) Параметр: ИмяТипа — строковое литеральное имя типа (без кавычек в тексте запроса)‚ например: СправочникСсылка.Контрагенты‚ ДокументСсылка.РеализацияТоваров‚ Строка‚ Число‚ Дата.
Особенности
- Имя типа пишется без кавычек прямо в скобках функции.
- Поддерживаются все типы платформы: ссылочные (СправочникСсылка‚ ДокументСсылка‚ ПеречислениеСсылка и др.)‚ объектные (СправочникОбъект‚ ДокументОбъект)‚ примитивные (Строка‚ Число‚ Булево‚ Дата) и системные (NULL‚ Неопределено).
- Результат функции — значение типа
Тип‚ пригодное для сравнения с результатомТИПЗНАЧЕНИЯ.
Оператор ССЫЛКА (REF)
Оператор ССЫЛКА — это удобный синтаксический сахар для проверки: «Является ли это значение ссылкой на конкретный объект метаданных?». Он возвращает Истина или Ложь.
Выражение ССЫЛКА ИмяТаблицы ИмяТаблицы — имя таблицы в терминах языка запросов (обычно совпадает с полным именем объекта метаданных: Справочник.Контрагенты‚ Документ.РеализацияТоваров).
Пример
ВЫБРАТЬ
Реализация.Ссылка‚
Реализация.Контрагент
ИЗ
Документ.РеализацияТоваров КАК Реализация
ГДЕ
Реализация.Контрагент ССЫЛКА Справочник.Сотрудники Важное отличие от ТИПЗНАЧЕНИЯ = ТИП(…):
ССЫЛКАпроверяет принадлежность к таблице (объекту метаданных). Если у вас два справочника с одинаковой структурой‚ но разными именами‚ССЫЛКАих различает.ТИПЗНАЧЕНИЯ = ТИП(...)проверяет точное совпадение типа значения. Для ссылочных типов это практически то же самое‚ ноТИПЗНАЧЕНИЯработает единообразно и для примитивных типов (Строка‚Число)‚ где операторССЫЛКАнеприменим.
Продвинутые сценарии использования
Конструкция ВЫБОР (CASE) для приведения типов
Частая задача: получить представление (наименование) объекта‚ не зная заранее‚ ссылка на какой справочник хранится в поле. Прямое обращение к реквизиту Наименование у составного типа в выборке приведет к ошибке или NULL для несовпадающих типов. Решение — явное приведение через ВЫБОР:
ВЫБРАТЬ
Реализация.Ссылка‚
ВЫБОР
КОГДА Реализация.Контрагент ССЫЛКА Справочник.Контрагенты
ТОГДА Реализация.Контрагент.Наименование
КОГДА Реализация.Контрагент ССЫЛКА Справочник.Сотрудники
ТОГДА Реализация.Контрагент.ФИО
КОГДА Реализация.Контрагент ССЫЛКА Справочник.ФизическиеЛица
ТОГДА Реализация.Контрагент.Фамилия + " " + Реализация.Контрагент.Имя
ИНАЧЕ ""
КОНЕЦ КАК НаименованиеКонтрагента
ИЗ
Документ.РеализацияТоваров КАК Реализация Левое соединение (ЛЕВОЕ СОЕДИНЕНИЕ) с разными таблицами
Если нужно подтянуть данные из разных таблиц в зависимости от типа ссылки‚ используют несколько левых соединений с условием на тип:
ВЫБРАТЬ
Реализация.Ссылка‚
ЕСТЬNULL(Контрагенты.Наименование‚ "") + ЕСТЬNULL(Сотрудники.ФИО‚ "") КАК Наименование
ИЗ
Документ.РеализацияТоваров КАК Реализация
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Реализация.Контрагент = Контрагенты.Ссылка
И Реализация.Контрагент ССЫЛКА Справочник.Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
ПО Реализация;Контрагент = Сотрудники.Ссылка
И Реализация.Контрагент ССЫЛКА Справочник.Сотрудники Условие И Реализация.Контрагент ССЫЛКА Справочник.Контрагенты в условии соединения (ПО) позволяет оптимизатору запросов отсекать лишние строки заранее‚ что значительно ускоряет выполнение на больших объемах данных.
Работа с NULL и Неопределено
Если реквизит не заполнен‚ ТИПЗНАЧЕНИЯ вернет системный тип NULL (для полей БД) или Неопределено (для параметров/переменных).
ВЫБРАТЬ
Реализация.Ссылка‚
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(Реализация.Контрагент) = ТИП(NULL)
ТОГДА "Не заполнено"
ИНАЧЕ "Заполнено"
КОНЕЦ КАК СтатусЗаполнения
ИЗ
Документ.РеализацияТоваров КАК Реализация Производительность и лучшие практики
- Используйте оператор ССЫЛКА в условиях отбора (ГДЕ) и соединениях (ПО). Он читается легче и часто лучше оптимизируется платформой‚ чем сравнение с
ТИП. - Избегайте функции ТИПЗНАЧЕНИЯ в полях выборки без необходимости. Возврат типа в клиентское приложение увеличивает трафик и объем передаваемых данных; Используйте её в
ГДЕ‚ВЫБОР‚ПО. - Параметризация типов. Если тип проверяется динамически (передается извне)‚ передавайте в параметр запроса значение типа
Тип(полученное встроенным языком черезТип("СправочникСсылка.Контрагенты"))‚ а не строку с именем. Тогда в запросе можно писать:ГДЕ ТИПЗНАЧЕНИЯ(Поле) = &ПараметрТип. - Индексация. Поля составных типов индексируются целиком. Отбор по типу (
ССЫЛКА) позволяет СУБД использовать индекс эффективно‚ так как значения разных типов физически хранятся в одном столбце‚ но имеют разные диапазоны значений (или специальные маркеры типа).
Сводная таблица отличий
| Инструмент | Возвращает | Область применения | Пример |
|---|---|---|---|
| ТИПЗНАЧЕНИЯ(Выражение) | Значение типа Тип | Универсальное определение типа любого выражения (ссылка‚ примитив‚ NULL). Используется в ВЫБОР‚ сравнениях‚ группировках. | ТИПЗНАЧЕНИЯ(Реквизит) = ТИП(Строка) |
| ТИП(ИмяТипа) | Значение типа Тип | Получение эталонного значения типа для сравнения. Имя типа пишется без кавычек. | ТИП(СправочникСсылка.Номенклатура) |
| Выражение ССЫЛКА Таблица | Истина / Ложь | Проверка‚ является ли значение ссылкой на конкретный объект метаданных (таблицу). Только для ссылочных типов. Оптимален для ГДЕ и ПО. | Реквизит ССЫЛКА Справочник.Номенклатура |
Умение правильно определять тип ссылки в запросе 1С — залог надежности и производительности прикладного решения. Комбинация ТИПЗНАЧЕНИЯ (для получения факта)‚ ТИП (для получения эталона) и оператора ССЫЛКА (для удобной и быстрой проверки принадлежности к таблице) покрывает 100% сценариев работы с составными типами данных. Начинающим разработчикам рекомендуется привыкать использовать ССЫЛКА в условиях отбора и соединений‚ а ТИПЗНАЧЕНИЯ — в конструкциях ВЫБОР и для сложной диагностики.