Работа с составными типами данных в запросах 1С: функции ТИПЗНАЧЕНИЯ, ТИП и оператор ССЫЛКА

Разбираем составные типы 1С: ссылочные и примитивные. Учимся легко определять тип значения в запросе и пишем код без ошибок и страха.

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Работа с составными типами данных — ежедневная задача разработчика на платформе «1С:Предприятие 8»; Реквизиты объектов метаданных (справочников‚ документов‚ регистров) часто имеют составной тип‚ включающий несколько ссылочных типов (например‚ СправочникСсылка.Контрагенты‚ СправочникСсылка.Сотрудники) и примитивные типы (Строка‚ Число). В запросах к базе данных необходимо уметь определять‚ значение какого именно типа хранится в конкретной записи‚ чтобы строить корректные отборы‚ соединения и вычисляемые поля.

В языке запросов 1С для решения этой задачи предназначены три основных инструмента:

  • Функция ТИПЗНАЧЕНИЯ — определяет тип конкретного значения в строке результата.
  • Функция ТИП — возвращает описание типа по его строковому имени для использования в сравнениях.
  • Оператор ССЫЛКА — проверяет‚ является ли выражение ссылкой на указанную таблицу (объект метаданных).

Функция ТИПЗНАЧЕНИЯ (TYPEVALUE)

Это основной инструмент диагностики и ветвления логики по типам. Она полностью аналогична функции ТипЗнч встроенного языка.

Синтаксис

ТИПЗНАЧЕНИЯ(Выражение)

Параметр: Выражение — поле таблицы‚ параметр запроса‚ вычисляемое выражение или результат другой функции.

Результат: Значение системного типа Тип. Это не строка‚ а специальный объект типа‚ с которым можно сравнивать‚ группировать и передавать в параметры.

Пример: Диагностика составного реквизита

Рассмотрим документ РеализацияТоваров с реквизитом Контрагент составного типа: СправочникСсылка.Контрагенты‚ СправочникСсылка.Сотрудники‚ СправочникСсылка.ФизическиеЛица.

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

Результат запроса вернет колонку ТипКонтрагента‚ в которой для каждой строки будет указано точное значение типа: СправочникСсылка.Контрагенты‚ СправочникСсылка.Сотрудники и т.д. Это критически важно для отладки и анализа данных.

Использование в условии отбора (ГДЕ)

Чтобы отобрать только те документы‚ где контрагентом является сотрудник‚ сравниваем результат ТИПЗНАЧЕНИЯ с эталонным типом‚ полученным через функцию ТИП:

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

Функция ТИП (TYPE)

Функция служит для получения значения типа Тип по имени типа метаданных или примитивного типа. Она необходима‚ так как в языке запросов нельзя написать имя типа напрямую как литерал (в отличие от встроенного языка‚ где можно написать Тип("СправочникСсылка.Контрагенты")).

ТИП(ИмяТипа)

Параметр: ИмяТипа — строковое литеральное имя типа (без кавычек в тексте запроса)‚ например: СправочникСсылка.Контрагенты‚ ДокументСсылка.РеализацияТоваров‚ Строка‚ Число‚ Дата.

Особенности

  • Имя типа пишется без кавычек прямо в скобках функции.
  • Поддерживаются все типы платформы: ссылочные (СправочникСсылка‚ ДокументСсылка‚ ПеречислениеСсылка и др.)‚ объектные (СправочникОбъект‚ ДокументОбъект)‚ примитивные (Строка‚ Число‚ Булево‚ Дата) и системные (NULL‚ Неопределено).
  • Результат функции — значение типа Тип‚ пригодное для сравнения с результатом ТИПЗНАЧЕНИЯ.

Оператор ССЫЛКА (REF)

Оператор ССЫЛКА — это удобный синтаксический сахар для проверки: «Является ли это значение ссылкой на конкретный объект метаданных?». Он возвращает Истина или Ложь.

Выражение ССЫЛКА ИмяТаблицы

ИмяТаблицы — имя таблицы в терминах языка запросов (обычно совпадает с полным именем объекта метаданных: Справочник.Контрагенты‚ Документ.РеализацияТоваров).

Пример

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

Важное отличие от ТИПЗНАЧЕНИЯ = ТИП(…):

  • ССЫЛКА проверяет принадлежность к таблице (объекту метаданных). Если у вас два справочника с одинаковой структурой‚ но разными именами‚ ССЫЛКА их различает.
  • ТИПЗНАЧЕНИЯ = ТИП(...) проверяет точное совпадение типа значения. Для ссылочных типов это практически то же самое‚ но ТИПЗНАЧЕНИЯ работает единообразно и для примитивных типов (Строка‚ Число)‚ где оператор ССЫЛКА неприменим.

Продвинутые сценарии использования

Конструкция ВЫБОР (CASE) для приведения типов

Частая задача: получить представление (наименование) объекта‚ не зная заранее‚ ссылка на какой справочник хранится в поле. Прямое обращение к реквизиту Наименование у составного типа в выборке приведет к ошибке или NULL для несовпадающих типов. Решение — явное приведение через ВЫБОР:

ВЫБРАТЬ
 Реализация.Ссылка‚
 ВЫБОР
 КОГДА Реализация.Контрагент ССЫЛКА Справочник.Контрагенты
 ТОГДА Реализация.Контрагент.Наименование
 КОГДА Реализация.Контрагент ССЫЛКА Справочник.Сотрудники
 ТОГДА Реализация.Контрагент.ФИО
 КОГДА Реализация.Контрагент ССЫЛКА Справочник.ФизическиеЛица
 ТОГДА Реализация.Контрагент.Фамилия + " " + Реализация.Контрагент.Имя
 ИНАЧЕ ""
 КОНЕЦ КАК НаименованиеКонтрагента
ИЗ
 Документ.РеализацияТоваров КАК Реализация

Левое соединение (ЛЕВОЕ СОЕДИНЕНИЕ) с разными таблицами

Если нужно подтянуть данные из разных таблиц в зависимости от типа ссылки‚ используют несколько левых соединений с условием на тип:

ВЫБРАТЬ
 Реализация.Ссылка‚
 ЕСТЬNULL(Контрагенты.Наименование‚ "") + ЕСТЬNULL(Сотрудники.ФИО‚ "") КАК Наименование
ИЗ
 Документ.РеализацияТоваров КАК Реализация
 ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
 ПО Реализация.Контрагент = Контрагенты.Ссылка
 И Реализация.Контрагент ССЫЛКА Справочник.Контрагенты
 ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
 ПО Реализация;Контрагент = Сотрудники.Ссылка
 И Реализация.Контрагент ССЫЛКА Справочник.Сотрудники

Условие И Реализация.Контрагент ССЫЛКА Справочник.Контрагенты в условии соединения (ПО) позволяет оптимизатору запросов отсекать лишние строки заранее‚ что значительно ускоряет выполнение на больших объемах данных.

Работа с NULL и Неопределено

Если реквизит не заполнен‚ ТИПЗНАЧЕНИЯ вернет системный тип NULL (для полей БД) или Неопределено (для параметров/переменных).

ВЫБРАТЬ
 Реализация.Ссылка‚
 ВЫБОР
 КОГДА ТИПЗНАЧЕНИЯ(Реализация.Контрагент) = ТИП(NULL)
 ТОГДА "Не заполнено"
 ИНАЧЕ "Заполнено"
 КОНЕЦ КАК СтатусЗаполнения
ИЗ
 Документ.РеализацияТоваров КАК Реализация

Производительность и лучшие практики

  1. Используйте оператор ССЫЛКА в условиях отбора (ГДЕ) и соединениях (ПО). Он читается легче и часто лучше оптимизируется платформой‚ чем сравнение с ТИП.
  2. Избегайте функции ТИПЗНАЧЕНИЯ в полях выборки без необходимости. Возврат типа в клиентское приложение увеличивает трафик и объем передаваемых данных; Используйте её в ГДЕ‚ ВЫБОР‚ ПО.
  3. Параметризация типов. Если тип проверяется динамически (передается извне)‚ передавайте в параметр запроса значение типа Тип (полученное встроенным языком через Тип("СправочникСсылка.Контрагенты"))‚ а не строку с именем. Тогда в запросе можно писать: ГДЕ ТИПЗНАЧЕНИЯ(Поле) = &ПараметрТип.
  4. Индексация. Поля составных типов индексируются целиком. Отбор по типу (ССЫЛКА) позволяет СУБД использовать индекс эффективно‚ так как значения разных типов физически хранятся в одном столбце‚ но имеют разные диапазоны значений (или специальные маркеры типа).

Сводная таблица отличий

Инструмент Возвращает Область применения Пример
ТИПЗНАЧЕНИЯ(Выражение) Значение типа Тип Универсальное определение типа любого выражения (ссылка‚ примитив‚ NULL). Используется в ВЫБОР‚ сравнениях‚ группировках. ТИПЗНАЧЕНИЯ(Реквизит) = ТИП(Строка)
ТИП(ИмяТипа) Значение типа Тип Получение эталонного значения типа для сравнения. Имя типа пишется без кавычек. ТИП(СправочникСсылка.Номенклатура)
Выражение ССЫЛКА Таблица Истина / Ложь Проверка‚ является ли значение ссылкой на конкретный объект метаданных (таблицу). Только для ссылочных типов. Оптимален для ГДЕ и ПО. Реквизит ССЫЛКА Справочник.Номенклатура

Умение правильно определять тип ссылки в запросе 1С — залог надежности и производительности прикладного решения. Комбинация ТИПЗНАЧЕНИЯ (для получения факта)‚ ТИП (для получения эталона) и оператора ССЫЛКА (для удобной и быстрой проверки принадлежности к таблице) покрывает 100% сценариев работы с составными типами данных. Начинающим разработчикам рекомендуется привыкать использовать ССЫЛКА в условиях отбора и соединений‚ а ТИПЗНАЧЕНИЯ — в конструкциях ВЫБОР и для сложной диагностики.