Custom FAQ Module Development for 1C-Bitrix
Imagine: a customer catalog with 500 questions, the standard bitrix:catalog.list outputs them all in one list, there is no answer search, and analytics are nonexistent. The user painfully searches for an answer, fails to find it, and leaves for a competitor. We encountered such a project on one of our cases — an online store with hundreds of questions about delivery, payment, and returns. The standard infoblock couldn't handle it: the page loaded slowly, editors spent hours on manual sorting, and managers received dozens of identical inquiries in chat. We developed a specialized module that solves these problems. Our experience with Bitrix spans over 10 years and 20+ implemented projects. The module uses ORM (object-relational mapping, Wikipedia) for data operations and supports full-text search.
Limitations of the Standard Infoblock for FAQ
An infoblock with 'question' and 'answer' fields is a quick fix but doesn't scale. The main pain points:
- No full-text search over answers — Bitrix search only looks through page titles.
- No grouping by categories with an accordion — all questions are dumped in one list.
- No analytics: which questions are searched for, which don't help.
- No 'Ask a Question' form right on the page.
A custom module closes all these gaps. It includes ORM models, AJAX search with highlighting, voting, microdata, and reports.
How We Solve These Problems
We build the module on Bitrix ORM (QuestionTable, CategoryTable, SearchLogTable). This gives strict typing, events, and convenient querying. Search is implemented via AJAX with filtering by %QUESTION% and %ANSWER%, and for high loads, a full-text index in MySQL/PostgreSQL.
How to Speed Up Search with Thousands of Questions?
Standard %LIKE% search in MySQL slows down with 1000+ records. In the module, we implement two levels:
-
Fast AJAX search — query via
QuestionTable::getList()with filter%QUESTION%and%ANSWER%(up to 1000 records). -
Full-text index — when migrating to PostgreSQL (or MySQL 5.7+), create an
fts_vectorcolumn withtsvector, updated via trigger. Search withMATCH ... AGAINSTis 10x faster thanLIKE.
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); } What Does Schema.org Markup Give?
Schema.org FAQPage markup (Wikipedia: Schema.org) is generated automatically for each question. This allows Yandex and Google to display answers directly in the snippet, increasing click-through rates. Implementation inserts itemscope and itemprop into HTML. We integrated it into the output component with no extra configuration needed. Order the module with microdata and get a boost in organic traffic.
What's Included in the Module Development?
| Component | Description |
|---|---|
| ORM models | Tables for categories, questions, votes, search log |
| AJAX search | Search over questions and answers with highlighting |
| Accordion | Category grouping with pure CSS, no JavaScript |
| View counter | Incremented via AJAX |
| Voting 'helped/not helped' | Statistics for sorting and identifying problematic answers |
| 'Ask a Question' form | Saves drafts for publication |
| Schema.org FAQPage markup | Automatically generated for all questions |
| Analytics | Reports on empty searches, popular questions, negative votes |
| Admin interface | Manage categories, questions, view statistics |
Development Timeline
| Stage | Duration |
|---|---|
| ORM tables, category & question models | 0.5 day |
| AJAX search with highlighting | 1 day |
| Accordion component, Schema.org | 1 day |
| View counters, voting | 0.5 day |
| 'Ask a Question' form | 0.5 day |
| Analytics and reports | 1 day |
| Admin interface | 1 day |
| Testing | 0.5 day |
| Total | 6 working days |
Adding full-text search via PostgreSQL tsvector adds +1 day.
Example Implementation
When a question is opened, the counter increments:
QuestionTable::update($questionId, ['VIEWS' => new \Bitrix\Main\DB\SqlExpression('VIEWS + 1')]); After reading, the user votes 'This helped' or 'Did not help'. Voting statistics are used for sorting (useful questions higher) and for rewriting unclear answers.
The accordion is implemented with <details>/<summary> — indexed by search engines, requires no JavaScript. If ?q=question-slug is present, the section opens automatically.
Schema.org FAQPage markup is generated automatically:
<div itemscope itemtype="https://schema.org/FAQPage"> <div itemscope itemprop="mainEntity" itemtype="https://schema.org/Question"> <h3 itemprop="name">How to process a return?</h3> <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div itemprop="text">To process a return...</div> </div> </div> </div> Analytics and Reports
Based on b_vendor_faq_search_log, we build reports:
- Top queries with no results — what users search for but don't find.
- Most viewed questions over a period.
- Questions with a high percentage of 'did not help'.
This data helps editors improve content.
Step-by-Step Implementation of Full-Text Search
- Create an
fts_vectorcolumn in the questions table. - Write a trigger that updates
fts_vectoron insert/update. - Replace
%LIKE%withMATCH ... AGAINSTin thesearch()method. - Configure relevance using field weights (e.g., question weight > answer).
- Test performance with 10,000 records.
Why Choose Us
- Official 1C-Bitrix documentation confirms the best practices we use.
- 10+ years of experience in Bitrix and Bitrix24 development.
- Certified specialists — we guarantee code quality and deadline adherence.
- Transparent process — you always see project status.
- 30-day post-delivery support — free admin training.
Assess your project — contact us for a consultation. We will calculate the cost and timeline. Get a personalized offer today.

