В процессе разработки на платформе 1С часто возникает задача создания гибких отчетов или выборок, где пользователь может сам решать: применить фильтр по конкретному значению (например, отобрать только мужчин или только женщин) или вывести все записи без ограничений. Статичное условие ГДЕ в таких случаях не подходит, так как оно жестко ограничивает результат.
В этой статье мы подробно разберем, как правильно составить текст запроса, чтобы реализовать выбор «Мужчины», «Женщины» или «Все», а также проанализируем профессиональные подходы к динамическим отборам.
Самый простой и популярный способ — это добавление в секцию ГДЕ условия, которое проверяет либо соответствие реквизита параметру, либо сам факт того, что параметр не заполнен. Рассмотрим, как это выглядит в коде запроса:
ВЫБРАТЬ
ФизическиеЛица.Ссылка КАК ФизЛицо,
ФизическиеЛица.Пол КАК Пол
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ГДЕ
(ФизическиеЛица.Пол = &ПараметрПол ИЛИ &ПараметрПол = ЗНАЧЕНИЕ(Перечисление.ПолФизическогоЛица.ПустаяСсылка))
Разберем ситуацию подробнее. Здесь используется логический оператор ИЛИ. Если пользователь выбрал конкретное значение (например, «Мужской»), то срабатывает первая часть условия. Если же пользователь оставил поле выбора пустым, то &ПараметрПол становится равен пустой ссылке перечисления. В этом случае вторая часть условия (после ИЛИ) становится истинной для всех строк таблицы, и запрос возвращает полный список сотрудников.
Иногда более наглядным и надежным решением является передача отдельного булевого параметра, который говорит запросу, нужно ли вообще обращать внимание на фильтр. Выясним причину популярности этого метода: он позволяет избежать проблем с «пустыми ссылками», если в самой базе есть записи с незаполненным полом.
ГДЕ
(НЕ &ИспользоватьОтборПоПолу ИЛИ ФизическиеЛица.Пол = &ПараметрПол)
Проанализируем работу этой конструкции:
&ИспользоватьОтборПоПолу имеет значение Ложь, то выражение НЕ &ИспользоватьОтборПоПолу превращается в Истина. Условие выполняется для каждой записи, и мы получаем «Всех».Если задача усложняется (например, нужно выбрать одновременно несколько значений из справочника или перечисления из 10 позиций), лучше всего использовать конструкцию В (&СписокЗначений). Посмотрим на пример:
ГДЕ
ФизическиеЛица.Пол В (&СписокПолов)
В этом случае логика управления отбором переносится в программный код (на встроенном языке):
ГДЕ целиком.В современной разработке на платформе 1С 8.3 для решения таких задач рекомендуется использовать СКД. Рассмотрим, почему это эффективнее:
В СКД вам не нужно прописывать сложные условия ИЛИ вручную. Вы просто описываете основной текст запроса без условий, а поле Пол выносите в настройки отбора. Система компоновки данных сама динамически сформирует SQL-запрос:
Важно: Использование оператора ИЛИ в запросах к большим таблицам (миллионы записей) может существенно замедлить работу, так как СУБД не всегда может эффективно использовать индексы при таких условиях.
Как отмечалось в обсуждении, часто встречаются ситуации, когда реквизит Пол не заполнен у части сотрудников. В терминах 1С это значение Значение(Перечисление.Пол.ПустаяСсылка).
Если ваша задача — найти тех, у кого пол не указан, используйте прямое сравнение с пустой ссылкой. Если же нужно объединить выборку конкретного пола и «пустых» записей, наиболее гибким будет Метод 3 со списком значений, куда вы добавите и нужное перечисление, и пустую ссылку.
Для простых задач в консоли запросов или небольших обработках используйте Метод 1. Если вы строите сложный отчет с множеством фильтров — отдавайте предпочтение СКД или динамическому формированию текста запроса. Это обеспечит и удобство для пользователя, и высокую производительность системы.