Розробка сайту онлайн-школи на 1С-Бітрікс
Онлайн-школа на Бітріксі — це не LMS у чистому вигляді. Moodle або iSpring краще справляються з прохідженням курсів, тестами та аналітикою навчання. Але коли завдання — продавати курси, керувати доступом після оплати, сегментувати аудиторію та запускати маркетингові кампанії, Бітрікс з модулем sale виявляється потужною платформою. LMS-частина або будується як кастомний модуль, або підключається зовнішня система через API.
Розберемо детально продаж курсів та контроль доступу — це архітектурне ядро проекту.
Продаж курсів та контроль доступу до контенту
Ключова механіка: користувач оплачує курс на сайті та отримує доступ до його матеріалів. Звучить просто, але реалізація залежить від бізнес-моделі. Розова покупка, підписка, пакети курсів, корпоративний доступ — кожен варіант вимагає своєї архітектури.
Каталог курсів
Інфоблок Courses з торговим каталогом (підключений модуль catalog). Розділи — напрямки навчання (програмування, дизайн, маркетинг, мови). Властивості елемента:
| Властивість | Тип | Призначення |
|---|---|---|
LEVEL |
Список | Початковий / середній / продвинутий |
FORMAT |
Список | Відеокурс / вебінар / текст / змішаний |
DURATION_HOURS |
Число | Загальна тривалість у годинах |
LESSONS_COUNT |
Число | Кількість уроків |
TEACHER_ID |
Привʼязка E |
Викладач (інфоблок Teachers) |
PREVIEW_LESSONS |
Множественна привʼязка E |
Безплатні уроки для перегляду |
CERTIFICATE |
Логічна | Видається ли сертифікат |
START_DATE |
Дата | Дата старту (для потокових курсів) |
ACCESS_DAYS |
Число | Термін доступу після покупки (0 = бессрочно) |
USER_GROUP_ID |
Число | ID групи користувачів для доступу |
Ціна курсу — стандартна властивість торгового каталогу (b_catalog_price). Для курсів з варіантами (базовий / з перевіркою ДЗ / з менторством) використовуються торговельні пропозиції (SKU) — елементи вкладеного інфоблока з різними цінами й набором включених можливостей.
Механізм контролю доступу
Є три підходи, кожен з компромісами:
Варіант 1: Групи користувачів. При оплаті замовлення користувач додається в групу, привʼязану до курсу. Контент курсу (сторінки, файли) захищений правами доступу цієї групи. Це штатний механізм Бітрікса, працює на рівні модуля main.
Реалізація: обробник події OnSaleOrderPaid. При переході замовлення в статус «Оплачено» скрипт отримує список товарів, для кожного товару-курсу — значення властивості USER_GROUP_ID, та додає користувача в відповідну групу через CUser::SetUserGroup().
// Псевдокод обробника
$order = \Bitrix\Sale\Order::load($orderId);
foreach ($order->getBasket() as $item) {
$courseId = $item->getProductId();
$groupId = getGroupIdByCourse($courseId);
addUserToGroup($order->getUserId(), $groupId);
}
Проблема цього підходу — масштабованість. При 200 курсах — 200 груп користувачів. Керування стає громіздким. Крім того, якщо потрібен часовий доступ (курс на 90 днів), потрібна cron-задача, яка щодня перевіряє терміни та виключає користувачів з груп.
Варіант 2: Окрема таблиця доступів. Створюється Highload-блок CourseAccess:
| Поле | Тип | Призначення |
|---|---|---|
UF_USER_ID |
Число | ID користувача |
UF_COURSE_ID |
Число | ID курсу |
UF_ORDER_ID |
Число | ID замовлення |
UF_DATE_FROM |
Дата/час | Початок доступу |
UF_DATE_TO |
Дата/час | Закінчення доступу (null = бессрочно) |
UF_STATUS |
Список | active / expired / revoked |
При оплаті — створюється запис в CourseAccess. При відображенні контенту курсу — перевірка наявності активної записи для поточного користувача. Cron-агент щодня оновлює UF_STATUS для записів зі сплином UF_DATE_TO.
Гнучкіший варіант: легко реалізувати обмежений доступ, заморозку, продовження, корпоративні ліцензії (кілька користувачів на одне замовлення).
Варіант 3: Гібрид. Групи користувачів для базового розмежування (зареєстрований / купив хоча б один курс / підписник), Highload-блок для точкового контролю по конкретним курсам. Це оптимальний підхід для шкіл з 20+ курсами.
Платіжні системи
Модуль sale підтримує стандартні платіжні системи: ЮKassa (бувш. Яндекс.Касса), Робокасса, CloudPayments, Stripe. Для онлайн-школи критичні:
- Рекурентні платежі — для підписочної моделі. ЮKassa та CloudPayments підтримують через збереження токену карти
-
Чеки за 54-ФЗ — автоматична фіскалізація через ОФД. У Бітріксі налаштовується через обробник платіжної системи: параметри
PS_IS_CASHта інтеграція з АТОЛ, OrangeData або хмарною касою від платіжного агрегатора - Повернення — автоматичне повернення через API платіжної системи при скасуванні замовлення
Промокоди
Модуль sale має штатний механізм купонів та правил кошика. Промокод — це купон (b_sale_discount_coupon), привʼязаний до правила скидки (b_sale_discount). Типи купонів: одноразовий, багаторазовий, на одного користувача.
Для реферальної програми — кастомний модуль. Схема: користувач отримує унікальний реферальний код (зберігається в UF_REFERRAL_CODE профілю). Запрошений користувач при реєстрації указує код. При покупці курсу запрошеним — реферер отримує бонус (запис у Highload-блоці ReferralBonuses): скидку на наступну покупку або начислення на внутрішній рахунок (sale.account).
Каталог курсів: відображення та навігація
Компонент catalog.section виводить курси з фільтруванням:
- За напрямком (розділ інфоблока)
- За рівнем складності
- За форматом (відео / вебінар / текст)
- За викладачем
- За наявністю сертифіката
- За ціною (діапазон)
Карточка курсу містить: назву, коротке описання, викладача (фото + імʼя), тривалість, кількість уроків, рейтинг (середня оцінка від тих, хто пройшов), ціну, кнопку «Купити» або «Почати безплатно» (для курсів з безплатними вводними уроками).
Детальна сторінка — компонент catalog.element з кастомним шаблоном: програма курсу (список уроків з позначкою «безплатний» / «платний»), описання, про автора, відгуки випускників, блок покупки.
LMS-функціонал
Власна LMS на Бітріксі — це кастомний модуль. Штатних інструментів немає. Основні сутності:
Уроки — інфоблок Lessons, привʼязаний до курсу. Властивості: порядковий номер, тип контенту (відео/текст/тест), відео-URL (Vimeo, Kinescope — для захисту від скачування), текстовий контент (у деталізованому описанні), тривалість, матеріали для скачування.
Прогрес проходження — Highload-блок UserProgress: UF_USER_ID, UF_LESSON_ID, UF_STATUS (not_started / in_progress / completed), UF_COMPLETED_AT, UF_SCORE (для тестів). Прогрес оновлюється AJAX-запитом: при просмотрі відео до кінця, при проходженні тесту, при натисненні «Урок пройдено».
Тести — Highload-блок TestQuestions: UF_LESSON_ID, UF_QUESTION_TEXT, UF_ANSWERS (JSON-масив варіантів), UF_CORRECT_ANSWER, UF_TYPE (single_choice / multiple_choice / text_input). Результати тестів — в UserProgress з деталізацією в окремому HL-блоці TestResults.
Сертифікати — генерація PDF за шаблоном при завершенні курсу (всі уроки в статусі completed, тести пройдені з мінімальним балом). Шаблон — mPDF з підстановкою ПІБ, назви курсу, дати, унікального номера. Номер сертифіката — для верифікації на сайті за прямим посиланням.
Альтернатива: інтеграція з Moodle
Якщо LMS-функціонал критичний та потрібна глибока аналітика навчання, розумніше інтегрувати Бітрікс з Moodle через Moodle Web Services API. Бітрікс відповідає за вітрину, продаж та маркетинг, Moodle — за навчання. При оплаті курсу на Бітріксі — API-запит до Moodle для запису користувача на курс (core_enrol_get_enrolled_users, enrol_manual_enrol_users).
Аналогічно — інтеграція з GetCourse через їхній API для шкіл, що вже працюють на цій платформі, але потребують гнучкішу вітрину.
Вебінарна кімната
Бітрікс не містить власного вебінарного модуля. Інтеграція з зовнішніми сервісами:
-
Zoom — через Zoom API (OAuth 2.0). Створення вебінара:
POST /v2/users/{userId}/webinars. Реєстрація учасника:POST /v2/webinars/{webinarId}/registrants. Посилання для входу видається після оплати або за записом - Телемост / VK Звонки — для російських шкіл, які уникають зарубіжних сервісів
Розклад вебінарів — інфоблок Webinars: дата/час, тема, викладач, посилання на кімнату (заповнюється автоматично при створенні через API), запис вебінара (посилання на відео, доступна після завершення).
Рассилки за сегментами
Модуль sender у Бітріксі підтримує сегментацію одержувачів. Сегменти для онлайн-школи:
- Купили курс X, але не почали прохідження (мотиваційне листування)
- Пройшли 50% курсу (нагадування продовжити)
- Завершили курс (пропозиція наступного рівня — upsell)
- Зареєстровані, але не купили (welcome-ланцюжок → пропозиція безплатного мні-курсу)
- Неактивні 30+ днів (реактивація)
Сегменти будуються через SQL-запити до Highload-блоків CourseAccess та UserProgress. Кожен сегмент — connector у модулі sender, реалізуваний як PHP-клас, що наслідує \Bitrix\Sender\Connector\Base.
Терміни реалізації
| Масштаб | Опис | Термін |
|---|---|---|
| Монокурс / мні-школа | 1-5 курсів, продаж через sale, базовий ЛК, відеоуроки на Vimeo |
6-8 тижнів |
| Середня онлайн-школа | 10-30 курсів, підписочна модель, тести, сертифікати, вебінари, рассилки | 14-20 тижнів |
| Крупна платформа | 50+ курсів, інтеграція з Moodle, реферальна програма, корпоративні ліцензії, мобільний додаток (API) | 24-32 тижні |
Основний час йде на LMS-функціонал. Якщо інтегруватися з Moodle або GetCourse замість розробки з нуля — терміни скорочуються на 4-8 тижнів.







