Разработка модуля бронирования 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Разработка модуля бронирования 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1175
  • 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

Разработка модуля бронирования 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 — отдельная оценка.