Разработка модуля бронирования 1С-Битрикс
Бронирование — это резервирование ресурса на временной интервал с предотвращением конфликтов. Ресурс может быть разным: номер в отеле, аренда автомобиля, переговорная комната, туристический тур, спортивный объект. Общая логика одна — нужно показать доступность, принять резерв и заблокировать слот для других.
В Битрикс для этого нет готового инструмента. Задачу иногда пытаются решить через заказы интернет-магазина, но b_sale_order не предназначен для временны́х интервалов — нет понятия «период», нет проверки конфликтов, нет визуализации занятости.
Модель данных
Модуль vendor.booking с ключевыми таблицами:
-
b_vendor_booking_resource— ресурсы: id, name, type, capacity, iblock_element_id (связь с элементом инфоблока), settings (JSON: минимальный срок, максимальный, шаг, предоплата) -
b_vendor_booking_slot— предопределённые слоты (для почасовой аренды): id, resource_id, date, time_from, time_to, status -
b_vendor_booking_reservation— бронирования: id, resource_id, user_id, date_from, date_to, status (pending/confirmed/cancelled/completed), total_price, order_id -
b_vendor_booking_block— ручная блокировка дат: id, resource_id, date_from, date_to, reason
Для посуточной аренды используется модель с date_from/date_to без слотов. Для почасовой — слоты с фиксированными интервалами.
Проверка доступности
Ключевая операция — атомарная проверка и резервирование. Без транзакции гонка данных неизбежна при одновременных запросах:
public function reserve(int $resourceId, \DateTime $from, \DateTime $to, int $userId): ReservationResult
{
$connection = \Bitrix\Main\Application::getConnection();
$connection->startTransaction();
try {
// Проверяем конфликты с блокировкой строк
$conflicts = $connection->query("
SELECT id FROM b_vendor_booking_reservation
WHERE resource_id = {$resourceId}
AND status IN ('pending', 'confirmed')
AND NOT (date_to <= '{$from->format('Y-m-d')}' OR date_from >= '{$to->format('Y-m-d')}')
FOR UPDATE
")->fetch();
if ($conflicts) {
$connection->rollbackTransaction();
return ReservationResult::conflict();
}
$reservationId = ReservationTable::add([
'RESOURCE_ID' => $resourceId,
'USER_ID' => $userId,
'DATE_FROM' => $from,
'DATE_TO' => $to,
'STATUS' => 'pending',
])->getId();
$connection->commitTransaction();
return ReservationResult::success($reservationId);
} catch (\Throwable $e) {
$connection->rollbackTransaction();
throw $e;
}
}
Виджет выбора дат
На фронтенде — интерактивный календарь. Реализуется через flatpickr или кастомный компонент. Занятые даты получаются AJAX-запросом:
GET /bitrix/components/vendor/booking.calendar/ajax.php
?resource_id=12&month=2024-06
→ {"available": ["2024-06-01","2024-06-03",...], "booked": ["2024-06-02","2024-06-05",...]}
Данные кэшируются через \Bitrix\Main\Data\Cache на 5 минут. При изменении бронирования кэш сбрасывается через тег booking_resource_{id}.
Ценообразование
Стоимость рассчитывается по правилам:
- Базовая ставка за период (день/час) из
b_vendor_booking_resource - Сезонные надбавки (высокий сезон, праздники) из
b_vendor_booking_price_rule - Скидки за длительную аренду (7+ дней — минус 10%)
- Минимальная предоплата в процентах
$calculator = new PriceCalculator($resource);
$result = $calculator->calculate($dateFrom, $dateTo);
// → ['total' => 15000, 'prepayment' => 3000, 'discount' => 1500, 'nights' => 3]
Оплата и связь с заказом
После подтверждения бронирования создаётся заказ в b_sale_order на сумму предоплаты (или полной стоимости). Бронирование связывается с заказом через reservation.order_id. После успешной оплаты статус бронирования меняется с pending на confirmed.
При отмене оплаченного заказа — статус бронирования cancelled, слот освобождается.
Управление в административном интерфейсе
Раздел администратора включает:
- Список ресурсов с настройками
- Визуальное расписание (timeline-вид) с бронированиями по дням
- Форма ручного создания бронирования (для телефонных заявок)
- Блокировка дат на техническое обслуживание
- Отчёт по загрузке ресурсов
Timeline-вид строится через JS-библиотеку (FullCalendar или dhtmlxScheduler), данные — через REST-эндпоинт модуля.
Уведомления
- Пользователю при создании бронирования (подтверждение с деталями)
- Пользователю при подтверждении менеджером
- Администратору при новом бронировании
- Напоминание за N дней до начала (через агент)
Все уведомления через стандартный \Bitrix\Main\Mail\Event::send() с шаблонами событий в модуле main.
Сроки разработки
| Этап | Срок |
|---|---|
| Модель данных, ORM-таблицы | 1 день |
| Логика проверки доступности (транзакции) | 2 дня |
| Виджет календаря, AJAX доступности | 2 дня |
| Ценообразование, сезонные правила | 2 дня |
| Связь с заказами и оплатой | 2 дня |
| Административный интерфейс + timeline | 3 дня |
| Уведомления, напоминания | 1 день |
| Тестирование конкурентных резервирований | 1 день |
Итого: 14 рабочих дней. Для гостиниц с номерами разных категорий и управлением channel manager — отдельная оценка.







