Готовые решения для 1С-Битрикс
Карточка решения
База знаний по решению:
Умный поиск с исправлением ошибок в запросе и подсказками
Часто задаваемые вопросы:

Исключение из поиска определенных элементов

Часто возникают вопросы: "Как исключить из поиска товары определенной группы?" или "Как исключить из поиска товары не в наличии?"

Проблема решается довольно просто, добавлением обработчика индексации для стандартного модуля поиск - https://dev.1c-bitrix.ru/api_help/search/events/beforeindex.php

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


Пример обработчика, который можно доработать под свою задачу:

<? AddEventHandler("search", "BeforeIndex", "BeforeIndexHandler", 10); function BeforeIndexHandler($arFields) { $clearIndex = 0; if($arFields["MODULE_ID"] == 'iblock' && $arFields["TITLE"] != '' && IntVal($arFields["ITEM_ID"])) { if(CModule::IncludeModule("iblock")){ $res = CIBlockElement::GetList(Array(), array("ID"=>$arFields["ITEM_ID"]), false, Array("nPageSize"=>1), array("ID", "NAME", "IBLOCK_SECTION_ID")); while($fields = $res->Fetch()) { if($fields["IBLOCK_SECTION_ID"]){ $nav = CIBlockSection::GetNavChain(false, $fields["IBLOCK_SECTION_ID"], array("ID", "NAME", "ACTIVE")); while($flds = $nav->Fetch()){ if($flds["ACTIVE"] == 'N'){ $clearIndex = 1; } } } } } } if($clearIndex) { $arFields["TITLE"] = ''; $arFields["BODY"] = ''; $arFields["TAGS"] = ''; } return $arFields; } ?>

* Обработчик из примера проверяет поле активности у разделов, в которые вложен товар, и исключает его из поиска, если один из разделов неактивен.