Розробка сайту доставки їжі на 1С-Bitrix
Сайт доставки їжі — повнофункціональний e-commerce проект з особливостями общепиту. Тут не просто каталог та кошик: є зони доставки з різним часом та мінімумами, модифікатори страв (соус, розмір, добавки), інтеграція з кухонною системою для автоматичної передачи замовлень та стеження курьєра. 1С-Bitrix закриває основу через модуль sale та торговий каталог, а специфіку доставки наращуємо користувацькими обработчиками та інтеграціями.
Каталог меню: інфоблок з торговими пропозиціями
Каталог будується на торговому каталозі Bitrix. Кожна страва — елемент інфоблока з прив'язаним торговим каталогом. Категорії (піца, суші, бургери, напитки, десерти) — розділи інфоблока.
Властивості елемента:
- Склад — текстове поле
- Вага — числова властивість (грами)
- Калорійність / БЖУ — числові властивості
- Час приготування — числова (хвилини), використовується при розрахунку часу доставки
- Позначки — множинний список (гостра, вегетаріанська, новинка, хіт)
- Фотографія — обов'язкова файлова властивість
Модифікатори через торові пропозиції (SKU). Піца 25 см та 35 см — дві торові пропозиції з різною ціною та вагою. Добавки (подвійний сир, бекон, грибы) — реалізуються через властивості торових пропозицій типу «список» з надбавкою. При виборі добавки JS-компонент на фронтенді перераховує підсумкову вартість.
Альтернативний підхід для масових модифікаторів (соуси до кожної страви) — окремий інфоблок «Добавки» зі зв'язком «багато до багатьох» через властивість прив'язки. На фронтенді при додаванні страви в кошик з'являється попап вибору добавок.
Промокоди та програма лояльності
Промокоди — штатний механізм модуля sale. Типи скидок:
- Фіксована сума при замовленні від N рублей
- Відсоток на все замовлення або категорію
- Безплатна доставка
- Подарунок при замовленні (додавання товара з нульовою вартістю)
Програма лояльності — накопичувальна. Внутрішній рахунок користувача (модуль sale, розділ «Рахунки покупців»): нарахування бонусів у відсотках від замовлення, списання при наступному замовленні. Правила нарахування настроюються через бізнес-логіку модуля без користувацької розробки.
Push-сповіщення про статус замовлення
При зміні статусу замовлення (прийнято → готується → в дорозі → доставлено) клієнт отримує сповіщення. Канали:
-
SMS — через
messageserviceз підключеним провайдером (SMS.ru, SMSC) -
Email — шаблони поштових подій модуля
sale - Push у браузер — Web Push API (Service Worker + VAPID-ключі)
Push-сповіщення реалізуються користувацьким обработчиком подій OnSaleStatusOrder. При зміні статусу обработчик перевіряє підписку користувача та відправляє push через Web Push протокол. Підписка запитується при першому замовленні.
Кошик з зонами доставки
Кошик доставки їжі відрізняється від звичайного інтернет-магазину. Ключові особливості:
Зони доставки за геолокацією. Місто ділиться на зони, кожна з власними параметрами:
| Параметр | Зона 1 (центр) | Зона 2 (спальні райони) | Зона 3 (передмістя) |
|---|---|---|---|
| Радіус | до 3 км | 3–7 км | 7–15 км |
| Мінімальна сума замовлення | 500 ₽ | 800 ₽ | 1 200 ₽ |
| Вартість доставки | безплатно | 150 ₽ | 300 ₽ |
| Час доставки | 30–45 хв | 45–60 хв | 60–90 хв |
Зони зберігаються в highload-блоці з полігонами координат (GeoJSON). При оформленні замовлення клієнт вводить адресу, JavaScript відправляє запит в Яндекс.Геокодер (або DaData), отримує координати та визначає зону через point-in-polygon. Результат кешується по адресі.
Реалізація в sale: зони доставки підключаються як служби доставки (обработчик CDeliveryHandler). Користувацький обработчик отримує координати з властивості замовлення, визначає зону та повертає вартість та строки. Якщо адреса за межами зон — доставка недоступна, оформлення блокується.
Мінімальна сума замовлення перевіряється у двох місцях: на фронтенді (JS блокує кнопку оформлення) та на бекенді (обработчик OnSaleBeforeOrderAdd повертає помилку). Подвійна перевірка виключає обхід через прямий POST-запит.
Часові слоти. Клієнт вибирає «як можна швидше» або конкретний слот (12:00–12:30, 12:30–13:00). Доступні слоти генеруються динамічно: поточний час + час приготування найдовшої страви в кошику + час доставки по зоні. Слоти в минулому та перевантажені (ліміт замовлень на слот) — недоступні.
Інтеграція з кухонною системою
Передача замовлення в iiko або R-Keeper — обов'язкова інтеграція для автоматизації. Без неї менеджер вручну переносить замовлення з сайту в касову систему, втрачаючи час та допускаючи помилки.
Схема взаємодії з iiko:
- Замовлення оформлене на сайті → подія
OnSaleOrderAdd - Обработчик формує JSON-запит до iiko Transport API (
/api/1/deliveries/create) - У запиті: позиції з SKU з довідника iiko (маппінг через властивість інфоблока «ID в iiko»), адреса, телефон, коментар, час доставки
- iiko повертає ID замовлення, який зберігається у властивість замовлення Bitrix
- Cron-агент раз у 2 хвилини опитує iiko по статусу замовлень (
/api/1/deliveries/by_id) - При зміні статусу (готується → готово → в дорозі) — оновлюється статус замовлення в
sale, запускаються сповіщення
Маппінг номенклатури — критичний етап. Кожній страві на сайті відповідає позиція в iiko. Зв'язок через властивість інфоблока «Зовнішній ID». При додаванні нової страви адміністратор повинен заповнити це поле — без нього замовлення не передасться. Валідація при збереженні елемента через обработчик OnBeforeIBlockElementUpdate.
Модифікатори передаються як вкладені об'єкти в JSON. Структура модифікаторів iiko та сайту повинна збігатися — маппінг настроюється при інтеграції та фіксується в документації.
Обработка помилок: якщо iiko недоступна — замовлення зберігається в Bitrix зі статусом «Чекає передачи на кухню». Cron-агент повторює спробу кожні 5 хвилин. Менеджер бачить такі замовлення в окремому фільтрі адміністративної панелі та може передати вручну.
R-Keeper працює аналогічно, але через XML-протокол (R-Keeper XML API) або проміжний сервіс (UCS Delivery). Принцип той же: маппінг, передача, опрос статусів.
Стеження курьєра
Базова реалізація — статуси замовлення без карти. Розширена — відображення курьєра на карті.
Для розширеної версії: курьєр використовує мобільний додаток (власний або сторонній — Яндекс.Маршрутизація, Bringo), який передає координати. Сайт отримує координати через API курьєрської служби та відображає на Яндекс.Карте в особистому кабінету клієнта. Оновлення — за запитом (кнопка «Оновити») або автоматично через polling кожні 30 секунд.
Етапи розробки
| Етап | Вміст | Строк |
|---|---|---|
| Аналітика | Зони доставки, маппінг номенклатури iiko/R-Keeper, бізнес-логіка кошика | 2 тижні |
| Прототипування | UX кошика, оформлення замовлення, мобільна версія | 1 тиждень |
| Дизайн | Макети каталога, кошика, особистого кабінету | 2 тижні |
| Фронтенд | Каталог з модифікаторами, кошик, визначення зони, слоти | 3 тижні |
| Бекенд | Торговий каталог, обработчик доставки, інтеграція iiko/R-Keeper | 3 тижні |
| Тестування | Наскрізний тест замовлення (сайт → кухня → курьєр → клієнт), навантаження | 1.5 тижня |
| Запуск | Деплой, моніторинг інтеграцій, навчання операторів | 3 дні |
Разом: 12–14 тижнів. Основний ризик по строкам — інтеграція з кухонною системою: залежить від документації та стабільності API на стороні iiko/R-Keeper.







