Розробка функціоналу швидкого замовлення за артикулом 1С-Бітрікс
На оптових і B2B-сайтах покупець знає артикул — він не хоче шукати товар через каталог. Йому потрібен рядок введення: вбив артикул, вказав кількість, додав до кошика. Стандартний пошук 1С-Бітрікс (search.title) для цього не підходить: він шукає за назвою, повільно працює на великих каталогах і не підтримує масове введення. Швидке замовлення за артикулом — окремий UI-блок з прямим запитом до бази за індексованим полем.
Пошук товару за артикулом
Артикул у 1С-Бітрікс зберігається у властивості інфоблока (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 - Обробка помилок: не знайдено, немає в наявності, кілька збігів







