Розробка системи рейтингів товарів 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Розробка системи рейтингів товарів 1С-Бітрікс
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Розробка системи рейтингів товарів у 1С-Бітрикс

Рейтинг товара — агрегована оцінка, яка впливає на ранжування в каталозі, виводиться в карточці та в списках. У 1С-Бітрикс є модуль vote (голосування), але для рейтингу товарів він надлишковий та погано інтегрується з каталогом. Практичніше зберігати оцінки в окремій таблиці та агрегувати значення у властивість інфоблока.

Архітектура зберігання оцінок

Таблиця b_product_vote для індивідуальних оцінок:

Поле Тип Призначення
ID int Первинний ключ
PRODUCT_ID int ID товара
USER_ID int ID користувача (NULL = гість)
IP varchar(45) IP-адреса (для гостей та захисту від накрутки)
RATING tinyint Оцінка 1–5
CREATED_AT datetime Коли проголосував

ORM-клас ProductVoteTable наслідується від \Bitrix\Main\ORM\Data\DataManager.

В інфоблоці товарів додаються дві числові властивості:

  • RATING_AVG — середня оцінка (float, оновлюється після кожного голосування)
  • RATING_COUNT — кількість оцінок

Це дозволяє сортувати та фільтрувати за рейтингом через стандартний CIBlockElement::GetList() без JOIN.

Алгоритм голосування

Голосування реалізується через AJAX-запит. Компонент відает форму зі зірочками, клік відправляє POST на контролер:

// local/ajax/product_vote.php
\Bitrix\Main\Loader::includeModule('main');
\Bitrix\Main\Loader::includeModule('catalog');

$productId = (int)($_POST['product_id'] ?? 0);
$rating    = (int)($_POST['rating'] ?? 0);

if ($rating < 1 || $rating > 5 || $productId <= 0) {
    echo json_encode(['success' => false, 'error' => 'invalid_data']);
    exit;
}

$userId = $GLOBALS['USER']->GetID() ?: null;
$ip     = \Bitrix\Main\Context::getCurrent()->getRequest()->getRemoteAddress();

// Перевірка: вже голосував?
$existing = ProductVoteTable::getList([
    'filter' => ['=PRODUCT_ID' => $productId, '=USER_ID' => $userId ?: false, '=IP' => $ip],
    'limit'  => 1,
])->fetch();

if ($existing && $userId === null) {
    echo json_encode(['success' => false, 'error' => 'already_voted']);
    exit;
}

Для авторизованих користувачів перевіряємо по USER_ID. Для гостей — по IP. Авторизований користувач може змінити свою оцінку (оновлюємо існуючий запис замість створення нового).

Перерахунок агрегованого рейтингу

Після кожного голосування оновлюємо агрегати:

function updateProductRating(int $productId): void
{
    $conn = \Bitrix\Main\Application::getConnection();
    $row = $conn->query(
        "SELECT AVG(RATING) as AVG_RATING, COUNT(*) as CNT
         FROM b_product_vote
         WHERE PRODUCT_ID = {$productId}"
    )->fetch();

    \CIBlockElement::SetPropertyValuesEx($productId, false, [
        'RATING_AVG'   => round((float)$row['AVG_RATING'], 2),
        'RATING_COUNT' => (int)$row['CNT'],
    ]);
}

SetPropertyValuesEx працює швидше, ніж Update() всього елемента — він оновлює тільки вказані властивості.

Візуалізація: віджет зі зірочками

На фронтенді рейтинг відображається як набір SVG-зірочок. Логіка часткового заповнення: для оцінки 4.3 чотири зірочки заповнені повністю, п'ята — на 30%. Реалізується через CSS-clip або SVG-gradient з шириною, пропорційною дробовій частині.

Компонент для виводу рейтингу в карточці товара та в списку приймає параметри:

$APPLICATION->IncludeComponent('custom:product.rating', '', [
    'PRODUCT_ID'    => $arResult['ID'],
    'SHOW_FORM'     => $USER->IsAuthorized() ? 'Y' : 'N',
    'CURRENT_RATING' => $arResult['PROPERTIES']['RATING_AVG']['VALUE'],
    'VOTE_COUNT'    => $arResult['PROPERTIES']['RATING_COUNT']['VALUE'],
]);

Захист від накрутки

Обмеження по IP добре для гостей, але не для організованих накруток:

  • Для авторизованих — одна оцінка на товар (жорстка перевірка по USER_ID + PRODUCT_ID).
  • Обмеження: не можна голосувати за товар, який ніколи не переглядався (перевірка через b_stat_session або користувацьку таблицю переглядів).
  • Опціонально: дозволити голосування тільки користувачам, які купили товар (аналогічно верифікації в системі відгуків).

Терміни розробки

Масштаб Склад Термін
Базовий ORM-модель, AJAX-голосування, віджет зі зірочками, агрегація у властивість 3–4 дні
Повний Зміна оцінки, захист від накрутки, сортування в каталозі за рейтингом, історія голосувань 5–7 днів