Разработка образовательной платформы (LMS) на 1С-Битрикс
Вы уже используете 1С-Битрикс для магазина или корпоративного портала, и теперь нужно запустить обучение для партнёров. Отдельная LMS — это лишняя админка, ещё одна авторизация и головная боль с синхронизацией. Мы решаем это иначе: строим платформу прямо внутри вашего Битрикс. Единая база пользователей, общие заказы, платёжный модуль — всё работает из коробки. За 10+ лет мы реализовали 7 образовательных проектов на Битрикс и знаем все подводные камни.
Типичная ситуация: клиент уже продаёт товары через интернет-магазин на Битрикс, а теперь хочет запустить онлайн-курсы. Внедрение отдельной LMS (например, Moodle) потребовало бы дублирования пользователей, настройки SSO и переноса данных. Всё это решается штатными средствами Битрикс — инфоблоками, HL-блоками и группами пользователей. Экономия времени на интеграцию — до 40% по сравнению с внешними решениями.
Почему Битрикс подходит для LMS?
Битрикс даёт инфоблоки для хранения курсов и уроков, группы пользователей для доступа, агенты для фоновых задач и встроенные платёжные системы. Готовая LMS на Битрикс обходится в 2–3 раза дешевле внедрения отдельного Moodle, если бизнес уже использует экосистему 1С-Битрикс. Всё управляется из одной админки, а для учеников — единый личный кабинет. Дополнительно используем тегированное кэширование для страниц курсов: при изменении контента сбрасывается только кэш конкретного урока, а не всего раздела.
Архитектура хранения данных
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-сертификата через библиотеку FPDF или 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](https://wiki.1c-bitrix.ru/ (коммерческая информация)/CommerceML).
- Тестирование — проверяем сценарии покупки, записи, прохождения уроков и генерации сертификатов.
- Деплой и обучение — выкатываем на боевой сервер, обучаем администраторов (2–3 часа).
Что входит в работу
При заказе разработки LMS под ключ мы выполняем:
- аналитика и проектирование схемы данных (инфоблоки, HL-блоки);
- разработка компонентов 2.0 (список курсов, детальная, прогресс);
- интеграция с платежными системами и 1С;
- тестирование и исправление ошибок;
- передача исходного кода, документации и доступов;
- обучение администраторов.
Сроки разработки
| Вариант | Состав | Срок |
|---|---|---|
| Базовая LMS | Курсы, уроки, прогресс, доступ по группам | 15–20 дней |
| С тестами и сертификатами | + Квизы, генерация PDF | 20–30 дней |
| Полная платформа | + Оплата, подписки, аналитика, вебинары | 35–50 дней |
Хотите обсудить проект? Свяжитесь с нами — мы оценим вашу задачу и предложим оптимальное решение. Закажите разработку LMS — и получите готовое решение в оговорённые сроки.







