С версии модуля поиска 10.0.0 появилась возможность сортировать результат с учетом раздела элемента, и (или) значения любого свойства элемента, или других произвольных параметров (совершенно любых, например символьный код или размер изображения на PREVIEW_PICTURE). Реализация всегда примерно одна и та же — для любого дополнения в поиске.

Логика настройки поиска с фильтрацией по произвольным параметрам
По пунктам, как настроить функционал на примере фильтрации по разделам элемента и значения списочного свойства «Статус аукциона» (выделен на скрине выше):
- Зарегистрируем обработчик события, которое сработает при переиндексации поиска:
//файл /bitrix/php_interface/init.php
use Bitrix\Main\EventManager;
$handler = EventManager::getInstance();
$handler->AddEventHandler("search", "BeforeIndex", ["Ml\Events\Search", "BeforeIndexHandler"]);- Напишем класс и метод для обработки события
<?php
namespace Ml\Events;
class Search
{
public static function BeforeIndexHandler(&$arFields)
{
if($arFields["MODULE_ID"] == "iblock" && $arFields["PARAM2"] == IB_CATALOG_ID && substr($arFields["ITEM_ID"], 0, 1) != "S")
{
$lot = new Lot($arFields['ITEM_ID']); //Получаем значение свойства элемента
$statusId = $lot->getCurrentStatusId();//Получаем значение свойства элемента
$arFields["PARAMS"]["iblock_section"] = array();
$rsSections = \CIBlockElement::GetElementGroups($arFields["ITEM_ID"], true); //Получаем разделы привязки элемента (их может быть несколько)
while($arSection = $rsSections->Fetch())
{
$arFields["PARAMS"]["iblock_section"][] = $arSection["ID"]; //Добавляем раздел, в котором лежит элемент, в параметры
$arFields["PARAMS"]["auction_status"][] = $statusId; //Добавляем любое другое свойство или значение, по которому также будет осуществляться дополнительная фильтрация в поиске
}
}
//Всегда возвращаем arFields
return $arFields;
}
}- Для запуска события, которое мы описали, пересохраняем элемент из инфоблока IB_CATALOG_ID и подходящего по другим условиям, описанным в коде выше. Или запускаем переиндексацию поиска.

- После переиндексации, в таблице b_search_content_param можно будет увидеть добавленные значения для дополнительной фильтрации элементов, найденных в поиске. Прямо постучаться в табличку и глянуть что там, можно по ссылке в админку «/bitrix/admin/perfmon_table.php?lang=ru&set_filter=Y&table_name=b_search_content_param&find_type=SEARCH_CONTENT_ID».
- На странице вызова компонента bitrix:search.page необходимо определить глобальную переменную и закинуть в нее параметры, которые мы прокидываем в GET-запросе. Несущественные параметры компонента я опустил
<?
$request = Bitrix\Main\Application::getInstance()->getContext()->getRequest();
$sectionId = $request->getQuery("category_id");
$statusId = $request->getQuery("auction_status"); //получаем в GET параметре еще одно значение, по которому также будем сортировать
if($sectionId) $GLOBALS['arSectionFilter']['PARAMS']["iblock_section"] = $sectionId;
if($statusId) $GLOBALS['arSectionFilter']['PARAMS']["auction_status"] = $statusId; //Закидываем в глобальную переменную нужные нам значения для фильтрации по этому свойству элементов из поиска
?>
<?$APPLICATION->IncludeComponent(
"ml:search.page",
"custom_search_page",
array(
"RESTART" => "N",
"FILTER_NAME" => "arSectionFilter",
...
),
false
);?>Принципиально важно определять $arSectionFilter, по которой будем фильтровать элементы, не через global $arSectionFilter, а через $GLOBALS[‘arSectionFilter’]. Иначе не отработает.

Об авторе
Сергей Житников - Веб-разработчик
Занимаюсь веб-разработкой более 5 лет. Специализируюсь на создании адаптивных сайтов и веб-приложений на HTML5, CSS3 и JavaScript. Работаю с популярными CMS и фреймворками, а также уделяю большое внимание оптимизации производительности и чистоте кода.
Есть проект или идея? Буду рад помочь!
Связаться со мной