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

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Разработка системы вопрос-ответ по товарам 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • 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С-Битрикс

Блок «Вопросы и ответы» на странице товара позволяет потенциальным покупателям задать уточняющий вопрос и получить ответ от менеджера или других покупателей. Это снижает количество обращений в поддержку и работает как 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 в одном запросе.

Жизненный цикл вопроса

Каждый вопрос проходит следующие этапы:

  1. Покупатель отправляет вопрос → создаётся запись STATUS = PENDING.
  2. Модератор получает уведомление на email (почтовое событие PRODUCT_QUESTION_NEW).
  3. Модератор одобряет вопрос (STATUS = APPROVED) — вопрос становится виден на странице.
  4. Менеджер или другой покупатель оставляет ответ → b_product_answer с STATUS = PENDING.
  5. Если ответ требует модерации — одобряется аналогично. Официальные ответы (IS_OFFICIAL = 1) могут публиковаться автоматически.
  6. После первого одобренного ответа автор вопроса получает уведомление по 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 дней