В процессе разработки сложных отчетов или регламентных заданий в платформе 1С:Предприятие часто возникает необходимость выборки данных строго определенного вида. Типичная задача — получить список только накладных или только счетов на оплату из общей таблицы ссылок документов. Новички часто совершают ошибку, пытаясь фильтровать объекты по их имени в метаданных напрямую в условиях WHERE, что приводит к синтаксическим ошибкам или неверным результатам.

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

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

Чтобы понять, как правильно написать условие отбора, необходимо разобраться в физическом представлении данных. В реляционной базе данных, которую использует 1С:Предприятие, ссылки на документы различных видов часто хранятся в едином поле типа ДокументСсылка. Это поле является полиморфным, то есть может содержать ссылку как на "РеализациюТоваровУслуг", так и на "ПоступлениеТоваровУслуг".

При этом система не хранит явное текстовое имя типа в отдельной колонке для быстрой фильтрации в стандартном виде. Вместо этого идентификация типа происходит либо через системные служебные поля (в зависимости от режима совместимости и типа СУБД), либо через явное приведение типов в языке запросов. Именно поэтому простая конструкция ГДЕ Тип = 'Реализация' работать не будет без специальных операторов.

Важно учитывать, что при работе с большим объемом данных неправильный подход к фильтрации может привести к полному сканированию таблицы (Full Table Scan). Это существенно замедляет работу системы, особенно в многопользовательском режиме. Грамотное использование операторов типа позволяет СУБД использовать индексы более эффективно.

⚠️ Внимание: В конфигурациях с включенной поддержкой распределенных информационных баз (РИБ) или при использовании специфических настроек хранения ссылок логика выборки может иметь свои нюансы. Всегда проверяйте структуру таблиц в режиме предприятия через консоль запросов перед написанием кода.

💡

Используйте консоль запросов с включенной опцией "Показывать план выполнения" для проверки того, используется ли индекс при вашем условии отбора по типу документа.

Использование оператора ТИП ЗНАЧЕНИЯ

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

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

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

ВЫБРАТЬ

РеализацииТоваровУслуг.Ссылка,

РеализацииТоваровУслуг.Дата,

РеализацииТоваровУслуг.Контрагент

ПОМЕСТИТЬ ВыборкаДокументов

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацииТоваровУслуг

ГДЕ

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

Обратите внимание на использование оператора ТИП в правой части сравнения. Он возвращает описание типа метаданных, которое сравнивается с типом значения в левой части. Это строгая типизация, которая гарантирует отсутствие ошибок приведения.

📊 Какой метод фильтрации вы используете чаще?
ТИПЗНАЧЕНИЯ
ЕСТЬ В ТАБЛИЦЕ
Сравнение с NULL
Через Временную таблицу

Применение оператора ЕСТЬ В ТАБЛИЦЕ

Альтернативным и иногда более производительным методом является использование конструкции ЕСТЬ В ТАБЛИЦЕ. Этот подход особенно актуален, когда вам нужно отобрать документы не по одному типу, а по списку из нескольких видов, или когда логика выборки строится на существовании записи в конкретной виртуальной таблице.

Суть метода заключается в том, что мы проверяем наличие ссылки в таблице конкретного вида документа. Если ссылка существует в таблице Документ.РеализацияТоваровУслуг, значит, это именно реализация. Это позволяет избежать явного вызова функции определения типа для каждой строки.

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

ВЫБРАТЬ

ТабличнаяЧасть.СсылкаНаДокумент

ИЗ

РегистрНакопления.Продажи.Обороты КАК ТабличнаяЧасть

ГДЕ

ТабличнаяЧасть.СсылкаНаДокумент ЕСТЬ В ТАБЛИЦЕ

(ВЫБРАТЬ

Реализация.Ссылка

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация)

Такой подход может быть менее читаемым для начинающих разработчиков, но он часто дает выигрыш в скорости на больших массивах данных, так как оптимизатор запросов 1С:Предприятие может преобразовать его в эффективное соединение (JOIN) или полу-соединение.

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

Фильтрация по иерархии и группировкам

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

Для работы с иерархией в условиях отбора используется специальное свойство Иерархия или функция В ИЕРАРХИИ. Это позволяет выбрать все документы определенного типа, находящиеся внутри конкретной папки или подчиненные определенному элементу.

  • 📂 Используйте В ИЕРАРХИИ для выбора всех вложенных элементов.
  • 📁 Свойство Родитель позволяет выбрать только документы первого уровня вложенности.
  • 🔍 Комбинация типа и иерархии сужает выборку до минимума.

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

ГДЕ

ТИПЗНАЧЕНИЯ(Документы.Ссылка) = ТИП(ДокументСсылка.ЗаказКлиента)

И Документы.Ссылка В ИЕРАРХИИ &ПараметрПапки

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

Нюансы работы с иерархией

Помните, что свойство "В Иерархии" включает в выборку и сам элемент-родитель. Если вам нужно исключить его, добавьте дополнительное условие "И Ссылка <> &ПараметрПапки".

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

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

Ниже приведена таблица, сравнивающая основные характеристики подходов к фильтрации по типу документа в различных условиях эксплуатации системы.

Метод Читаемость кода Производительность (Малые данные) Производительность (Большие данные)
ТИПЗНАЧЕНИЯ Высокая Оптимальная Хорошая
ЕСТЬ В ТАБЛИЦЕ Средняя Оптимальная Отличная
Приведение типа Низкая Низкая Критически низкая

Как видно из данных, метод ЕСТЬ В ТАБЛИЦЕ показывает лучшие результаты на больших объемах, так как он позволяет движку базы данных использовать индексы целевой таблицы документов напрямую, не вычисляя тип для каждой строки источника.

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

Обработка пустых значений и исключений

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

Если в вашей выборке участвуют левые соединения (LEFT JOIN), в результирующем наборе могут появиться строки с пустыми ссылками на документы. Фильтрация по типу в таком случае просто отсечет эти строки, что может быть как желаемым поведением, так и ошибкой логики.

⚠️ Внимание: При использовании составных типов в полях таблиц (например, поле может хранить ссылку на Документ или на Справочник) убедитесь, что условие отбора не отфильтрует нужные вам справочники, если они допустимы в данном контексте.

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

ГДЕ

Документы.Ссылка ЕСТЬ НЕ NULL

И ТИПЗНАЧЕНИЯ(Документы.Ссылка) = ТИП(ДокументСсылка.СчетФактура)

Такая запись гарантирует, что мы работаем только с существующими объектами нужного вида. Это особенно важно при формировании печатных форм, где отсутствие документа может привести к ошибке генерации макета.

☑️ Проверка запроса перед запуском

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

Оптимальный выбор метода зависит от конкретной задачи: для читаемости используйте ТИПЗНАЧЕНИЯ, для максимальной скорости на больших данных — ЕСТЬ В ТАБЛИЦЕ.

Часто задаваемые вопросы

Можно ли использовать строковую константу вместо ТИП()?

Нет, прямое сравнение с строкой (например, = "ДокументСсылка.Реализация") не сработает корректно для фильтрации по типу объекта. Поле хранит ссылку, а не имя типа. Необходимо использовать оператор ТИП() для получения дескриптора типа метаданных.

Почему запрос с ТИПЗНАЧЕНИЯ работает медленно?

В некоторых случаях, особенно на старых версиях платформы или специфических СУБД, функция типа может препятствовать использованию индекса. Попробуйте переписать условие через ЕСТЬ В ТАБЛИЦЕ или убедитесь, что по полю ссылки создан индекс.

Как отобрать документы нескольких разных типов одним запросом?

Вы можете использовать логическое ИЛИ в условии ГДЕ, перечислив несколько проверок ТИПЗНАЧЕНИЯ. Либо используйте объединение запросов (ОБЪЕДИНИТЬ ВСЕ), если структура выбираемых полей совпадает.

Влияет ли удаление документа на результат запроса?

Да, если документ помечен на удаление, он может исключаться из выборки в зависимости от настроек режима данных (Управляемые блокировки, игнорирование помеченных). Используйте оператор ГДЕ с проверкой флага ПометкаУдаления, если нужно найти такие объекты.