Розробка модуля відгуків і рейтингів 1С-Бітрікс
У Бітрікс є компонент bitrix:catalog.element.vote для голосування та bitrix:forum з прив'язкою до елементів — це те, з чого зазвичай збирають відгуки. Результат очікуваний: форум без модерації, рейтинг без верифікації покупки, відсутність структурованих даних для Schema.org. Повноцінний модуль відгуків — це інша історія: верифіковані відгуки, багатокритеріальний рейтинг, модерація, відповіді продавця, агреговані зірки в мікророзмітці.
Модель даних
Модуль vendor.reviews:
-
b_vendor_review— відгуки: id, entity_type (product/service/company), entity_id, user_id, author_name, author_email, order_id, title, body, pros, cons, rating (1-5), status (pending/approved/rejected/spam), is_verified_purchase, created_at, updated_at -
b_vendor_review_criteria— критерії оцінки: id, entity_type, name, sort -
b_vendor_review_rating— оцінки за критеріями: id, review_id, criteria_id, value -
b_vendor_review_vote— голоси «корисний/некорисний»: id, review_id, user_id, ip, value (1/-1), created_at -
b_vendor_review_reply— відповіді адміністратора: id, review_id, author_id, body, created_at
Верифікація покупки
Найцінніше у відгуку — позначка «перевірений покупець». Перевіряємо по b_sale_order:
public function isVerifiedPurchase(int $userId, int $productId): bool
{
// Шукаємо оплачене замовлення цього користувача з даним товаром
$order = \Bitrix\Sale\Internals\BasketTable::getList([
'select' => ['ORDER_ID'],
'filter' => [
'=PRODUCT_ID' => $productId,
'=ORDER.USER_ID' => $userId,
'=ORDER.PAYED' => 'Y',
'=ORDER.CANCELED' => 'N',
],
'limit' => 1,
])->fetch();
return (bool)$order;
}
При створенні відгуку order_id можна передати явно — тоді перевірка однозначна. Без order_id — перевіряємо по будь-якому оплаченому замовленню з цим товаром.
Модерація
Всі відгуки створюються зі статусом pending і потрапляють у чергу модерації. Можливі два режими:
- Ручна модерація — модератор схвалює/відхиляє кожен відгук
- Автосхвалення — відгуки верифікованих покупців публікуються автоматично, решта — в чергу
Фільтр спаму працює через прості евристики: посилання в тілі відгуку, поріг великих літер, дублюючі тексти, стоп-слова. Підозрілі відгуки отримують статус spam.
class SpamDetector
{
public function check(string $text): SpamResult
{
if (preg_match('/https?:\/\//i', $text)) return SpamResult::spam('Посилання заборонені');
if (similar_text($text, $this->getLastReview($text)) > 80) return SpamResult::spam('Дублікат');
foreach ($this->stopWords as $word) {
if (mb_stripos($text, $word) !== false) return SpamResult::suspicious();
}
return SpamResult::clean();
}
}
Багатокритеріальний рейтинг
Для товарів можна задати кілька критеріїв оцінки (наприклад: «Якість», «Відповідність опису», «Швидкість доставки»). Підсумковий рейтинг — середнє по всіх критеріях:
SELECT
entity_id,
AVG(rr.value) AS avg_rating,
COUNT(DISTINCT r.id) AS review_count
FROM b_vendor_review r
JOIN b_vendor_review_rating rr ON rr.review_id = r.id
WHERE r.entity_type = 'product'
AND r.status = 'approved'
GROUP BY entity_id;
Агреговані дані кешуються тегом review_entity_{entity_id} і скидаються при схваленні нового відгуку.
Schema.org мікророзмітка
Для SEO-ефекту важливо вивести агрегований рейтинг у мікророзмітці:
<div itemscope itemtype="https://schema.org/Product">
<span itemprop="name">Назва товару</span>
<div itemprop="aggregateRating" itemscope itemtype="https://schema.org/AggregateRating">
<span itemprop="ratingValue">4.7</span>
<span itemprop="reviewCount">143</span>
</div>
</div>
Компонент vendor:reviews.aggregate генерує цей блок на основі даних з кешу.
Голосування за корисність
Користувачі можуть відзначити відгук як «корисний» або «некорисний». Механізм захисту від накрутки:
- Один голос з однієї IP на добу
- Авторизовані користувачі — один голос на відгук назавжди
- Рейтинг корисності впливає на порядок відображення відгуків
Терміни розробки
| Етап | Термін |
|---|---|
| ORM-таблиці, модель відгуків | 1 день |
| Верифікація покупки, інтеграція з sale | 1 день |
| Модерація, спам-фільтр | 2 дні |
| Багатокритеріальний рейтинг, агрегація | 1 день |
| Schema.org мікророзмітка | 0.5 дня |
| Голосування за корисність | 0.5 дня |
| Відповіді продавця, сповіщення | 1 день |
| Компоненти для сайту | 2 дні |
| Адміністративний інтерфейс + черга модерації | 1 день |
| Тестування | 1 день |
Разом: 11 робочих днів. Імпорт відгуків з Яндекс.Маркету або інших майданчиків — додатково 1–2 дні.







