Как реализовать необязательный отбор по полу или другому реквизиту в запросе 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

В этой статье мы подробно разберем, как правильно составить текст запроса, чтобы реализовать выбор «Мужчины», «Женщины» или «Все», а также проанализируем профессиональные подходы к динамическим отборам.

Метод 1: Использование логического условия с проверкой на пустое значение

Самый простой и популярный способ — это добавление в секцию ГДЕ условия, которое проверяет либо соответствие реквизита параметру, либо сам факт того, что параметр не заполнен. Рассмотрим, как это выглядит в коде запроса:


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

Разберем ситуацию подробнее. Здесь используется логический оператор ИЛИ. Если пользователь выбрал конкретное значение (например, «Мужской»), то срабатывает первая часть условия. Если же пользователь оставил поле выбора пустым, то &ПараметрПол становится равен пустой ссылке перечисления. В этом случае вторая часть условия (после ИЛИ) становится истинной для всех строк таблицы, и запрос возвращает полный список сотрудников.

Метод 2: Использование дополнительного флага «Использовать отбор»

Иногда более наглядным и надежным решением является передача отдельного булевого параметра, который говорит запросу, нужно ли вообще обращать внимание на фильтр. Выясним причину популярности этого метода: он позволяет избежать проблем с «пустыми ссылками», если в самой базе есть записи с незаполненным полом.


ГДЕ
    (НЕ &ИспользоватьОтборПоПолу ИЛИ ФизическиеЛица.Пол = &ПараметрПол)

Проанализируем работу этой конструкции:

  1. Если &ИспользоватьОтборПоПолу имеет значение Ложь, то выражение НЕ &ИспользоватьОтборПоПолу превращается в Истина. Условие выполняется для каждой записи, и мы получаем «Всех».
  2. Если значение Истина, то первая часть выражения становится ложной, и системе приходится проверять вторую часть — фактическое равенство пола значению в параметре.

Метод 3: Универсальный подход через список значений

Если задача усложняется (например, нужно выбрать одновременно несколько значений из справочника или перечисления из 10 позиций), лучше всего использовать конструкцию В (&СписокЗначений). Посмотрим на пример:


ГДЕ
    ФизическиеЛица.Пол В (&СписокПолов)

В этом случае логика управления отбором переносится в программный код (на встроенном языке):

Профессиональный подход: Система компоновки данных (СКД)

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

В СКД вам не нужно прописывать сложные условия ИЛИ вручную. Вы просто описываете основной текст запроса без условий, а поле Пол выносите в настройки отбора. Система компоновки данных сама динамически сформирует SQL-запрос:

Важно: Использование оператора ИЛИ в запросах к большим таблицам (миллионы записей) может существенно замедлить работу, так как СУБД не всегда может эффективно использовать индексы при таких условиях.

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

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

Если ваша задача — найти тех, у кого пол не указан, используйте прямое сравнение с пустой ссылкой. Если же нужно объединить выборку конкретного пола и «пустых» записей, наиболее гибким будет Метод 3 со списком значений, куда вы добавите и нужное перечисление, и пустую ссылку.

Резюме

Для простых задач в консоли запросов или небольших обработках используйте Метод 1. Если вы строите сложный отчет с множеством фильтров — отдавайте предпочтение СКД или динамическому формированию текста запроса. Это обеспечит и удобство для пользователя, и высокую производительность системы.

← На главную