Разработка эффективных запросов в платформе 1С:Предприятие 8 часто требует фильтрации данных не только по реквизитам, но и по самому типу объекта. Особенно это актуально при работе с регистрами сведений, где измерения могут хранить ссылки на разнородные справочники и документы. Понимание механизма сравнения типов является фундаментом для написания корректного кода.

В этой статье мы детально разберем синтаксические конструкции, позволяющие отобрать нужный тип документа, рассмотрим подводные камни работы с иерархическими типами и проанализируем влияние таких условий на производительность системы. Вы узнаете, когда стоит использовать оператор ТИПЗНАЧЕНИЯ, а когда лучше обратиться к виртуальной таблице ТипыСсылок.

Базовый синтаксис оператора ТИПЗНАЧЕНИЯ

Самый распространенный способ фильтрации — использование встроенной функции языка запросов ТИПЗНАЧЕНИЯ. Она возвращает тип переданного значения, который затем можно сравнить с конкретным типом данных. Этот подход интуитивно понятен и легко читается в коде.

Оператор ТИПЗНАЧЕНИЯ позволяет сравнивать тип поля выборки с жестко заданным типом. Синтаксис требует указания типа в скобках после ключевого слова.

Рассмотрим пример, где необходимо выбрать только документы реализации из общего регистра:

ВЫБРАТЬ

РегистрСведений.ЦеныНоменклатуры.Период,

РегистрСведений.ЦеныНоменклатуры.ВидЦены,

РегистрСведений.ЦеныНоменклатуры.Номенклатура,

РегистрСведений.ЦеныНоменклатуры.Цена

ИЗ

РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

ГДЕ

ТИПЗНАЧЕНИЯ(ЦеныНоменклатуры.Основание) = ТИП(ДокументСсылка.РеализацияТоваровУслуг)

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

💡

Используйте автоподстановку типов в редакторе запросов, чтобы избежать опечаток в именах типов документов, так как платформа строго следит за регистром и наличием префиксов.

Работа с иерархией типов и множественным отбором

Часто возникает ситуация, когда необходимо отобрать данные по нескольким типам документов одновременно или по целой ветке иерархии. Платформа предоставляет гибкие инструменты для таких сценариев, позволяя комбинировать условия через логические операторы.

Если вам нужно получить данные сразу по группе документов, например, по всем видам поступлений товаров, использование множества условий ИЛИ может сделать запрос громоздким. В таких случаях удобнее использовать оператор В в сочетании с функцией типа.

  • 📂 Использование списка типов позволяет сократить код условия ГДЕ в несколько раз.
  • 🔗 Проверка на принадлежность к общему типу (например, ДокументСсылка) отберет абсолютно все документы, что редко бывает нужно.
  • ⚡ Компилятор запросов оптимизирует проверку списка типов эффективнее, чем цепочку отдельных сравнений.

Пример отбора по нескольким конкретным типам документов выглядит следующим образом:

ГДЕ

ТИПЗНАЧЕНИЯ(Движения.Документ) В

(

ТИП(ДокументСсылка.ПоступлениеТоваровУслуг),

ТИП(ДокументСсылка.АктВыполненныхРабот),

ТИП(ДокументСсылка.УслугаСторно)

)

Такой подход обеспечивает высокую читаемость и легкость поддержки кода. При добавлении нового типа документа в логику выборки вам достаточно просто дописать его в список, не меняя структуру всего запроса.

📊 Какой способ отбора вы используете чаще?
ТИПЗНАЧЕНИЯ = ТИП
ТИПЗНАЧЕНИЯ В (..)
Виртуальная таблица ТипыСсылок
Фильтрация на стороне клиента

Использование виртуальной таблицы ТипыСсылок

Для сложных сценариев, особенно когда типы документов хранятся в переменных или передаются параметрами, стандартный синтаксис может быть неудобен. В таких случаях на помощь приходит специальная виртуальная таблица ТипыСсылок, доступная в режиме предприятия.

Эта таблица содержит соответствие между внутренним идентификатором типа (Ref) и его строковым представлением. Использование этой таблицы позволяет строить динамические запросы, где список типов формируется программно перед выполнением.

Основное преимущество подхода с ТипыСсылок — возможность соединения (JOIN) по типу. Это открывает двери для универсальных отчетов, которые не требуют переписывания кода при изменении состава отбираемых документов.

Нюансы работы с таблицей ТипыСсылок

Виртуальная таблица не индексируется так же агрессивно, как физические таблицы. При больших объемах данных соединение с ней может дать прирост времени выполнения запроса по сравнению с жестким ТИПЗНАЧЕНИЯ.

Пример использования соединения для фильтрации:

ВЫБРАТЬ

Движения.Период,

Движения.Сумма

ИЗ

РегистрБухгалтерии.Хозрасчетный.Движения КАК Движения

ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТипыСсылок КАК Типы

ПО Движения.СчетДт = Типы.Ссылка

ГДЕ

Типы.Представление В (&СписокТиповДокументов)

Здесь параметр &СписокТиповДокументов может содержать массив строк с именами типов, что делает запрос крайне гибким для внешних обработок и расширений.

Сравнение производительности различных методов

Вопрос скорости выполнения запросов всегда стоит остро в высоконагруженных системах . Разные методы отбора по типу документают оказывают различное влияние на план выполнения запроса и использование индексов.

Прямое сравнение через ТИПЗНАЧЕНИЯ обычно является наиболее производительным вариантом, так как тип значения хранится в служебном поле таблицы базы данных и часто участвует в составных индексах. Оптимизатор запросов СУБД хорошо обрабатывает такие условия.

В таблице ниже приведено сравнение характеристик основных методов отбора:

Метод отбора Читаемость кода Производительность Гибкость
ТИПЗНАЧЕНИЯ = ТИП Высокая Максимальная Низкая
ТИПЗНАЧЕНИЯ В (..) Высокая Высокая Средняя
Таблица ТипыСсылок Средняя Средняя Максимальная
Проверка в цикле Низкая Низкая Высокая

Использование таблицы ТипыСсылок накладывает дополнительную нагрузку на СУБД из-за необходимости выполнения соединения. Однако в случаях, когда список типов динамически велик, этот метод может оказаться единственным рабочим решением.

💡

Для статических условий всегда выбирайте оператор ТИПЗНАЧЕНИЯ. Динамические списки типов оправдывают использование виртуальных таблиц только при сложной бизнес-логике.

Типичные ошибки при фильтрации по типу

Разработчики, особенно начинающие, часто допускают ошибки, связанные с непониманием различий между типом значения и самим значением. Самая частая проблема — попытка сравнить поле напрямую со строковым названием типа.

Еще одна распространенная ошибка — игнорирование иерархии. Например, сравнение с типом ДокументСсылка отберет все документы, но если в поле может храниться и справочник, условие сработает некорректно для задач, требующих строгой типизации.

⚠️ Внимание: Никогда не используйте функцию ЕСТЬNULL вместе с ТИПЗНАЧЕНИЯ в одном условии без скобок. Приоритет операторов может привести к тому, что проверка типа выполнится до проверки на пустоту, что вызовет ошибку выполнения или неверный результат.

Также стоит помнить о различии между ссылочным типом и типом объекта. В запросах мы почти всегда работаем со ссылками (ДокументСсылка.ЗаказКлиента), а не с объектами (ДокументОбъект.ЗаказКлиента), так как в таблицах базы данных хранятся именно ссылки.

Динамический отбор в управляемых формах

В современных приложениях на платформе 1С:Предприятие 8.3 и выше часто требуется передавать типы документов из формы в запрос. Прямая передача типа в параметр запроса невозможна, поэтому используются обходные пути.

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

// Пример формирования условия в коде 1С

СтрокаУсловия = "";

Для Каждого ТипИзСписка Из СписокТипов Цикл

Если СтрокаУсловия <> "" Тогда

СтрокаУсловия = СтрокаУсловия + ", ";

КонецЕсли;

СтрокаУсловия = СтрокаУсловия + "ТИП(" + ТипИзСписка + ")";

КонецЦикла;

ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеПоТипу", СтрокаУсловия);

Такой подход позволяет гибко управлять логикой отбора на стороне клиента, сохраняя при этом производительность выполнения запроса на стороне сервера баз данных.

⚠️ Внимание: При динамической подстановке типов в текст запроса обязательно используйте экранирование или валидацию входных данных, чтобы избежать уязвимостей, связанных с инъекцией кода, хотя в 1С это менее критично, чем в SQL.

☑️ Проверка корректности отбора

Выполнено: 0 / 4

Особенности работы в распределенных базах данных

В распределенных информационных базах (РИБ) типы документов могут иметь свои особенности, связанные с префиксами узлов. Хотя платформа старается абстрагировать разработчика от этих деталей, при прямых SQL-запросах или сложной синхронизации это может стать проблемой.

При использовании ТИПЗНАЧЕНИЯ в распределенной базе платформа автоматически учитывает контекст узла. Однако, если вы обращаетесь к таблицам напрямую через ВЫПОЛНИТЬ с SQL-текстом, необходимо вручную учитывать префиксы таблиц, соответствующие типам документов.

Для стандартных запросов языка 1С эта проблема решена прозрачно. Разработчику достаточно указывать метаданные, а система сама подставит правильные имена физических таблиц в зависимости от конфигурации распределенной базы.

Можно ли использовать ТИПЗНАЧЕНИЯ для отбора по виду расчета?

Да, оператор универсален и работает для любых типов данных 1С, включая перечисления, планы видов расчета и регистры. Синтаксис остается неизменным: ТИПЗНАЧЕНИЯ(Поле) = ТИП(ПланВидовРасчетаСсылка.ОсновнаяЗарплата).

Почему запрос с ТипыСсылок выполняется медленнее?

Виртуальная таблица ТипыСсылок строится динамически при каждом обращении. В отличие от физических таблиц, она не имеет постоянных индексов, что вынуждает СУБД выполнять полное сканирование или менее эффективные методы соединения.

Как отобрать все документы, кроме одного типа?

Используйте оператор неравенства <> в сочетании с ТИПЗНАЧЕНИЯ. Например: ГДЕ ТИПЗНАЧЕНИЯ(Док) <> ТИП(ДокументСсылка.Черновик). Это исключит указанный тип из выборки.

Влияет ли отбор по типу на блокировку записей?

Сам по себе отбор по типу не устанавливает блокировок. Блокировки зависят от режима транзакции и наличия операторов обновления (ИЗМЕНЕНИЕ, ВЫБРАТЬ.. ДЛЯ ИЗМЕНЕНИЯ). Однако неоптимальный отбор может увеличить время удержания блокировок.

Что вернет ТИПЗНАЧЕНИЯ для пустой ссылки?

Для пустой ссылки (NULL) функция ТИПЗНАЧЕНИЯ вернет неопределенный тип. При сравнении с конкретным типом документа условие вернет ЛОЖЬ. Для обработки пустых значений используйте отдельную проверку ЕСТЬNULL.