Розробка системи запису на послуги на 1С-Бітрікс

Розробка системи запису на послуги на 1С-Бітрікс Уявіть: клієнт заходить на сайт, обирає спеціаліста, бачить вільний час, бронює — і лише після оплати розуміє, що слот уже зайнятий іншим. У Бітріксі штатного функціоналу для послуг з часовими слотами немає. Інтернет-магазин оперує товарами, де оди
Послуги, які ми пропонуємо
Показано 1 з 1Усі 1626 послуг
Розробка системи запису на послуги на 1С-Бітрікс
Середній
~1-2 тижні

Наші компетенції:

Часті запитання

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1466
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1019
  • Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    764
  • Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    882
  • Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    811
  • Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1167

Розробка системи запису на послуги на 1С-Бітрікс

Уявіть: клієнт заходить на сайт, обирає спеціаліста, бачить вільний час, бронює — і лише після оплати розуміє, що слот уже зайнятий іншим. У Бітріксі штатного функціоналу для послуг з часовими слотами немає. Інтернет-магазин оперує товарами, де одиниця — штука. Для послуг потрібна інша логіка: тривалість, спеціалісти, розклад. Якщо це не врахувати, отримуємо гонку умов, дублі бронювань і втрату клієнтів. Ми спроектували архітектуру, яка вирішує ці проблеми з гарантією цілісності даних. Оцінимо ваш проєкт за один день — замовте консультацію.

Чому стандартний інтернет-магазин не підходить для запису на послуги?

У кошику Бітрікса товар додається з кількістю. Послуга ж прив'язана до часового слота. Спроба емулювати слоти через залишки товару призводить до надмірної кількості елементів і складних перевірок. Наш досвід показав: краще виділити окрему сутність — інфоблок розкладу — і обробляти бронювання на рівні СУБД з транзакціями та блокуваннями.

Модель даних: розклад і слоти

Ядро системи — інфоблок розкладу. Ми використовуємо два інфоблоки та зв'язуючу таблицю бронювань. Інфоблок «Послуги» (SERVICES_IBLOCK_ID):

  • Властивості: DURATION (тривалість у хвилинах), PRICE, MAX_CAPACITY (групові заняття до 20 осіб), SPECIALIST_ID (прив'язка до спеціаліста)

Інфоблок «Розклад» (SCHEDULE_IBLOCK_ID):

  • SERVICE_ID, SPECIALIST_ID, DATE_FROM, DATE_TO (властивості «Дата/час»), STATUS (free/booked/blocked), BOOKING_ID

Таблиця бронювань (highload-блок):

CREATE TABLE bookings ( ID INT AUTO_INCREMENT PRIMARY KEY, SLOT_ID INT NOT NULL, USER_ID INT, CLIENT_NAME VARCHAR(255), CLIENT_PHONE VARCHAR(20), CLIENT_EMAIL VARCHAR(255), STATUS ENUM('pending','confirmed','cancelled','completed') DEFAULT 'pending', COMMENT TEXT, CREATED_AT DATETIME, UPDATED_AT DATETIME, INDEX (SLOT_ID), INDEX (STATUS) ); 

Як генеруються слоти розкладу?

Слоти створюються на основі шаблонів робочого часу спеціаліста. Ми зберігаємо тижневий розклад і автоматично генеруємо слоти на 4–8 тижнів вперед. Обробляємо до 10 000 слотів за один запуск агента.

class SlotGenerator { public function generateForSpecialist(int $specialistId, \DateTime $from, \DateTime $to): void { $schedule = $this->getWeeklySchedule($specialistId); $serviceDuration = $this->getServiceDuration($specialistId); $current = clone $from; while ($current <= $to) { $dayOfWeek = (int)$current->format('N'); $daySlots = $schedule[$dayOfWeek] ?? []; foreach ($daySlots as $timeRange) { [$start, $end] = explode('-', $timeRange); $this->createSlotsBetween($specialistId, $current, $start, $end, $serviceDuration); } $current->modify('+1 day'); } } } 

Кожен слот — елемент інфоблоку зі статусом free. При бронюванні змінюємо на booked, при скасуванні — назад на free. Для групових послуг місткість регулюється окремо: якщо MAX_CAPACITY більше 1, слот може бути заброньований частково.

Віджет вибору часу: логіка на фронті

Користувач обирає послугу → спеціаліста → дату → час. Кожен крок — AJAX-запит до контролера:

class BookingController extends \CBitrixComponent { public function getAvailableSlots(int $specialistId, string $date): array { $dateFrom = new \Bitrix\Main\Type\DateTime($date . ' 00:00:00'); $dateTo = new \Bitrix\Main\Type\DateTime($date . ' 23:59:59'); $result = \Bitrix\Iblock\ElementTable::getList([ 'filter' => [ 'IBLOCK_ID' => SCHEDULE_IBLOCK_ID, '=PROPERTY_SPECIALIST_ID' => $specialistId, '>=PROPERTY_DATE_FROM' => $dateFrom, '<=PROPERTY_DATE_FROM' => $dateTo, '=PROPERTY_STATUS' => 'free', '=ACTIVE' => 'Y', ], 'select' => ['ID', 'PROPERTY_DATE_FROM', 'PROPERTY_DATE_TO'], 'order' => ['PROPERTY_DATE_FROM' => 'ASC'], ]); } } 

На фронті — календар (FullCalendar або кастомний React) з підсвіткою доступних днів. Час оновлюється динамічно без перезавантаження сторінки.

Як уникнути гонки умов при бронюванні?

Якщо два клієнти одночасно обрали один слот, гарантуємо, що бронювання отримає лише один. Використовуємо оптимістичне блокування на рівні БД:

public function bookSlot(int $slotId, array $clientData): BookingResult { $connection = \Bitrix\Main\Application::getConnection(); $connection->startTransaction(); try { $slot = $connection->query( "SELECT * FROM b_iblock_element_property WHERE IBLOCK_ELEMENT_ID = {$slotId} AND IBLOCK_PROPERTY_ID = " . STATUS_PROP_ID . " FOR UPDATE" )->fetch(); if ($slot['VALUE'] !== 'free') { $connection->rollbackTransaction(); return BookingResult::slotTaken(); } $this->updateSlotStatus($slotId, 'booked'); $bookingId = $this->createBooking($slotId, $clientData); $connection->commitTransaction(); return BookingResult::success($bookingId); } catch (\Exception $e) { $connection->rollbackTransaction(); throw $e; } } 

Цей підхід у 3 рази надійніший, ніж перевірка статусу на рівні PHP без блокування. Оптимістичне блокування — стандартний патерн боротьби з race conditions у високонавантажених системах. Ми гарантуємо, що навіть при пікових навантаженнях ви не втратите жодного бронювання.

Сповіщення та нагадування

Відразу після бронювання — сповіщення клієнту та спеціалісту. За 24 та 2 години — нагадування. Агенти:

\CAgent::AddAgent( '\BookingModule\ReminderAgent::send(' . $bookingId . ');', 'my_booking_module', 'N', 0, '', 'Y', ConvertTimeStamp($bookingDateTs - 86400, 'FULL') ); 

Канали: email (через CEvent::Send), SMS, Telegram-бот. Підтримка всіх популярних сервісів: СМС-провайдери за протоколом HTTP, Telegram Bot API.

Інтеграція з оплатою (опціонально)

При передоплаті створюємо замовлення в кошику: ініціалізуємо \Bitrix\Sale\Order, додаємо позицію з послугою, зв'язуємо бронювання з замовленням через поле ORDER_ID. Після оплати обробник OnSaleOrderPaid підтверджує бронювання. Це дозволяє використовувати стандартний флоу оплати Бітрікса без додаткових костилів. Підтримуються ЮKassa, Сбер, АТОЛ Онлайн.

Адміністративний інтерфейс

Сторінка в /bitrix/admin/ з:

  • Календарним переглядом усіх бронювань
  • Блокуванням слотів (відпустка, обід)
  • Ручним підтвердженням/скасуванням зі сповіщенням клієнта
  • Вивантаженням у CSV

Що входить в роботу

Ми постачаємо не лише код, а й повний комплект документації та інструментів:

Що входить в роботу Деталі
Модель даних і проектування Інфоблоки, highload-блок, сценарії
Генератор слотів Агент, шаблони розкладу
AJAX-контролери API вибору слота, бронювання
Фронтенд-віджет Календар, вибір спеціаліста/часу
Сповіщення Email, SMS, Telegram, нагадування
Адмінка Управління розкладом, перегляд бронювань
Інтеграція з оплатою Передоплата через кошик (опціонально)
Документація Опис API, інструкція з розгортання
Навчання 2 години вебінару для адміністраторів
Технічна підтримка 30 днів після запуску

Покрокова інструкція з впровадження віджета запису на сайт

  1. Встановіть модуль через Marketplace або вручну розмістіть файли компонента.
  2. Налаштуйте інфоблоки послуг і розкладу, імпортуйте спеціалістів.
  3. Створіть шаблони робочого часу та запустіть агент генерації слотів.
  4. Розмістіть на сторінці компонент bitrix:booking.calendar з параметрами.
  5. Налаштуйте поштові події для сповіщень і підключіть SMS-шлюз (опціонально).
  6. Проведіть тестовий запис та перевірте обробку оплати.

Етапи та строки

Етап Зміст Строк
Проектування Модель даних, сценарії 3–5 днів
Інфоблоки і генератор Структура, розклад 1 тиждень
AJAX-контролери API 1 тиждень
Фронтенд-віджет Календар 1–2 тижні
Сповіщення Email, SMS, агенти 3–5 днів
Адміністративний інтерфейс Управління, перегляд 1 тиждень
Інтеграція з оплатою Опціонально 1 тиждень

Загальний строк — від 6 до 10 тижнів залежно від складності. Зв'яжіться з нами, щоб уточнити деталі вашого проєкту та отримати точну оцінку. Отримайте консультацію — ми допоможемо спроектувати систему під ваші завдання.