Розробка освітньої платформи (LMS) на 1С-Бітрікс
Ви вже використовуєте 1С-Бітрікс для магазину або корпоративного порталу, і тепер потрібно запустити навчання для партнерів. Окрема LMS — це зайва адмінка, ще одна авторизація та головний біль із синхронізацією. Ми вирішуємо це інакше: будуємо платформу прямо всередині вашого Бітрікс. Єдина база користувачів, спільні замовлення, платіжний модуль — все працює з коробки. За понад 10 років ми реалізували 7 освітніх проектів на Бітрікс і знаємо всі підводні камені.
Типова ситуація: клієнт уже продає товари через інтернет-магазин на Бітрікс, а тепер хоче запустити онлайн-курси. Впровадження окремої LMS (наприклад, Moodle) вимагало б дублювання користувачів, налаштування SSO та перенесення даних. Все це вирішується штатними засобами Бітрікс — інфоблоками, HL-блоками та групами користувачів. Економія часу на інтеграцію — до 40% порівняно із зовнішніми рішеннями.
Чому Бітрікс підходить для LMS?
Бітрікс дає інфоблоки для зберігання курсів та уроків, групи користувачів для доступу, агенти для фонових завдань та вбудовані платіжні системи. Готова кастомна LMS на Бітрікс обходиться в 2–3 рази дешевше впровадження окремого Moodle, якщо бізнес уже використовує екосистему 1С-Бітрікс. Все управляється з однієї адмінки, а для учнів — єдиний особистий кабінет. Додатково використовуємо теговане кешування для сторінок курсів: при зміні контенту скидається лише кеш конкретного уроку, а не всього розділу, що прискорює роботу на 60%.
Архітектура зберігання даних
LMS на Бітрікс будується на комбінації інфоблоків та HighLoad-блоків (HL-блоки, таблиці через ORM D7).
Інфоблоки:
| Інфоблок | Код | Призначення |
|---|---|---|
| Курси | lms_courses |
Основні сутності курсів |
| Уроки | lms_lessons |
Уроки всередині курсу |
| Тести | lms_quizzes |
Завдання та тести |
HL-блоки (через ORM):
Приклад таблиці прогресу
// Прогрес користувача
class UserProgressTable extends \Bitrix\Main\ORM\Data\DataManager
{
public static function getTableName(): string { return 'b_hl_lms_user_progress'; }
public static function getMap(): array
{
return [
new IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new IntegerField('USER_ID'),
new IntegerField('COURSE_ID'), // ID елемента інфоблоку курсу
new IntegerField('LESSON_ID'), // ID елемента інфоблоку уроку
new EnumField('STATUS', ['values' => ['NOT_STARTED', 'IN_PROGRESS', 'COMPLETED']]),
new IntegerField('PROGRESS_PERCENT'), // 0–100
new DatetimeField('STARTED_AT'),
new DatetimeField('COMPLETED_AT'),
new IntegerField('TIME_SPENT_SEC'), // Час на урок
];
}
}
// Записи на курс (enrollment)
class CourseEnrollmentTable extends \Bitrix\Main\ORM\Data\DataManager
{
public static function getTableName(): string { return 'b_hl_lms_enrollment'; }
public static function getMap(): array
{
return [
new IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new IntegerField('USER_ID'),
new IntegerField('COURSE_ID'),
new EnumField('STATUS', ['values' => ['ACTIVE', 'COMPLETED', 'EXPIRED', 'REFUNDED']]),
new DatetimeField('ENROLLED_AT'),
new DatetimeField('EXPIRES_AT'), // NULL = безстроково
new FloatField('PAID_AMOUNT'),
new IntegerField('ORDER_ID'), // Прив'язка до замовлення модуля sale
];
}
}
Структура курсу та уроків
Курс — елемент інфоблоку lms_courses з властивостями:
| Властивість | Код | Тип |
|---|---|---|
| Категорія | CATEGORY |
Список |
| Тривалість | DURATION_HOURS |
Число |
| Рівень | LEVEL |
Список (Початковий/Середній/Експерт) |
| Тип доступу | ACCESS_TYPE |
Список (Безкоштовний/Платний/За підпискою) |
| Група доступу | ACCESS_GROUP_ID |
Число (ID групи b_group) |
| Сертифікат | HAS_CERTIFICATE |
Прапор |
Урок — елемент інфоблоку lms_lessons, прив'язаний до курсу через властивість COURSE_ID. Порядок уроків — через SORT. Тип контенту уроку (LESSON_TYPE): Відео / Текст / Тест / Вебінар.
Як управляється доступ до курсу?
Доступ контролюється через групи користувачів Бітрікс. Кожен курс має свою групу (b_group). Після оплати або запису користувач додається в групу:
Приклад коду запису на курс
class EnrollmentService
{
public function enroll(int $userId, int $courseId): void
{
$course = \CIBlockElement::GetByID($courseId)->GetNext();
$groupId = (int)$course['PROPERTY_ACCESS_GROUP_ID_VALUE'];
if ($groupId) {
$currentGroups = \CUser::GetUserGroup($userId);
if (!in_array($groupId, $currentGroups)) {
$currentGroups[] = $groupId;
\CUser::SetUserGroup($userId, $currentGroups);
}
}
CourseEnrollmentTable::add([
'USER_ID' => $userId,
'COURSE_ID' => $courseId,
'STATUS' => 'ACTIVE',
'ENROLLED_AT' => new \Bitrix\Main\Type\DateTime(),
]);
}
}
Доступ до сторінок курсу перевіряється аналогічно: якщо запису в CourseEnrollmentTable немає або статус не ACTIVE — відбувається редирект на сторінку покупки.
Відстеження прогресу
Прогрес фіксується за кількох умов залежно від типу уроку:
- Відео: трекінг через подію
timeupdateплеєра, позначка «переглянуто» при проходженні 80% відео. - Текст: позначка при прокручуванні до кінця сторінки (IntersectionObserver на останній абзац).
- Тест: при успішному складанні (бал ≥ прохідному порогу).
Приклад AJAX-ендпоінту фіксації прогресу
// POST /local/ajax/lms_progress.php
$lessonId = (int)$_POST['lesson_id'];
$courseId = (int)$_POST['course_id'];
$userId = $USER->GetID();
$percent = min(100, (int)$_POST['percent']);
$existing = UserProgressTable::getList([
'filter' => ['USER_ID' => $userId, 'LESSON_ID' => $lessonId],
])->fetch();
if ($existing) {
if ($percent > $existing['PROGRESS_PERCENT']) {
UserProgressTable::update($existing['ID'], [
'PROGRESS_PERCENT' => $percent,
'STATUS' => $percent >= 100 ? 'COMPLETED' : 'IN_PROGRESS',
'COMPLETED_AT' => $percent >= 100 ? new \Bitrix\Main\Type\DateTime() : null,
]);
}
} else {
UserProgressTable::add([
'USER_ID' => $userId,
'COURSE_ID' => $courseId,
'LESSON_ID' => $lessonId,
'STATUS' => $percent >= 100 ? 'COMPLETED' : 'IN_PROGRESS',
'PROGRESS_PERCENT' => $percent,
'STARTED_AT' => new \Bitrix\Main\Type\DateTime(),
'COMPLETED_AT' => $percent >= 100 ? new \Bitrix\Main\Type\DateTime() : null,
]);
}
Тестування та квізи
Питання тесту — елементи інфоблоку lms_quizzes з властивостями: тип питання (одиночний вибір, множинний, текстова відповідь), варіанти відповідей (JSON у властивості-рядку), правильна відповідь, вага питання.
Результати тестування — HL-блок b_hl_lms_quiz_attempt:
Схема таблиці
CREATE TABLE b_hl_lms_quiz_attempt (
ID SERIAL PRIMARY KEY,
USER_ID INTEGER,
QUIZ_ID INTEGER,
SCORE INTEGER, -- набрані бали
MAX_SCORE INTEGER, -- максимум
PASSED BOOLEAN,
ANSWERS_JSON TEXT, -- JSON з відповідями користувача
CREATED_AT TIMESTAMP
);
Сертифікати
При завершенні курсу (всі уроки COMPLETED) — генерація PDF-сертифіката через бібліотеку TCPDF:
Приклад генерації сертифіката
class CertificateGenerator
{
public function generate(int $userId, int $courseId): string
{
$user = \CUser::GetByID($userId)->Fetch();
$course = \CIBlockElement::GetByID($courseId)->GetNext();
$pdf = new \TCPDF();
$pdf->AddPage('L'); // Landscape
$pdf->setImageScale(1.25);
// Фонове зображення сертифіката
$pdf->Image('/local/templates/lms/img/certificate_bg.jpg', 0, 0, 297, 210);
// ПІБ
$pdf->SetFont('dejavusans', 'B', 32);
$pdf->SetXY(50, 90);
$pdf->Cell(200, 20, $user['LAST_NAME'] . ' ' . $user['NAME'], 0, 0, 'C');
// Назва курсу
$pdf->SetFont('dejavusans', '', 18);
$pdf->SetXY(50, 120);
$pdf->Cell(200, 10, $course['NAME'], 0, 0, 'C');
$filename = 'certificate_' . $userId . '_' . $courseId . '.pdf';
$path = '/upload/certificates/' . $filename;
$pdf->Output($_SERVER['DOCUMENT_ROOT'] . $path, 'F');
return $path;
}
}
Процес роботи
- Аналітика та проектування — узгоджуємо структуру курсів, типи контенту, схему доступу.
- Розробка компонентів — створюємо компоненти 2.0 для списку курсів, детальної сторінки, прогресу.
- Інтеграція — підключаємо платіжні системи (ЮKassa, Сбер) та обмін з 1С через CommerceML.
- Тестування — перевіряємо сценарії покупки, запису, проходження уроків та генерації сертифікатів.
- Деплой та навчання — викочуємо на бойовий сервер, навчаємо адміністраторів (2–3 години).
Що входить в роботу
При замовленні створення платформи навчання під ключ на Бітрікс ми виконуємо:
- аналітика та проектування схеми даних (інфоблоки, HL-блоки);
- розробка компонентів 2.0 (список курсів, детальна, прогрес);
- інтеграція з платіжними системами та 1С;
- тестування та виправлення помилок;
- передача вихідного коду, документації та доступів;
- навчання адміністраторів.
Терміни та вартість розробки
| Варіант | Склад | Термін | Вартість |
|---|---|---|---|
| Базова LMS | Курси, уроки, прогрес, доступ за групами | 15–20 днів | від 1 500 $ |
| З тестами та сертифікатами | + Квізи, генерація PDF | 20–30 днів | від 2 300 $ |
| Повна платформа | + Оплата, підписки, аналітика, вебінари | 35–50 днів | від 3 500 $ |
Хочете обговорити проект? Зв'яжіться з нами — ми оцінимо ваше завдання та запропонуємо оптимальне рішення. Замовте розробку LMS — і отримайте готове рішення в обумовлені терміни. Гарантія якості та договірна відповідальність підтверджують наш досвід і надійність.







