Розробка модуля FAQ 1С-Бітрікс
FAQ на Бітрікс найчастіше роблять через інфоблок з двома полями — питання і відповідь — і компонент bitrix:catalog.list у спрощеній версії. Проблеми починаються, коли питань стає більше 50: немає повнотекстового пошуку по відповідях, немає групування по розділах з акордеоном, немає аналітики по тому, які питання дивляться частіше, немає можливості задати питання прямо зі сторінки FAQ. Спеціалізований модуль вирішує кожне з цих завдань.
Модель даних
Модуль vendor.faq:
-
b_vendor_faq_category— категорії: id, name, slug, sort, is_active, questions_count (денормалізований лічильник) -
b_vendor_faq_question— питання: id, category_id, question, answer (HTML), slug, sort, views, is_active, is_featured, created_at, updated_at -
b_vendor_faq_vote— голоси «допомогло/не допомогло»: id, question_id, user_id, ip, value, created_at -
b_vendor_faq_search_log— лог пошуку: id, query, results_count, created_at
Повнотекстовий пошук
Стандартний пошук Бітрікс через bitrix:search.title індексує сторінки, а не записи. Для FAQ потрібен миттєвий пошук по питаннях і відповідях без перезавантаження сторінки:
// AJAX-ендпоінт пошуку
public function search(string $query): array
{
$query = mb_strtolower(trim($query));
// Логуємо запит для аналітики
SearchLogTable::add(['QUERY' => $query]);
$result = QuestionTable::getList([
'select' => ['ID', 'QUESTION', 'ANSWER', 'CATEGORY_ID'],
'filter' => [
'IS_ACTIVE' => 'Y',
[
'LOGIC' => 'OR',
'%QUESTION' => $query,
'%ANSWER' => $query,
],
],
'limit' => 10,
'order' => ['IS_FEATURED' => 'DESC', 'VIEWS' => 'DESC'],
])->fetchAll();
// Підсвічуємо збіги в результатах
return array_map(fn($q) => $this->highlight($q, $query), $result);
}
Для великих баз (1000+ питань) пошук через %LIKE% у PostgreSQL замінюється на повнотекстовий індекс (tsvector). Колонка fts_vector оновлюється тригером при зміні питання або відповіді.
Лічильник переглядів і рейтинг
При відкритті питання лічильник інкрементується через AJAX:
QuestionTable::update($questionId, ['VIEWS' => new \Bitrix\Main\DB\SqlExpression('VIEWS + 1')]);
Після прочитання користувач може оцінити відповідь: «Це допомогло» / «Не допомогло». Статистика голосів використовується для двох цілей: сортування (корисні питання вище) та виявлення проблемних відповідей (багато негативних — потрібно переписати).
Структура акордеона
Компонент vendor:faq.list рендерить питання з групуванням по категоріях. Акордеон реалізовано на CSS (:details/:summary) без JavaScript — працює без JS, індексується без проблем. При наявності GET-параметра ?q=slug-pytannya потрібна секція розкривається автоматично через атрибут open.
Форма «Задати питання»
Якщо користувач не знайшов відповіді в пошуку, форма пропонує задати питання. Питання зберігається в b_vendor_feedback_submission (інтеграція з модулем зворотного зв'язку) або безпосередньо в b_vendor_faq_question зі статусом draft для подальшої публікації. Адміністратор може опублікувати його в FAQ, якщо питання цікаве широкій аудиторії.
Schema.org FAQPage
Для просування в пошуку важлива мікророзмітка:
<div itemscope itemtype="https://schema.org/FAQPage">
<div itemscope itemprop="mainEntity" itemtype="https://schema.org/Question">
<h3 itemprop="name">Як оформити повернення?</h3>
<div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer">
<div itemprop="text">Для оформлення повернення...</div>
</div>
</div>
</div>
Компонент генерує мікророзмітку автоматично для всіх опублікованих питань сторінки.
Аналітика
З b_vendor_faq_search_log будується звіт:
- Топ пошукових запитів без результатів — що шукають, але не знаходять
- Популярні питання за переглядами за період
- Питання з високим відсотком «не допомогло»
Ці дані допомагають редактору зрозуміти, які питання додати і які відповіді переписати.
Терміни розробки
| Етап | Термін |
|---|---|
| ORM-таблиці, модель категорій і питань | 0.5 дня |
| AJAX-пошук з підсвічуванням | 1 день |
| Акордеон-компонент, Schema.org | 1 день |
| Лічильники переглядів, голосування | 0.5 дня |
| Форма «задати питання» | 0.5 дня |
| Аналітика та звіти | 1 день |
| Адміністративний інтерфейс | 1 день |
| Тестування | 0.5 дня |
Разом: 6 робочих днів. Підключення повнотекстового пошуку через PostgreSQL tsvector — +1 день.







