Фильтры в Битрикс: GetList, FILTER_NAME и пустые свойства

В Битрикс фильтр — это обычный ассоциативный массив, который склеивается с базовым $arFilter компонента и уходит в CIBlockElement::GetList (или в ORM). Большинство багов «почему не нашлось» — не в SQL, а в синтаксисе ключей: пустое значение, отрицание, свойства и даты пишутся по-разному.

Ниже — рабочие паттерны для news.list / каталога и коротко — как то же самое выглядит в D7.

FILTER_NAME в news.list

Компонент сам не знает ваш бизнес-фильтр. Перед вызовом кладёте массив в $GLOBALS, а в параметрах указываете имя:

Внутри компонента это примерно array_merge($arFilter, $GLOBALS[$arParams['FILTER_NAME']]). Имя может быть любым — главное, чтобы оно совпадало с ключом в $GLOBALS.

Пустые и непустые свойства

Для строковых/списочных свойств «пусто» в фильтре инфоблока — это false, а не пустая строка:

Префикс ! — отрицание условия. То же работает для свойств: '!PROPERTY_CODE' => false значит «свойство не пустое».

Частые операторы в ключе

Логику OR/AND задают вложенные массивы с ключом LOGIC. Без него условия на одном уровне склеиваются через AND.

Свойства: код vs ID

В фильтре можно писать и PROPERTY_CODE, и PROPERTY_123. Код читаемее; ID стабильнее при переносах между стендами, если коды разъехались. Для множественных свойств значение часто передают массивом.

Тот же фильтр в D7

В ORM инфоблока синтаксис ближе к SQL, но идея та же — явные условия вместо «магии» компонента:

Имена полей зависят от API вашего инфоблока (сгенерированный класс элемента vs ElementTable). Перед продом сверьте схему на стенде.

Типичные ошибки

  1. '' вместо false для «пустого» свойства — выборка пустая или наоборот слишком широкая.
  2. Фильтр положили в $arrFilter, а в компоненте FILTER_NAME другой.
  3. Фильтруете по символьному коду раздела, а в инфоблоке нужен SECTION_ID / SECTION_CODE с учётом INCLUDE_SUBSECTIONS.
  4. Кэш компонента не сбрасывается после смены фильтра в коде — на время отладки отключите кеш или смените CACHE_TIME.

Связка с событиями

Если фильтр «собирается» из нескольких модулей, не размазывайте его по шаблонам. Соберите массив в одном месте (init.php, свой сервис) или подпишитесь на событие подготовки параметров компонента. Подробный разбор подписок — в гайде Bitrix D7 EventManager и обзоре событий AddEventHandler / EventManager.

Итог

Сначала зафиксируйте контракт фильтра: какие поля, какие операторы, что значит «пусто». Потом подключайте его через FILTER_NAME или ORM. Так проще тестировать и не ломать выдачу правками в шаблоне.