Розробка модуля бази знань 1С-Бітрікс
База знань відрізняється від FAQ глибиною структури: це ієрархія розділів, повноцінні статті з форматуванням, пошуком і версіонуванням. FAQ — плоский список відповідей на конкретні питання. База знань — це документація, посібники, інструкції з перехресними посиланнями. Будувати її на інфоблоках можна, але розділ «Історія змін», «Версія для друку», «Оцінка корисності» та інтеграція з підтримкою — це вже окрема розробка.
Модель даних
Модуль vendor.knowledgebase:
-
b_vendor_kb_section— розділи: id, parent_id, name, slug, description, sort, icon, access_level (public/registered/group), is_active -
b_vendor_kb_article— статті: id, section_id, title, slug, body (HTML/Markdown), excerpt, author_id, status (draft/review/published), views, helpful_count, not_helpful_count, created_at, updated_at, published_at -
b_vendor_kb_revision— версії статей: id, article_id, body, author_id, created_at, change_summary -
b_vendor_kb_attachment— файли до статей: id, article_id, file_id, name -
b_vendor_kb_tagіb_vendor_kb_article_tag— теги та зв'язки
Версіонування статей
При кожному збереженні створюється нова ревізія:
class ArticleService
{
public function update(int $articleId, array $fields, int $editorId, string $changeSummary = ''): void
{
$current = ArticleTable::getById($articleId)->fetch();
// Зберігаємо попередню версію
RevisionTable::add([
'ARTICLE_ID' => $articleId,
'BODY' => $current['BODY'],
'AUTHOR_ID' => $editorId,
'CHANGE_SUMMARY' => $changeSummary ?: 'Оновлення',
'CREATED_AT' => new DateTime(),
]);
// Оновлюємо основний запис
ArticleTable::update($articleId, array_merge($fields, [
'UPDATED_AT' => new DateTime(),
]));
}
public function rollback(int $articleId, int $revisionId): void
{
$revision = RevisionTable::getById($revisionId)->fetch();
$this->update($articleId, ['BODY' => $revision['BODY']], 0, 'Відкат до ревізії #' . $revisionId);
}
}
Історія версій зберігається безстроково. Для економії місця старі ревізії можна архівувати агентом (залишати N останніх + щомісячні знімки).
Ієрархія розділів та навігація
Розділи будують дерево необмеженої вкладеності (суміжні списки, parent_id). Breadcrumbs і бічна навігація будуються рекурсивно по дереву. Для продуктивності дерево цілком кешується з тегом kb_tree:
$tree = \Vendor\KB\TreeBuilder::getTree(); // з кешу або з БД
// При зміні будь-якого розділу: Cache::invalidateTag('kb_tree')
Повнотекстовий пошук
Пошук по заголовках і тілу статей через PostgreSQL:
-- При публікації/оновленні статті
UPDATE b_vendor_kb_article
SET fts_vector = to_tsvector('ukrainian', title || ' ' || strip_tags(body))
WHERE id = :id;
-- Пошуковий запит
SELECT id, title, ts_headline('ukrainian', body, q) AS excerpt
FROM b_vendor_kb_article, to_tsquery('ukrainian', :query) q
WHERE fts_vector @@ q AND status = 'published'
ORDER BY ts_rank(fts_vector, q) DESC
LIMIT 20;
Результат видається з автоматично сформованим excerpt з підсвіченням збігів (ts_headline).
Розмежування доступу
Розділ access_level:
-
public— доступно всім -
registered— тільки авторизованим користувачам -
group— тільки користувачам із зазначеної групи Бітрікс (полеaccess_groupsу розділі)
Спадкування: якщо розділ обмежено, всі його дочірні розділи і статті автоматично обмежені. Перевірка при відображенні — у middleware компонента.
Версія для друку та PDF
Компонент vendor:kb.article.print віддає сторінку без навігації, оптимізовану для друку. Генерація PDF — через mPDF, посилання «Завантажити PDF» додається до кожної статті. PDF кешується у файловій системі і скидається при оновленні статті.
Інтеграція з тікет-системою
При перегляді статті — блок «Не знайшли відповідь? Відкрити тікет». Тікет створюється в vendor.tickets (модуль тікет-системи) з передзаповненим полем «посилання на статтю KB». Це дозволяє підтримці бачити контекст звернення.
Терміни розробки
| Етап | Термін |
|---|---|
| ORM-таблиці, ієрархія розділів | 1 день |
| Версіонування статей, відкат | 2 дні |
| Повнотекстовий пошук (PostgreSQL tsvector) | 2 дні |
| Розмежування доступу | 1 день |
| Версія для друку, PDF | 1 день |
| Компоненти сайту (список, стаття, пошук) | 2 дні |
| Адміністративний інтерфейс | 2 дні |
| Тестування | 1 день |
Разом: 12 робочих днів. Інтеграція з тікет-системою — +1 день.







