Розробка системи питання-відповідь по товарам у 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 днів |







