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

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Разработка системы отзывов на товары 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1181
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    813
  • 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 Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Разработка системы отзывов на товары 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 дней