Как работает быстрый заказ по артикулу
На оптовых и B2B-сайтах клиент часто знает артикул — ему незачем листать каталог. Он хочет ввести артикул, указать количество и сразу добавить в корзину. Мы реализовали такой блок на одном из проектов: после запуска количество заказов в повторных продажах выросло на 40%. Стандартный компонент search.title для этой задачи не годится — он ищет по названию, не индексирует артикулы и тормозит на каталогах от 10 000 товаров. Быстрый заказ по артикулу — отдельный UI-блок с прямым запросом к базе по индексированному полю. Это решение окупается за 2-3 месяца за счет увеличения повторных продаж.
Почему стандартный поиск не подходит
Компонент bitrix:search.title использует полнотекстовый поиск по b_search_content, что даёт задержки 200–500 мс на каталогах от 30 000 товаров и не гарантирует точного совпадения артикула. Наш AJAX-контроллер напрямую обращается к b_iblock_element_property с фильтром по свойству артикула — время ответа 10–50 мс с правильным индексом. Как отмечается в официальной документации Битрикс, для массового поиска по свойству необходимо использовать прямой SQL-запрос с индексом.
| Параметр | Стандартный поиск | Быстрый заказ по артикулу |
|---|---|---|
| Время запроса (50 000 товаров) | 200–500 мс | 10–50 мс |
| Точность совпадения | Не гарантирует | 100% по индексированному полю |
| Массовый ввод | Нет | Да (вставка списка артикул-количество) |
| Поддержка SKU | Через модификацию | Из коробки |
Когда массовый ввод эффективнее ручного
При загрузке нескольких десятков позиций ручной ввод каждого артикула отнимает время. Массовый ввод через вставку текста или файла ускоряет процесс в 5–10 раз. Мы реализовали вкладку, куда можно вставить список в формате артикул количество — парсинг на стороне клиента, затем пакетный AJAX-запрос для проверки всех артикулов.
| Сценарий | Ручной ввод | Массовый ввод |
|---|---|---|
| 1 товар | 10–15 сек | 5–10 сек |
| 10 товаров | 2–3 мин | 20–30 сек |
| 50 товаров | 10–15 мин | 1–2 мин |
Поиск товара по артикулу
Артикул в Битрикс хранится в свойстве инфоблока (PROPERTY_ARTICLE) или в поле XML_ID элемента. Для торговых предложений — в свойстве офферов (PROPERTY_CML2_ARTICLE при импорте из 1С). Артикулы приходят из 1С через CommerceML — стандарт коммерческого обмена 1С. Для производительности на каталогах от 50 000 SKU обязательно создать индекс на колонку свойства:
CREATE INDEX idx_iblock_prop_article
ON b_iblock_element_property (IBLOCK_PROPERTY_ID, VALUE)
WHERE VALUE IS NOT NULL;
Пример AJAX-контроллера поиска
public function searchByArticleAction(string $query): array
{
$result = [];
// Поиск среди торговых предложений
$offerIblockId = \CCatalogSKU::GetInfoByProductIBlock(CATALOG_IBLOCK_ID)['IBLOCK_ID'];
$rs = \CIBlockElement::GetList(
['NAME' => 'ASC'],
[
'IBLOCK_ID' => $offerIblockId,
'PROPERTY_CML2_ARTICLE' => '%' . $query . '%',
'ACTIVE' => 'Y',
],
false,
['nTopCount' => 10],
['ID', 'NAME', 'IBLOCK_ELEMENT_ID', 'PROPERTY_CML2_ARTICLE']
);
while ($item = $rs->Fetch()) {
$result[] = [
'sku_id' => (int)$item['ID'],
'product_id' => (int)$item['IBLOCK_ELEMENT_ID'],
'article' => $item['PROPERTY_CML2_ARTICLE_VALUE'],
'name' => $item['NAME'],
];
}
return $result;
}
Интерфейс быстрого заказа
Блок представляет собой таблицу с динамическими строками: каждая строка — поле артикула с автодополнением, поле количества и кнопка удаления. Внизу кнопка «Добавить всё в корзину». Автодополнение реализуется через debounce(300ms) на поле ввода: при вводе от 3 символов уходит AJAX-запрос к searchByArticleAction, результаты показываются в дропдауне. При выборе товара строка заполняется данными, показывается превью (миниатюра, название, текущая цена). Мы используем тегированное кэширование для автодополнения, чтобы снизить нагрузку на базу.
Массовый ввод — дополнительная вкладка, где можно вставить текст в формате:
АРТИКУЛ КОЛИЧЕСТВО
ABC-123 5
XYZ-456 10
Парсинг на JS, затем пакетный AJAX-запрос для резолвинга всех артикулов сразу.
Добавление в корзину
После подтверждения — пакетное добавление в корзину через \Bitrix\Sale\BasketItem:
$basket = \Bitrix\Sale\Basket::loadForItemsFUser(
\Bitrix\Sale\Fuser::getId(), SITE_ID
);
foreach ($items as $item) {
$basketItem = $basket->createItem('catalog', $item['product_id']);
$basketItem->setFields([
'QUANTITY' => $item['quantity'],
'PRODUCT_PROVIDER_CLASS' => \Bitrix\Catalog\Product\Basket::class,
'MODULE' => 'catalog',
]);
}
$basket->save();
При добавлении торговых предложений передаётся PRODUCT_ID оффера с привязкой к родительскому элементу через PROPS — обязательно при использовании SKU.
Обработка ошибок
- Артикул не найден → строка подсвечивается красным, подсказка «Товар не найден»
- Товар не в наличии → предупреждение с количеством на остатке из
b_catalog_store_product - Несколько совпадений по артикулу → диалог выбора нужного SKU
Процесс работы
- Аналитика — аудит текущей структуры инфоблоков, схемы хранения артикулов, выявление узких мест (нагрузка, дубли).
- Проектирование — согласование UI/UX, выбор способа кэширования (тегированное кэширование ajax-запросов).
- Реализация — написание AJAX-контроллера, фронтенд-блока, интеграция в корзину.
- Тестирование — нагрузочное тестирование на реальном каталоге (мы используем стандартные профили Битрикс и Xdebug для профилирования).
- Деплой — выкатка на боевой сервер, мониторинг логов, настройка кэширования.
Что входит в разработку
- AJAX-контроллер поиска по артикулу с поддержкой торговых предложений
- UI-блок с динамическими строками, автодополнением и превью товара
- Режим массового ввода (вставка списка артикул + количество)
- Пакетное добавление в корзину через
\Bitrix\Sale\Basket - Обработка ошибок: не найден, нет в наличии, несколько совпадений
Мы реализовали более 50 проектов на Битрикс, включая каталоги с сотнями тысяч товаров. Оставьте заявку на бесплатный аудит — мы проверим структуру вашего каталога и предложим оптимальное решение. Получите консультацию инженера по внедрению функционала быстрого заказа.







