Настройка отображения количества покупок товара 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в инфоблоке каталога - Написание агента для периодического пересчёта всех товаров
- Добавление вывода счётчика в шаблон карточки товара
- Настройка правильных окончаний для числительных







