Разработка образовательной платформы (LMS) на 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Разработка образовательной платформы (LMS) на 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Разработка образовательной платформы (LMS) на 1С-Битрикс

1С-Битрикс — не первый выбор для LMS. Есть Moodle, Teachable, GetCourse. Но компании выбирают Битрикс, когда уже есть сайт на нём, нужна единая авторизация с корпоративным порталом или интернет-магазином, и нет желания поддерживать несколько систем. В таком случае Битрикс вполне справляется: инфоблоки для хранения курсов, группы пользователей для доступа, агенты для прогресса, платёжный модуль для монетизации.

Архитектура хранения данных

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(),
        ]);
    }
}

Доступ к страницам курса ограничивается на уровне PHP:

// В начале страницы урока
$enrollment = CourseEnrollmentTable::getList([
    'filter' => [
        'USER_ID'   => $USER->GetID(),
        'COURSE_ID' => $courseId,
        'STATUS'    => 'ACTIVE',
    ],
])->fetch();

if (!$enrollment) {
    LocalRedirect('/courses/' . $courseSlug . '/buy/');
}

Отслеживание прогресса

Прогресс фиксируется при нескольких условиях в зависимости от типа урока:

  • Видео: трекинг через событие 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;
    }
}

Сроки разработки

Вариант Состав Срок
Базовая LMS Курсы, уроки, прогресс, доступ по группам 15–20 дней
С тестами и сертификатами + Квизы, генерация PDF 20–30 дней
Полная платформа + Оплата, подписки, аналитика, вебинары 35–50 дней