Разработка системы отзывов на товары 1С-Битрикс
В 1С-Битрикс есть встроенный механизм форумов (forum) и компонент bitrix:forum.reviews, который технически может служить системой отзывов. Но большинство проектов от него отказываются: избыточная структура форума для простых отзывов, сложность настройки модерации, плохая интеграция с карточкой товара. На практике отзывы строятся либо на инфоблоках, либо на ORM-модели с нуля.
Два подхода к хранению отзывов
Подход 1: Инфоблок отзывов. Быстро, без разработки, но ограничено. Создаётся инфоблок «Отзывы» со свойствами: PRODUCT_ID (привязка к товару), RATING (число), ADVANTAGES, DISADVANTAGES, COMMENT. Элемент инфоблока = один отзыв. Для привязки к товару используется свойство типа «Элемент инфоблока» или просто числовое поле с ID товара.
Вывод — компонент bitrix:catalog.reviews (если он есть в шаблоне) или кастомный компонент на базе CIBlockElement::GetList() с фильтром PROPERTY_PRODUCT_ID = $productId.
Подход 2: Собственная ORM-модель. Более гибко: транзакции, сложные запросы, расширяемость. Таблица b_product_review:
| Поле | Тип | Назначение |
|---|---|---|
| ID | int auto_increment | Первичный ключ |
| PRODUCT_ID | int | ID товара в инфоблоке |
| USER_ID | int | ID пользователя (NULL для гостей) |
| AUTHOR_NAME | varchar(255) | Имя автора |
| AUTHOR_EMAIL | varchar(255) | Email для уведомлений |
| RATING | tinyint | Оценка 1–5 |
| ADVANTAGES | text | Достоинства |
| DISADVANTAGES | text | Недостатки |
| COMMENT | text | Основной текст |
| STATUS | enum | PENDING, APPROVED, REJECTED |
| CREATED_AT | datetime | Дата создания |
| IS_VERIFIED_PURCHASE | tinyint(1) | Покупал ли пользователь этот товар |
ORM-класс наследуется от \Bitrix\Main\ORM\Data\DataManager — получаем стандартный API D7 для выборок, добавления, обновления.
Верификация покупки
Один из ключевых признаков доверия к отзыву — «Подтверждённая покупка». Для определения флага IS_VERIFIED_PURCHASE при отправке отзыва проверяем историю заказов:
function isVerifiedPurchase(int $userId, int $productId): bool
{
$orders = \Bitrix\Sale\OrderTable::getList([
'filter' => ['=USER_ID' => $userId, '=STATUS_ID' => 'F'],
'select' => ['ID'],
]);
$orderIds = array_column(iterator_to_array($orders), 'ID');
if (empty($orderIds)) {
return false;
}
$basket = \Bitrix\Sale\BasketTable::getList([
'filter' => [
'=ORDER_ID' => $orderIds,
'=PRODUCT_ID' => $productId,
],
'select' => ['ID'],
'limit' => 1,
])->fetch();
return (bool)$basket;
}
Статус 'F' — выполненный заказ. Проверяем именно выполненные, чтобы отсечь отменённые и не оплаченные.
Модерация отзывов
Новые отзывы попадают в статус PENDING. В административной части создаётся кастомная страница (или раздел в local/admin/) с таблицей отзывов и кнопками «Одобрить» / «Отклонить». При смене статуса:
-
APPROVED→ отзыв становится видим на сайте, пересчитывается средний рейтинг товара. -
REJECTED→ отзыв скрыт, опционально отправляется письмо автору.
Уведомление о новом отзыве для модератора — почтовое событие REVIEW_NEW_PENDING, шаблон в Настройки → Почтовые события.
Пересчёт рейтинга товара
После одобрения или удаления отзыва нужно пересчитать средний рейтинг и сохранить его в свойство товара (например, AVERAGE_RATING числового типа). Это ускоряет вывод рейтинга на страницах каталога — не нужен JOIN с таблицей отзывов при каждом запросе.
function recalculateProductRating(int $productId): void
{
$result = \Bitrix\Main\Application::getConnection()->query(
"SELECT AVG(RATING) as AVG_RATING, COUNT(*) as CNT
FROM b_product_review
WHERE PRODUCT_ID = {$productId} AND STATUS = 'APPROVED'"
)->fetch();
\CIBlockElement::SetPropertyValuesEx($productId, false, [
'AVERAGE_RATING' => round((float)$result['AVG_RATING'], 1),
'REVIEW_COUNT' => (int)$result['CNT'],
]);
}
Вызывается из обработчика события при смене статуса отзыва.
Антиспам и ограничения
- Проверка на дублирующий отзыв: один пользователь — один отзыв на товар (проверка по
USER_ID + PRODUCT_IDили поAUTHOR_EMAIL + PRODUCT_IDдля гостей). - Каптча для гостей (компонент
bitrix:main.captcha). - Ограничение частоты: один IP не может отправить более 3 отзывов в час (через
\Bitrix\Main\Data\Cacheили таблицу с таймстампами).
Сроки разработки
| Масштаб | Состав | Срок |
|---|---|---|
| Базовый | ORM-модель, форма, вывод, модерация в ЛК | 4–6 дней |
| Полный | Верификация покупки, пересчёт рейтинга, уведомления, антиспам, административный раздел | 8–12 дней |







