Інтеграція 1С-Бітрікс з системою бронювання Bnovo
Bnovo — російська PMS-система для готелів з власним channel manager і модулем онлайн-бронювання. Проблема без інтеграції: менеджер приймає заявку через сайт на 1С-Бітрікс, вручну вносить бронь до Bnovo, а потім вручну оновлює доступність номерів назад на сайті. Два джерела правди — два місця для помилок. Овербукінг при такому підході — питання часу.
Архітектура інтеграції
Bnovo надає REST API (https://online.bnovo.ru/api/v1/). Авторизація — API-ключ готелю в заголовку X-Api-Key. Основні сутності: rooms (номери), reservations (броні), rates (тарифи), availability (доступність за датами).
Напрямки потоків даних:
- Bnovo → 1С-Бітрікс: синхронізація доступності номерів і тарифів — щоб віджет на сайті показував актуальне завантаження.
- 1С-Бітрікс → Bnovo: передача нових броней, створених через сайт.
Проміжного сховища уникаємо — дані передаємо напряму через API з кешуванням на стороні 1С-Бітрікс.
Синхронізація доступності
Bnovo повертає доступність через GET /api/v1/availability?hotel_id={id}&date_from=YYYY-MM-DD&date_to=YYYY-MM-DD. Відповідь містить масив дат з кількістю вільних номерів по кожному типу.
Агент 1С-Бітрікс запускається кожні 10 хвилин і оновлює локальний кеш доступності в таблиці bl_bnovo_availability:
CREATE TABLE bl_bnovo_availability (
room_type_id INT NOT NULL,
date DATE NOT NULL,
qty_available SMALLINT NOT NULL DEFAULT 0,
synced_at TIMESTAMP NOT NULL,
PRIMARY KEY (room_type_id, date)
);
Запит до цієї таблиці робить віджет вибору дат на сайті — без звернення до Bnovo API в реальному часі. Це знижує залежність від доступності зовнішнього сервісу та прискорює відгук форми.
Створення броні в Bnovo з 1С-Бітрікс
Після успішної оплати замовлення (подія OnSalePaymentEntitySaved при IS_PAID = Y) обробник формує запит до Bnovo:
$response = $bnovoClient->post('/api/v1/reservations', [
'hotel_id' => $this->hotelId,
'room_id' => $roomId,
'date_from' => $booking->getDateFrom()->format('Y-m-d'),
'date_to' => $booking->getDateTo()->format('Y-m-d'),
'rate_id' => $booking->getRateId(),
'guest' => [
'name' => $order->getPropertyValueByCode('NAME'),
'phone' => $order->getPropertyValueByCode('PHONE'),
'email' => $order->getPropertyValueByCode('EMAIL'),
],
'amount' => $payment->getSum(),
'source' => 'website',
]);
$bnovoReservationId = $response['reservation']['id'];
reservation_id з відповіді зберігаємо в UF-полі замовлення UF_BNOVO_RESERVATION_ID — це необхідно для подальших операцій (скасування, зміна дат).
Webhooks з Bnovo
Bnovo вміє надсилати webhooks при зміні статусу броні, створеної всередині PMS (не через сайт). Налаштування — у розділі «Інтеграції» особистого кабінету Bnovo: вказуємо URL обробника на стороні 1С-Бітрікс.
Обробник /api/bnovo-webhook.php:
$payload = json_decode(file_get_contents('php://input'), true);
// Перевірка підпису: HMAC-SHA256 тіла запиту + секретний ключ
$expectedSign = hash_hmac('sha256', file_get_contents('php://input'), BNOVO_WEBHOOK_SECRET);
if (!hash_equals($expectedSign, $_SERVER['HTTP_X_BNOVO_SIGNATURE'] ?? '')) {
http_response_code(403);
exit;
}
switch ($payload['event']) {
case 'reservation.created':
// Створити замовлення в 1С-Бітрікс або сповістити менеджера
break;
case 'reservation.cancelled':
// Скасувати замовлення в 1С-Бітрікс
BnovoSyncService::cancelOrder($payload['reservation_id']);
break;
case 'availability.updated':
// Скинути кеш доступності для порушених дат
BnovoCache::invalidate($payload['room_type_id'], $payload['dates']);
break;
}
Тарифи та сезонні ціни
Bnovo зберігає тарифи (rates) — набір правил ціноутворення. Метод GET /api/v1/rates повертає список з умовами: мінімальна кількість ночей, обмеження за датами, тип харчування. Синхронізуємо тарифи в таблицю bl_bnovo_rates раз на годину — вони змінюються рідко.
На формі бронювання тарифи підвантажуються AJAX-викликом: користувач вибирає дати, сайт запитує актуальні тарифи з цінами через GET /api/v1/rates/prices?room_id=X&date_from=...&date_to=... і відображає варіанти розміщення.
Терміни
| Етап | Термін |
|---|---|
| Налаштування API-клієнта та автентифікації | 1 день |
| Синхронізація доступності (агент + таблиця) | 2 дні |
| Передача броней до Bnovo при оплаті | 2 дні |
| Обробник webhooks з Bnovo | 1–2 дні |
| Синхронізація тарифів | 1 день |
| Тестування та налагодження | 2 дні |
| Разом | 9–11 днів |







