Налаштування відображення кількості покупок товару 1С-Бітрікс
Лічильник покупок на картці товару — інструмент соціального доказу. «Куплено 847 разів» працює краще за будь-який банер зі знижкою. У Бітрікс ці дані є в базі, але за замовчуванням ніде не виводяться — потрібно витягнути їх із таблиць замовлень і підключити вивід у шаблоні.
Де зберігаються дані про покупки
Кожна позиція замовлення записується в таблицю b_sale_basket. Ключові поля:
-
PRODUCT_ID— ID елемента інфоблока -
QUANTITY— кількість одиниць у замовленні -
ORDER_ID— прив'язка до замовлення
Таблиця b_sale_order містить статуси замовлень. Для підрахунку реальних покупок (не покинутих кошиків) потрібна фільтрація за статусом: поле STATUS_ID у b_sale_order. Зазвичай враховуються замовлення зі статусами 'N', 'P', 'F' — залежно від налаштувань магазину.
Запит для підрахунку
Прямий SQL для отримання кількості покупок конкретного товару:
SELECT SUM(b.QUANTITY) AS total_purchased
FROM b_sale_basket b
INNER JOIN b_sale_order o ON b.ORDER_ID = o.ID
WHERE b.PRODUCT_ID = :product_id
AND o.CANCELED = 'N'
AND o.STATUS_ID IN ('N', 'P', 'F');
Запит до b_sale_basket через API: CSaleBasket::GetList() з фільтром за PRODUCT_ID, але цей метод не фільтрує за статусом замовлення — доведеться джойнити вручну або використовувати прямий запит через $DB->Query().
Кешування лічильника
Рахувати покупки при кожному перегляді картки товару — погана ідея при навантаженому магазині. Дані кешуються в b_iblock_element_prop через користувацьку властивість PURCHASE_COUNT з типом «Число». Агент оновлює значення за розкладом — раз на годину або раз на добу:
CIBlockElement::SetPropertyValuesEx(
$elementId,
$iblockId,
['PURCHASE_COUNT' => $totalPurchased]
);
Альтернатива — зберігати лічильник у b_catalog_element через окреме поле або в b_iblock_element через UF-поле UF_PURCHASE_COUNT.
Вивід у шаблоні
У шаблоні компонента bitrix:catalog.element (файл template.php) додається вивід:
$purchaseCount = (int)$arResult["PROPERTIES"]["PURCHASE_COUNT"]["VALUE"];
if ($purchaseCount > 0) {
echo '<span class="purchase-count">Куплено ' . $purchaseCount . ' разів</span>';
}
Для більш гнучкого виводу (наприклад, «237 покупок», «1 покупка», «5 покупок» з правильними закінченнями) використовується функція відмінювання числівників.
Варіант із реальним часом
Якщо потрібен актуальний лічильник без затримки агента — дані завантажуються AJAX-запитом при відкритті картки. Компонент повертає лише структуру сторінки, а лічильник підтягується окремим запитом до контролера, який виконує SQL і повертає JSON. Це дозволяє кешувати основний HTML-контент картки незалежно від лічильника.
| Масштаб каталогу | Рекомендоване оновлення | Метод зберігання |
|---|---|---|
| до 1000 товарів | кожну годину (агент) | властивість інфоблока |
| 1000–10 000 товарів | раз на добу | UF-поле |
| більше 10 000 товарів | AJAX при відкритті | прямий SQL + Redis |
Що входить у налаштування
- Аналіз статусів замовлень і визначення «облікових» статусів для підрахунку
- Створення UF-властивості
PURCHASE_COUNTв інфоблоці каталогу - Написання агента для періодичного перерахунку всіх товарів
- Додавання виводу лічильника в шаблон картки товару
- Налаштування правильних закінчень для числівників







