Настроювання календаря доступності номерів на 1С-Бітрікс

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

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

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

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

  • 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С-Bitrix

Готель пропускає бронювання не тому що немає попиту, а тому що гість не бачить вільних дат у реальному часі. Стандартний Bitrix-каталог не вміє працювати з датами доступності — це не його завдання. Календар бронювання для номерів потребує окремої архітектури: зберігання періодів зайнятості, логіки перетину дат та візуального компонента.

Хранилище періодів зайнятості

Центральний елемент системи — таблиця бронювань:

CREATE TABLE custom_room_bookings (
    id INT AUTO_INCREMENT PRIMARY KEY,
    room_id INT NOT NULL,               -- ID елемента інфоблоку (номер)
    order_id INT,                       -- Зв'язок з замовленням Bitrix
    guest_name VARCHAR(255),
    check_in DATE NOT NULL,
    check_out DATE NOT NULL,
    status ENUM('pending','confirmed','cancelled') DEFAULT 'pending',
    created_at DATETIME,
    INDEX idx_room_dates (room_id, check_in, check_out),
    INDEX idx_dates (check_in, check_out)
);

Перевірка доступності номера на період будується на запиті перетину інтервалів:

SELECT id FROM custom_room_bookings
WHERE room_id = :room_id
  AND status != 'cancelled'
  AND check_in < :check_out
  AND check_out > :check_in
LIMIT 1;

Якщо запит повертає строку — номер зайнятий на запрошений період.

ORM-обгортка у D7

namespace Custom\Hotel;

class BookingTable extends \Bitrix\Main\ORM\Data\DataManager {
    public static function getTableName(): string { return 'custom_room_bookings'; }

    public static function isRoomAvailable(int $roomId, string $checkIn, string $checkOut): bool {
        $result = static::getList([
            'filter' => [
                '=ROOM_ID' => $roomId,
                '!=STATUS' => 'cancelled',
                '<CHECK_IN' => $checkOut,
                '>CHECK_OUT' => $checkIn,
            ],
            'limit' => 1,
        ]);
        return !$result->fetch();
    }

    public static function getOccupiedDates(int $roomId, string $month): array {
        // Повертає масив зайнятих дат для календаря
        $from = date('Y-m-01', strtotime($month));
        $to = date('Y-m-t', strtotime($month));

        $bookings = static::getList([
            'filter' => [
                '=ROOM_ID' => $roomId,
                '!=STATUS' => 'cancelled',
                '<CHECK_IN' => $to,
                '>CHECK_OUT' => $from,
            ],
        ]);

        $dates = [];
        while ($booking = $bookings->fetch()) {
            $current = strtotime($booking['CHECK_IN']);
            $end = strtotime($booking['CHECK_OUT']);
            while ($current < $end) {
                $dates[] = date('Y-m-d', $current);
                $current = strtotime('+1 day', $current);
            }
        }

        return array_unique($dates);
    }
}

Візуальний компонент календаря

Для відображення використовується або готова JavaScript-бібліотека (Flatpickr, Pikaday, Air Datepicker), або кастомна розробка. Flatpickr — оптимальний вибір: легкий (16 KB), підтримує діапазони дат, легко стилізується.

Конфігурація Flatpickr з зайнятими датами:

async function initBookingCalendar(roomId) {
    const response = await fetch(`/api/hotel/availability/?room_id=${roomId}&months=3`);
    const { occupiedDates } = await response.json();

    flatpickr('#date-range-picker', {
        mode: 'range',
        minDate: 'today',
        dateFormat: 'Y-m-d',
        locale: 'uk',
        disable: occupiedDates,
        onChange: function(selectedDates) {
            if (selectedDates.length === 2) {
                const nights = Math.round(
                    (selectedDates[1] - selectedDates[0]) / 86400000
                );
                updatePricePreview(roomId, selectedDates[0], selectedDates[1], nights);
            }
        }
    });
}

API-endpoint для даних про доступність

AJAX-контролер повертає зайняті дати для запрошеного періоду:

class HotelAvailabilityController extends \Bitrix\Main\Engine\Controller {

    public function getAction(int $roomId, int $months = 2): array {
        $occupiedDates = [];
        $current = new \DateTime();

        for ($m = 0; $m < $months; $m++) {
            $monthStr = $current->format('Y-m');
            $dates = BookingTable::getOccupiedDates($roomId, $monthStr);
            $occupiedDates = array_merge($occupiedDates, $dates);
            $current->modify('+1 month');
        }

        return ['occupiedDates' => array_unique($occupiedDates)];
    }
}

Кешування відповіді — 5 хвилин через \Bitrix\Main\Data\Cache, інвалідація при новому бронюванні.

Ціноутворення за датами

Готелі часто застосовують сезонні тарифи. Ціна номера зберігається не в торговій пропозиції Bitrix (не підтримує періоди), а в окремій таблиці тарифів:

CREATE TABLE custom_room_rates (
    id INT AUTO_INCREMENT PRIMARY KEY,
    room_id INT NOT NULL,
    rate_from DATE NOT NULL,
    rate_to DATE NOT NULL,
    price_per_night DECIMAL(10,2) NOT NULL,
    INDEX idx_room_period (room_id, rate_from, rate_to)
);

При виборі дат JavaScript запитує загальну вартість через окремий endpoint, підсумовуючи ціни за кожну ніч за активними тарифами.

Інтеграція з замовленнями Bitrix

Завершене бронювання створює запис у custom_room_bookings і одночасно оформляє замовлення в модулі sale Bitrix. Це зберігає єдиний журнал продаж і дозволяє використовувати стандартні механізми оплати та сповіщень.

Сроки виконання

Обсяг робіт Строк
Хранилище + API доступності + Flatpickr 2–3 дні
Сезонні тарифи + передпросмотр вартості +1–2 дні
Інтеграція з замовленнями + сповіщення +1–2 дні
Синхронізація з Channel Manager (OTA) окрема задача

Календар доступності — фундамент всієї системи онлайн-бронювання. Саме тут клієнт приймає рішення про покупку.