Интеграция 1С-Битрикс с системой бронирования Bnovo
Bnovo — российская PMS-система для гостиниц с собственным channel manager и модулем онлайн-бронирования. Проблема без интеграции: менеджер принимает заявку через сайт на Битрикс, вручную заносит бронь в Bnovo, потом вручную обновляет доступность номеров обратно на сайте. Два источника правды — два места для ошибок. Овербукинг при таком подходе — вопрос времени.
Архитектура интеграции
Bnovo предоставляет REST API (https://online.bnovo.ru/api/v1/). Авторизация — API-ключ отеля в заголовке X-Api-Key. Основные сущности: rooms (номера), reservations (брони), rates (тарифы), availability (доступность по датам).
Направления потоков данных:
- Bnovo → Битрикс: синхронизация доступности номеров и тарифов — чтобы виджет на сайте показывал актуальную загрузку.
- Битрикс → Bnovo: передача новых броней, созданных через сайт.
Промежуточного хранилища избегаем — данные передаём напрямую через API с кэшированием на стороне Битрикс.
Синхронизация доступности
Bnovo отдаёт доступность через GET /api/v1/availability?hotel_id={id}&date_from=YYYY-MM-DD&date_to=YYYY-MM-DD. Ответ содержит массив дат с количеством свободных номеров по каждому типу.
Агент Битрикс запускается каждые 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 из Битрикс
После успешной оплаты заказа (событие 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 обработчика на стороне Битрикс.
Обработчик /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':
// Создать заказ в Битрикс или уведомить менеджера
break;
case 'reservation.cancelled':
// Отменить заказ в Битрикс
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 дней |







