Назад

Битрикс поиск товара по ID

Главная
Блог
Битрикс поиск товара по ID

Поиск товаров по ID — базовая задача в интернет-магазинах на Битрикс. Однако стандартный поиск не всегда корректно работает с числовыми ID, особенно если требуется искать именно по полю ID, а не по названию или артикулу.

В этой статье рассмотрим несколько способов реализации поиска:

  1. Стандартный метод (через свойства инфоблока)

  2. Прямой поиск через CIBlockElement::GetByID

  3. Современный подход на D7 (Bitrix\Iblock\ElementTable)

  4. Оптимизация поиска через обработчики событий

1. Поиск через пользовательское свойство инфоблока

Когда использовать?

Если нужно, чтобы товары находились через стандартный поиск Битрикс (например, через search.page).

Шаги реализации:

  1. Создаем свойство SEARCH_ID

    • Заходим в Инфоблоки → Ваш инфоблок → Свойства

    • Добавляем новое свойство типа "Число" или "Строка"

    • Включаем опцию "Участвует в поиске"

  2. Заполняем свойство для существующих товаров

    <?php
    require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
    
    CModule::IncludeModule("iblock");
    
    $IBLOCK_ID = 5; // ID инфоблока
    $SEARCH_FIELD_NAME = 'SEARCH_ID'; // Символьный код свойства
    
    $elements = CIBlockElement::GetList(
        [],
        ["IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y"],
        false,
        false,
        ["ID"]
    );
    
    while ($element = $elements->Fetch()) {
        CIBlockElement::SetPropertyValuesEx(
            $element["ID"],
            $IBLOCK_ID,
            [$SEARCH_FIELD_NAME => $element["ID"]]
        );
        echo "ID {$element['ID']} обновлен<br>";
    }
    ?>

  3. Автоматизируем заполнение для новых товаров
    Добавляем обработчик в /bitrix/php_interface/init.php:

    AddEventHandler("iblock", "OnAfterIBlockElementAdd", function(&$arFields) {
        if ($arFields["ID"] > 0) {
            CIBlockElement::SetPropertyValuesEx(
                $arFields["ID"],
                $arFields["IBLOCK_ID"],
                ["SEARCH_ID" => $arFields["ID"]]
            );
        }
    });

Плюсы и минусы

✔ Работает со стандартным поиском
✔ Простота настройки
✖ Дублирование данных (ID хранится дважды)
✖ Требуется переиндексация

2. Прямой поиск через CIBlockElement::GetByID

Когда использовать?

Если нужно быстро найти товар по ID без лишних запросов.

Пример кода:

$productId = 123; // ID товара
$product = CIBlockElement::GetByID($productId)->Fetch();

if ($product) {
    echo "Найден товар: " . $product["NAME"];
} else {
    echo "Товар не найден";
}

Плюсы и минусы

✔ Мгновенный поиск без индексации
✔ Не требует дополнительных свойств
✖ Не работает в стандартном поиске (search.page)

3. Современный D7-подход (Bitrix\Iblock\ElementTable)

Когда использовать?

В новых проектах на Битрикс, где применяется D7.

Пример кода:

use Bitrix\Iblock\ElementTable;

$productId = 123;
$product = ElementTable::getById($productId)->fetch();

if ($product) {
    echo "Товар: " . $product["NAME"];
} else {
    echo "Товар не найден";
}

Плюсы и минусы

✔ Быстрее и современнее, чем CIBlockElement
✔ Поддержка ORM
✖ Требует D7 (не подходит для старых проектов)

4. Оптимизация поиска через обработчики событий

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

AddEventHandler("iblock", "OnAfterIBlockElementAdd", function(&$arFields) {
    if ($arFields["ID"] > 0) {
        // Обновляем свойство для поиска
        CIBlockElement::SetPropertyValuesEx(
            $arFields["ID"],
            $arFields["IBLOCK_ID"],
            ["SEARCH_ID" => $arFields["ID"]]
        );
        
        // Дополнительно кэшируем элемент
        $cache = new CPHPCache();
        $cache->Clean("product_" . $arFields["ID"], "/catalog/products/");
    }
});

Вывод

Метод Когда использовать Скорость Совместимость
Свойство инфоблока Стандартный поиск Средняя Любая версия
CIBlockElement::GetByID Быстрый поиск Высокая Битрикс 16+
D7 (ElementTable) Современные проекты Очень высокая D7 (Битрикс 17+)

Рекомендация:

  • Для простых задач подойдет CIBlockElement::GetByID.

  • Для интеграции с поиском используйте свойство SEARCH_ID.

  • В новых проектах применяйте D7 (ElementTable).

Если нужен гибридный подход, можно комбинировать методы, например, использовать прямое получение товара по ID, но при этом хранить SEARCH_ID для совместимости с поиском.

Нужна ли переиндексация?
Да, если используется стандартный поиск Битрикс. После обновления свойств выполните:

  1. Настройки → Поиск → Переиндексация.

  2. Выберите "Полная переиндексация".

Теперь поиск по ID будет работать корректно!

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи