Автоматизация бронирования столов в ресторане: Telegram бот с интерактивным выбором даты и времени, интеграция через HTTP сервис 1С
В условиях высокой конкуренции ресторанного бизнеса скорость и удобство бронирования становятся критическими факторами. Для ресторана, назовем его «VR», была поставлена задача: разработать Telegram‑бот, который позволит гостям самостоятельно выбирать свободные даты и время, а затем автоматически бронировать столы в конфигурации «1С:Ресторан». При этом заказчик определил важные технические ограничения — отсутствие статического IP‑адреса и наличие файловой базы 1С, что потребовало нестандартного подхода к интеграции.
В этой статье мы подробно разберем, как было реализовано решение: от интерактивного календаря в боте до синхронизации с 1С через HTTP‑сервис без использования регламентных заданий.
1. Постановка задачи и ключевые требования
Заказчик сформулировал бизнес‑требования следующим образом:
-
Telegram‑бот должен позволять бронировать столы в залах 1 и 3 по трем категориям: «VR», «PS» и «Праздник».
-
Интерактивность: бот предлагает пользователю выбрать свободную дату (календарь на месяц вперед), затем свободное время на выбранную дату.
-
Интеграция с 1С: данные о бронировании должны синхронизироваться с 1С в режиме, близком к реальному времени. Забронированный стол должен становиться недоступен для заказа за 30 минут до времени начала брони.
-
Технические ограничения: у заказчика файловая база 1С и отсутствует статический IP‑адрес, поэтому традиционное использование регламентных заданий и прямых API‑вызовов затруднено.
2. Разработка Telegram‑бота
Бот реализован на Python с использованием асинхронного фреймворка aiogram. Основное внимание уделено удобному выбору даты и времени.
При первом взаимодействии с ботом пользователь видит сообщение:
«Нажмите Start, чтобы начать 👇» и кнопку START.
После нажатия отображаются три кнопки выбора категории: «VR», «PS», «Праздник».
После выбора категории бот запрашивает дату. Используется встроенный календарь (Inline‑клавиатура), который позволяет выбрать день в пределах текущего месяца + следующего месяца. Для каждого дня бот проверяет, есть ли хотя бы один свободный стол в выбранной категории (данные о занятости бот получает от 1С и кэширует для последующих запросов).
Когда дата выбрана, бот отображает доступные временные слоты (с шагом 30 минут) в виде кнопок. Слоты формируются на основе данных о занятости столов, полученных от 1С.
Все запросы к 1С о доступности слотов выполняются через HTTP‑сервис. Чтобы не перегружать 1С, бот кэширует информацию о занятости на 1-2 минуты.
Подтверждение бронирования
Когда пользователь выбирает время, бот отправляет заявку в 1С через HTTP‑сервис. 1С проверяет актуальную занятость и возвращает результат. Если стол свободен:
-
Бот сохраняет бронь в своем внутреннем хранилище (было принято решение хранить данные в словаре, так как отсутствует риск накопления большого объема данных; ради этого не стоит разворачивать БД по типу SQLite).
-
Пользователь получает сообщение: «Бронирование подтверждено».
Исключение
Если все столы заняты (вдруг кто-то за 5 секунд успел забронировать время, а информация в боте еще не обновилась):
-
Бот отправляет сообщение: «К сожалению, все столы в это время заняты. Пожалуйста, выберите другую дату или время».
-
Пользователь возвращается к выбору даты (или бот предлагает ближайшие свободные слоты).
Хранение заявок и обратная связь
Бот хранит все необработанные заявки в оперативной памяти. Каждой заявке присваивается уникальный идентификатор. Когда 1С запрашивает новые заявки через HTTP‑сервис, бот возвращает список заявок, которые еще не были переданы. После успешной обработки 1С сообщает боту (через тот же HTTP‑сервис), что заявка принята, и бот меняет ее статус.
Такой подход позволяет избежать потери данных при временных сбоях сети.
3. Регистр сведений для хранения записей о бронировании
В 1С создан регистр сведений БронированиеТГ со следующей структурой:
Измерения:
-
IdChat (строка) — идентификатор чата Telegram.
-
Столы и Декорации (справочник) — конкретный стол.
Ресурсы:
-
ВремяБронирования (дата+время) — начало брони.
-
Телефон — телефон гостя
Этот регистр позволяет быстро проверять занятость столов на заданный момент.
4. Алгоритм обработки заявки в 1С
Когда 1С получает новую заявку от бота:
- Определяется список столов, соответствующих выбранной категории (маппинг описан в разделе 5).
- Для каждого стола проверяется:
-
Наличие записи в регистре БронированиеТГ на указанную дату и время.
-
Отсутствие в заказах статуса «Бронь» или «Активен» на это время.
-
- Если найден свободный стол:
-
Создается запись в регистре.
-
Формируется ответ: «Бронирование подтверждено», который отправляется боту.
Если все столы заняты:
-
Выполняется поиск ближайших свободных слотов на выбранную дату (или на следующие даты).
-
Формируется сообщение с предложением альтернативного времени.
-
Ответ отправляется боту.
-
Автоматическое освобождение брони
Для предотвращения блокировки столов в случае неявки гостя реализован механизм:
-
Каждые 5 минут (в том же обработчике ожидания) 1С проверяет регистр БронированиеТГ.
-
Если со времени начала брони прошло более 15 минут, а заказ на этот стол не открыт (статус «Активен»), запись удаляется.
-
Освободившийся стол становится доступным для бронирования.
Предварительная блокировка стола
За 30 минут до начала брони стол автоматически становится неактивным в интерфейсе фронт‑офиса. Это визуально сигнализирует администратору о скором приходе гостя и предотвращает случайное двойное бронирование вручную.
Отображение брони в интерфейсе 1С
Брони, созданные через Telegram, отображаются в стандартной схеме зала (фронт‑офис) наравне с бронями, сделанными администратором вручную. Для них установлен особый цвет (например, синий), а во всплывающей подсказке указывается источник «Telegram» и номер телефона гостя. Администратор может управлять такими бронями стандартными средствами (перенос, отмена).
Особенности реализации
В качестве архитектурного решения был выбран подход с HTTP‑сервисом внутри 1С. Данный сервис запускается через обработчик ожидания. Бот выступает в роли хранилища заявок: 1С периодически (каждые 5 секунд) опрашивает бота через HTTP, забирает новые заявки и отправляет ответы обратно. Главная сложность заключалась в том, что файловая база 1С не поддерживает регламентные задания в привычном виде (они работают только в клиент‑серверном варианте). Использование обработчика ожидания позволило организовать непрерывный цикл проверок без использования внешних планировщиков. Проблема отсутствия статического IP-адреса решена за счет HTTP-сервиса, который запускается внутри 1С. Бот обращается к этому сервису по локальному адресу. Так как бот и 1С находятся в одной локальной сети, проблем с маршрутизацией не возникает.
5. Маппинг категорий на столы
В соответствии с требованиями заказчика:
-
Зал 1: столы категории «VR»
-
Зал 3: столы категории «PS»
-
Зал 3: столы категории «Праздник»
Это соответствие задано в справочнике 1С при выборе столов для каждой заявки.
6. Эффект внедрения и перспективы
После запуска бота были достигнуты следующие результаты:
-
Сокращение времени бронирования для гостя до 30-40 секунд.
-
Полная автоматизация процесса: администратор больше не участвует в первичной обработке заявок.
-
Прозрачность занятости столов в реальном времени.
-
Устойчивость к сетевым сбоям благодаря механизму кэширования и повторных запросов.
В планах по доработке:
-
Добавить возможность отмены брони через бота.
-
Интегрировать систему лояльности (накопление баллов).
-
Расширить выбор залов и категорий.
7. Заключение
Разработанное решение демонстрирует, что можно построить надежную автоматизированную систему бронирования на базе Telegram‑бота, даже при наличии таких ограничений, как файловая база 1С и отсутствие статического IP‑адреса. Использование HTTP‑сервиса внутри 1С и интерактивного интерфейса с выбором даты/времени позволило создать удобный инструмент как для гостей, так и для сотрудников ресторана. Такой подход может быть масштабирован на любые другие типы бронирования (не только столы) и адаптирован под различные конфигурации 1С.