Разработка функционала быстрого заказа по артикулу 1С-Битрикс
На оптовых и B2B-сайтах покупатель знает артикул — он не хочет искать товар через каталог. Ему нужна строка ввода: вбил артикул, указал количество, добавил в корзину. Стандартный поиск Битрикс (search.title) для этого не подходит: он ищет по названию, медленно работает на больших каталогах и не поддерживает массовый ввод. Быстрый заказ по артикулу — отдельный UI-блок с прямым запросом к базе по индексированному полю.
Поиск товара по артикулу
Артикул в Битрикс хранится в свойстве инфоблока (PROPERTY_ARTICLE) или в поле XML_ID элемента. Для торговых предложений — в свойстве офферов (PROPERTY_CML2_ARTICLE при импорте из 1С).
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;
}
Для производительности на каталогах от 50 000 SKU — индекс на колонку свойства:
CREATE INDEX idx_iblock_prop_article
ON b_iblock_element_property (IBLOCK_PROPERTY_ID, VALUE)
WHERE VALUE IS NOT NULL;
Интерфейс быстрого заказа
Блок представляет собой таблицу с динамическими строками: каждая строка — это поле артикула с автодополнением, поле количества и кнопка удаления. Внизу кнопка «Добавить всё в корзину».
Автодополнение реализуется через debounce(300ms) на поле ввода: при вводе от 3 символов уходит AJAX-запрос к searchByArticleAction, результаты показываются в дропдауне. При выборе товара строка заполняется данными, показывается превью (миниатюра, название, текущая цена).
Массовый ввод — дополнительная вкладка, где можно вставить текст в формате:
АРТИКУЛ КОЛИЧЕСТВО
ABC-123 5
XYZ-456 10
Парсинг на JS, затем пакетный AJAX-запрос для резолвинга всех артикулов сразу.
Добавление в корзину
После подтверждения — пакетное добавление в корзину через \Bitrix\Sale\BasketItem:
$basket = \Bitrix\Sale\Basket::loadItemsForFUser(
\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
Что входит в разработку
- AJAX-контроллер поиска по артикулу с поддержкой торговых предложений
- UI-блок с динамическими строками, автодополнением и превью товара
- Режим массового ввода (вставка списка артикул + количество)
- Пакетное добавление в корзину через
\Bitrix\Sale\Basket - Обработка ошибок: не найден, нет в наличии, несколько совпадений







