Как найти товар в подсказках по своему свойству

Товар находится на странице полного поиска, но не появляется в быстрых подсказках. Причина может быть в настройках компонента и лимите подсказок, но есть проверяемое исправление для другого частого случая: нужное публичное свойство товара не попало в поисковый индекс.

Ниже — решение только для свойства, которое допустимо искать всем, кому доступен сам товар. Не добавляйте в индекс номер договора, закупочную цену, телефон или другой закрытый текст.

Когда применять это решение

Исправление нужно, если пользователь вводит значение публичного свойства, например SEARCH_TITLE или артикул, а товар не находится. Сначала убедитесь, что значение относится к правильному товару и что искать его действительно должны посетители. Быстрые подсказки — короткая выдача, а полный поиск — отдельная страница; совпадение одного результата не обещает совпадение другого.

Добавляем только разрешённое свойство в TITLE

Официальное событие BeforeIndex вызывается перед индексацией и позволяет изменить TITLE. В официальном примере Битрикс свойство элемента добавляют в заголовок, чтобы его находил search.title. Код ниже намеренно работает только с одним инфоблоком и одним заранее признанным публичным свойством.

<?php
// /bitrix/php_interface/init.php
AddEventHandler('search', 'BeforeIndex', 'addPublicSearchTitle');

function addPublicSearchTitle($fields)
{
    $catalogIblockId = 17; // Подставьте ID своего инфоблока.
    $elementId = (string)($fields['ITEM_ID'] ?? '');

    if ($fields['MODULE_ID'] !== 'iblock'
        || (int)$fields['PARAM2'] !== $catalogIblockId
        || !ctype_digit($elementId)) {
        return $fields;
    }

    if (!CModule::IncludeModule('iblock')) {
        return $fields;
    }

    $property = CIBlockElement::GetProperty(
        $catalogIblockId,
        (int)$elementId,
        array('sort' => 'asc'),
        array('CODE' => 'SEARCH_TITLE')
    )->Fetch();

    if ($property
        && $property['PROPERTY_TYPE'] === 'S'
        && $property['MULTIPLE'] === 'N'
        && is_string($property['VALUE'])
        && trim($property['VALUE']) !== '') {
        $fields['TITLE'] .= ' ' . trim($property['VALUE']);
    }

    return $fields;
}

Проверка ctype_digit() отсекает разделы с идентификаторами вида S123: пример предназначен только для элементов. Он также принимает только одиночное строковое свойство; файл, список и множественное значение требуют отдельного решения. Не заменяйте SEARCH_TITLE на свойство, доступное только сотрудникам. Сам индекс также содержит права в поле PERMISSIONS, но добавлять секретную строку в поисковый текст без отдельной проверки модели доступа нельзя.

Пересоберите индекс и проверьте результат

Переиндексация — это пересборка списка слов и данных, по которым работает поиск. После установки обработчика запустите полную переиндексацию штатным инструментом административной части. Иначе старые записи останутся без нового слова.

  1. На тестовой копии выберите публичный товар с заполненным SEARCH_TITLE.
  2. Запустите переиндексацию и дождитесь её завершения.
  3. Найдите товар по полному значению свойства на странице поиска и в подсказках.
  4. Повторите проверку как гость и как пользователь без закрытых прав.

Если полная выдача работает, а подсказка не показывает товар, проверьте лимит и настройки search.title; не пытайтесь записать CUSTOM_RANK в BeforeIndex. Такого поддерживаемого поля в перечне события нет.

Поля и пример сверены 4 октября 2026 года с документацией BeforeIndex. На изолированной тестовой БД Битрикс 26.150.0 CSearchTitle не нашёл свойство до обработчика и нашёл элемент после добавления свойства в TITLE. Исходный вопрос и ответы от 2 июня 2026 года: форум «1С-Битрикс»; конкретная причина в той теме не приписывается каждому случаю.