Разработка функционала социального доказательства (social proof) 1С-Битрикс
Карточка товара без отзывов, рейтинга и реальных фото покупателей конвертирует хуже. Это не маркетинговое предположение — это измеримо: A/B-тесты на e-commerce проектах стабильно показывают рост конверсии на 15–30% при добавлении блоков social proof. Задача разработчика: интегрировать эти элементы в Битрикс-магазин так, чтобы они не тормозили страницу и не плодили спам.
Что входит в social proof на Битрикс
Набор блоков зависит от типа бизнеса, но типичный перечень:
- Рейтинг и отзывы — звёздочный рейтинг, текстовые отзывы с фото
- Счётчик просмотров/покупок — «Этот товар купили 127 раз»
- Уведомления о недавних покупках — всплывающий popup «Иван из Москвы купил 5 минут назад»
- Вопросы и ответы — Q&A раздел на карточке товара
- Пользовательские фото — UGC-галерея от покупателей
- Бейджи — «Выбор покупателей», «Хит продаж», «Новинка»
Рейтинг и отзывы: хранение и отображение
В Битрикс есть встроенный модуль vote (голосование) и возможности через свойства инфоблока. Для полноценной системы отзывов обычно строится кастомная таблица:
CREATE TABLE b_product_reviews (
ID SERIAL PRIMARY KEY,
PRODUCT_ID INT NOT NULL,
USER_ID INT,
AUTHOR_NAME VARCHAR(255),
RATING SMALLINT CHECK (RATING BETWEEN 1 AND 5),
TITLE VARCHAR(500),
BODY TEXT,
PROS TEXT,
CONS TEXT,
STATUS VARCHAR(20) DEFAULT 'pending', -- pending|approved|rejected
DATE_CREATE TIMESTAMP DEFAULT NOW(),
HELPFUL_YES INT DEFAULT 0,
HELPFUL_NO INT DEFAULT 0
);
CREATE TABLE b_review_photos (
ID SERIAL PRIMARY KEY,
REVIEW_ID INT NOT NULL REFERENCES b_product_reviews(ID),
FILE_ID INT NOT NULL REFERENCES b_file(ID)
);
Агрегированный рейтинг (средняя оценка, количество отзывов) кешируется в отдельном поле инфоблока — не вычисляется при каждом запросе страницы. Обновляется через обработчик при одобрении нового отзыва.
Модерация обязательна. Без неё при появлении первого конкурентного или спамного отзыва репутация рушится. В стандартной реализации: отзыв со статусом pending не отображается, модератор одобряет через кастомный раздел в /bitrix/admin/ или через Битрикс24.
Счётчики и уведомления о покупках
Счётчик покупок — количество заказов с данным товаром из b_sale_basket. Прямой SQL-запрос для каждой карточки — это N+1 проблема при листинге. Решение: отдельная таблица-кеш, которая обновляется при каждом оформлении заказа:
CREATE TABLE b_product_social_counters (
PRODUCT_ID INT PRIMARY KEY,
PURCHASE_COUNT INT DEFAULT 0,
VIEW_COUNT INT DEFAULT 0,
WISHLIST_COUNT INT DEFAULT 0,
LAST_PURCHASED TIMESTAMP
);
Обновление через обработчик события OnSaleOrderSaved:
AddEventHandler('sale', 'OnSaleOrderSaved', function($event) {
$order = $event->getParameter('ENTITY');
foreach ($order->getBasket() as $item) {
$productId = $item->getField('PRODUCT_ID');
$db->query("UPDATE b_product_social_counters SET purchase_count = purchase_count + 1,
last_purchased = NOW() WHERE product_id = $productId");
}
});
Всплывающие уведомления о покупках — AJAX-запрос к контроллеру, который возвращает последние N покупок товара (с именем города из b_sale_order_props, без персональных данных). На фронтенде — показ popup с задержкой и ограничением частоты:
async function showRecentPurchaseNotification(productId) {
const data = await fetch(`/local/api/social-proof/recent/?product=${productId}`).then(r => r.json());
if (data.length === 0) return;
const purchase = data[Math.floor(Math.random() * data.length)];
showNotification(`${purchase.city}: куплен ${purchase.time_ago} назад`);
}
Для уведомлений важна реальность данных: показывать выдуманные покупки нельзя. Если реальных данных мало (новый товар), блок не отображается.
UGC-галерея покупателей
Фото от реальных покупателей — сильнейший social proof для fashion, мебели, техники. Технически: к форме отзыва добавляется поле загрузки изображений (через CFile::SaveFile()), загруженные фото проходят модерацию, одобренные выводятся в галерее под основными фото товара.
Ресайз загружаемых пользователями изображений обязателен — без него склад /upload/ за год заполняется гигабайтами мусора:
// При сохранении фото отзыва
$resized = CFile::ResizeImageGet($fileId, ['width' => 800, 'height' => 800], BX_RESIZE_IMAGE_PROPORTIONAL);
Schema.org разметка для отзывов
Отзывы с правильной разметкой выводятся в поисковой выдаче как звёздочный рейтинг. Разметка Product + AggregateRating + Review:
$schema = [
'@context' => 'https://schema.org',
'@type' => 'Product',
'name' => $arResult['NAME'],
'aggregateRating' => [
'@type' => 'AggregateRating',
'ratingValue' => $arResult['RATING'],
'reviewCount' => $arResult['REVIEW_COUNT'],
'bestRating' => 5,
],
'review' => array_map(fn($r) => [
'@type' => 'Review',
'reviewRating' => ['@type' => 'Rating', 'ratingValue' => $r['RATING']],
'author' => ['@type' => 'Person', 'name' => $r['AUTHOR_NAME']],
'reviewBody' => $r['BODY'],
], $reviews),
];
echo '<script type="application/ld+json">' . json_encode($schema, JSON_UNESCAPED_UNICODE) . '</script>';
Бейджи на карточках товара
«Хит продаж», «Выбор покупателей», «Только здесь» — статусы, которые вычисляются по данным или проставляются вручную:
-
Хит продаж— еслиpurchase_countв топ-5% каталога (вычисляется агентом раз в сутки) -
Высокий рейтинг— если средний рейтинг ≥ 4.5 и количество отзывов ≥ 10 -
Скоро закончится— если остаток товара ≤ 5 единиц
Бейджи хранятся в свойстве инфоблока типа «Список» (множественное). Агент обновляет их по расписанию, не нагружая каждый запрос страницы.
Защита от накрутки
Без защиты накручивают и рейтинг, и счётчики покупок. Базовые меры:
- Отзыв только от зарегистрированных пользователей, которые купили этот товар (проверка по
b_sale_basket) - Ограничение: один отзыв на товар от одного пользователя
- Rate limiting на API счётчика просмотров: один инкремент на сессию
- Captcha или скрытое поле honeypot на форме отзыва
Сроки
| Блок | Что входит | Срок |
|---|---|---|
| Рейтинг + отзывы | БД, форма, модерация, Schema.org | 2–3 недели |
| Счётчики + уведомления | Таблица-кеш, агенты, popup | 1–2 недели |
| UGC-галерея | Загрузка, ресайз, модерация, вывод | 1–2 недели |
| Бейджи | Агент вычисления, вывод в листинге | 3–5 дней |
Social proof — это не украшение, а часть конверсионной воронки. Инвестиции в правильную реализацию окупаются ростом конверсии карточки товара, который легко измеряется через A/B-тест.







