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

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Розробка модуля бронювання 1С-Бітрікс
Середня
~1-2 тижні
Часті питання

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

Етапи розробки

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

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

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