Разработка системы вопрос-ответ по товарам 1С-Битрикс
Блок «Вопросы и ответы» на странице товара позволяет потенциальным покупателям задать уточняющий вопрос и получить ответ от менеджера или других покупателей. Это снижает количество обращений в поддержку и работает как UGC-контент для SEO. В Битрикс стандартного компонента для такого функционала нет — он строится на кастомной ORM-модели.
Структура данных
Для системы Q&A достаточно двух связанных таблиц. Таблица b_product_question:
| Поле | Тип | Назначение |
|---|---|---|
| ID | int | Первичный ключ |
| PRODUCT_ID | int | ID товара |
| USER_ID | int | ID пользователя (NULL = гость) |
| AUTHOR_NAME | varchar(255) | Имя автора вопроса |
| AUTHOR_EMAIL | varchar(255) | Email для уведомления об ответе |
| QUESTION | text | Текст вопроса |
| STATUS | enum | PENDING, APPROVED, REJECTED |
| CREATED_AT | datetime | Дата создания |
Таблица b_product_answer (ответы на вопросы):
| Поле | Тип | Назначение |
|---|---|---|
| ID | int | Первичный ключ |
| QUESTION_ID | int | FK → b_product_question.ID |
| USER_ID | int | Кто ответил |
| AUTHOR_NAME | varchar(255) | Имя отвечающего |
| IS_OFFICIAL | tinyint(1) | Официальный ответ от магазина |
| ANSWER | text | Текст ответа |
| STATUS | enum | PENDING, APPROVED |
| CREATED_AT | datetime | Дата |
ORM-классы ProductQuestionTable и ProductAnswerTable наследуются от \Bitrix\Main\ORM\Data\DataManager. Связь оформляется через \Bitrix\Main\ORM\Fields\Relations\Reference для JOIN в одном запросе.
Жизненный цикл вопроса
Каждый вопрос проходит следующие этапы:
- Покупатель отправляет вопрос → создаётся запись
STATUS = PENDING. - Модератор получает уведомление на email (почтовое событие
PRODUCT_QUESTION_NEW). - Модератор одобряет вопрос (
STATUS = APPROVED) — вопрос становится виден на странице. - Менеджер или другой покупатель оставляет ответ →
b_product_answerсSTATUS = PENDING. - Если ответ требует модерации — одобряется аналогично. Официальные ответы (
IS_OFFICIAL = 1) могут публиковаться автоматически. - После первого одобренного ответа автор вопроса получает уведомление по email.
Уведомления
Минимальный набор почтовых событий:
-
PRODUCT_QUESTION_NEW— новый вопрос ожидает модерации. Получатель: менеджер. -
PRODUCT_ANSWER_NEW— новый ответ ожидает модерации (если включена модерация ответов). -
PRODUCT_QUESTION_ANSWERED— ваш вопрос получил ответ. Получатель: автор вопроса поAUTHOR_EMAIL.
Шаблоны создаются в Настройки → Почтовые события. Переменные передаются через второй параметр CEvent::Send():
\CEvent::Send('PRODUCT_QUESTION_ANSWERED', SITE_ID, [
'QUESTION_TEXT' => $question['QUESTION'],
'ANSWER_TEXT' => $answer['ANSWER'],
'PRODUCT_NAME' => $productName,
'PRODUCT_URL' => $productUrl,
'AUTHOR_EMAIL' => $question['AUTHOR_EMAIL'],
'AUTHOR_NAME' => $question['AUTHOR_NAME'],
]);
Поиск по вопросам
На страницах с большим количеством вопросов (популярные товары) добавляется AJAX-поиск по тексту вопроса. Запрос через ORM:
ProductQuestionTable::getList([
'filter' => [
'=PRODUCT_ID' => $productId,
'=STATUS' => 'APPROVED',
'%QUESTION' => $searchQuery,
],
'select' => ['ID', 'AUTHOR_NAME', 'QUESTION', 'CREATED_AT'],
'order' => ['CREATED_AT' => 'DESC'],
'limit' => 10,
]);
Символ % перед ключом в фильтре D7 задаёт LIKE-поиск.
Голосование за полезность ответа
Дополнительный слой — «Был ли ответ полезен?» (да/нет). Это небольшая отдельная таблица b_product_answer_vote с полями ANSWER_ID, USER_ID, IP, IS_HELPFUL. Агрегированные счётчики (HELPFUL_COUNT, UNHELPFUL_COUNT) хранятся прямо в b_product_answer для быстрого вывода без JOIN.
Административный раздел
В /local/admin/product_questions.php выводится таблица вопросов с фильтрами по статусу, товару, дате. Используется стандартный класс CAdminList для быстрой реализации пагинации и сортировки без написания HTML вручную.
Сроки разработки
| Масштаб | Состав | Срок |
|---|---|---|
| Базовый | ORM-модели, форма вопроса, вывод Q&A, уведомления, модерация в ЛК | 4–6 дней |
| Полный | Ответы от покупателей, поиск по вопросам, голосование за полезность, административный раздел | 8–12 дней |







