Разработка сайта транспортной компании на 1С-Битрикс
Сайт транспортной компании — это не буклет с фотографиями автобусов. Клиент приходит с конкретной задачей: узнать, есть ли рейс Минск — Москва на пятницу, сколько стоит аренда автобуса на 45 человек, можно ли заказать трансфер из аэропорта. Если ответ нельзя получить за пару кликов — клиент уходит к агрегатору.
Центральный элемент такого сайта — система онлайн-бронирования с расчётом стоимости по тарифной сетке. Разберём её архитектуру.
Каталог услуг
Услуги транспортной компании разнородны, и это влияет на структуру. Инфоблок «Услуги» с разделами:
- Регулярные рейсы — Минск — Москва, Минск — Вильнюс, расписание по дням
- Аренда автобусов — почасовая, посуточная, под мероприятие
- Корпоративные трансферы — доставка сотрудников, обслуживание по договору
- Экскурсионные перевозки — маршруты по городам, туры
Каждый тип услуги требует разного набора параметров для бронирования. Регулярный рейс — это выбор даты и количества мест. Аренда автобуса — это маршрут, дата, количество часов, тип транспорта. Экскурсия — это готовый маршрут с фиксированной ценой за человека.
Для этого создаются отдельные инфоблоки или используется единый инфоблок с условными свойствами, активными в зависимости от раздела.
Онлайн-бронирование с тарифной сеткой
Бронирование — многошаговая форма, которая собирает параметры поездки и рассчитывает стоимость по тарифам. Разберём архитектуру на примере аренды автобуса.
Шаг 1: параметры поездки. Клиент заполняет:
- Откуда — куда (города, адреса)
- Дата и время подачи
- Количество пассажиров
- Тип поездки: в одну сторону / туда-обратно / почасовая аренда
- Дополнительно: багаж, детские кресла, Wi-Fi в салоне
Шаг 2: выбор транспорта. На основе количества пассажиров система фильтрует автопарк и предлагает подходящие варианты. Клиент видит фото, характеристики, класс комфорта.
Шаг 3: расчёт стоимости. Здесь работает тарифная сетка.
Highload-блок TariffGrid:
| Поле | Тип | Назначение |
|---|---|---|
| UF_VEHICLE_TYPE | enumeration | Микроавтобус / Автобус средний / Автобус большой |
| UF_COMFORT_CLASS | enumeration | Стандарт / Комфорт / VIP |
| UF_TARIFF_TYPE | enumeration | За км / За час / Фиксированный маршрут |
| UF_PRICE_PER_UNIT | float | Цена за единицу (км или час) |
| UF_MIN_HOURS | integer | Минимальный заказ в часах |
| UF_MIN_PRICE | float | Минимальная стоимость заказа |
| UF_CITY_FROM | string | Город отправления (для фиксированных маршрутов) |
| UF_CITY_TO | string | Город прибытия |
| UF_FIXED_PRICE | float | Фиксированная цена маршрута |
| UF_SEASON | enumeration | Низкий / Высокий / Праздничный |
| UF_VALID_FROM | date | Дата начала действия тарифа |
| UF_VALID_TO | date | Дата окончания действия тарифа |
Highload-блок TariffSurcharge — наценки:
| Поле | Тип | Назначение |
|---|---|---|
| UF_TYPE | enumeration | Ночная подача / Праздник / Международный / Багаж |
| UF_SURCHARGE_TYPE | enumeration | Процент / Фиксированная сумма |
| UF_VALUE | float | Значение наценки |
| UF_VEHICLE_TYPE | enumeration | К какому типу транспорта применяется |
Алгоритм расчёта для аренды по километражу:
- Определить расстояние между точками. Варианты: Google Distance Matrix API, OSRM (open-source), справочник расстояний в отдельном Highload-блоке
RouteDistance(для популярных направлений) - Выбрать тариф из
TariffGridпо типу транспорта, классу комфорта и дате (сезон) - Базовая стоимость = расстояние *
UF_PRICE_PER_UNIT - Проверить минимум: если базовая <
UF_MIN_PRICE, взятьUF_MIN_PRICE - Применить наценки из
TariffSurcharge: ночная подача (до 7:00 или после 23:00), международный маршрут, праздничный день - Для «туда-обратно» — удвоить километраж, но с коэффициентом 0.85-0.9 (скидка на обратный путь)
$tariff = TariffGridTable::getRow([
'filter' => [
'UF_VEHICLE_TYPE' => $vehicleType,
'UF_COMFORT_CLASS' => $comfortClass,
'UF_TARIFF_TYPE' => 'per_km',
'<=UF_VALID_FROM' => $tripDate,
'>=UF_VALID_TO' => $tripDate,
],
]);
$basePrice = max(
$distance * $tariff['UF_PRICE_PER_UNIT'],
$tariff['UF_MIN_PRICE']
);
// Наценки
$surcharges = TariffSurchargeTable::getList([
'filter' => ['UF_VEHICLE_TYPE' => $vehicleType],
])->fetchAll();
foreach ($surcharges as $s) {
if (isSurchargeApplicable($s, $tripDate, $tripTime, $isInternational)) {
$basePrice = applySurcharge($basePrice, $s);
}
}
Для почасовой аренды расчёт проще: количество часов * тариф за час, с проверкой минимума. Для фиксированных маршрутов — берётся UF_FIXED_PRICE напрямую.
Шаг 4: оформление заказа. После расчёта клиент подтверждает бронирование. Создаётся заказ через \Bitrix\Sale\Order::create(). Свойства заказа содержат все параметры поездки: маршрут, дату, тип транспорта, расчётную стоимость. Оплата — предоплата 30-50% через онлайн-эквайринг или полная оплата при посадке.
Автопарк
Инфоблок «Автопарк» — карточка каждого транспортного средства:
- Тип — микроавтобус, автобус средний, автобус большой
- Вместимость — количество пассажирских мест
- Класс комфорта — стандарт, комфорт, VIP
- Характеристики — кондиционер, Wi-Fi, розетки, TV, туалет, багажное отделение
- Фото — множественное файловое свойство, галерея экстерьера и интерьера
- Год выпуска, марка/модель
На странице каталога автопарка — фильтрация по вместимости и классу. При бронировании — автоматический подбор транспорта по количеству пассажиров: если клиент указал 20 человек, показываем автобусы от 20 мест и выше.
Отслеживание рейсов
Для регулярных рейсов актуальна функция отслеживания в реальном времени. Реализация:
- GPS-трекеры на транспорте отправляют координаты на сервер (WIALON, Galileosky или свой приёмник)
- На стороне Битрикса — кастомная страница с картой (Яндекс.Карты API или Leaflet)
- Координаты подтягиваются через AJAX каждые 30-60 секунд из API трекера
- Клиент вводит номер рейса или выбирает из расписания, видит точку на карте и расчётное время прибытия
Интеграция с GPS — отдельный модуль. Битрикс выступает фронтендом, трекер — источником данных. Хранить историю координат в Битриксе не нужно — она остаётся в системе мониторинга.
B2B-портал для корпоративных клиентов
Корпоративные клиенты — основной доход транспортной компании. Им нужен не публичный сайт, а закрытый портал:
- Авторизация по договору — менеджер компании-клиента входит под своей учёткой
- Подача заявок — форма заказа с преднастроенными маршрутами (ежедневный трансфер сотрудников)
- Акты и счета — выгрузка документов из 1С через интеграцию
- История заказов — все поездки по договору с фильтрацией по дате, маршруту
- Баланс — предоплатный счёт с историей пополнений и списаний
Реализуется через группы пользователей Битрикса с ограничением доступа к разделу сайта. Документооборот — через интеграцию с 1С:Бухгалтерия (HTTP-сервисы).
SEO для маршрутных запросов
Транспортные компании получают основной поисковой трафик по запросам вида «автобус Минск Москва», «трансфер аэропорт Минск». Под каждый популярный маршрут создаётся посадочная страница — элемент инфоблока «Маршруты» с SEO-полями: ELEMENT_META_TITLE, ELEMENT_META_DESCRIPTION, уникальным описанием маршрута, расписанием рейсов и встроенным виджетом бронирования.
Для генерации посадочных страниц можно использовать шаблонный подход: один шаблон компонента bitrix:news.detail, в который подставляются данные маршрута. SEO-тексты пишутся уникальные — шаблонные тексты с подстановкой городов поисковики давно распознают.
Сроки реализации
| Масштаб | Состав | Срок |
|---|---|---|
| Небольшой перевозчик (5-10 маршрутов) | Каталог услуг, автопарк, форма заявки, маршрутные страницы | 6-8 недель |
| Средняя компания | + онлайн-бронирование с тарифной сеткой, оплата, расписание рейсов | 12-16 недель |
| Крупный перевозчик | + B2B-портал, GPS-отслеживание, интеграция с 1С, мультиязычность | 20-26 недель |
Техническое замечание
Расчёт расстояний — узкое место. Google Distance Matrix API платный и имеет лимиты. Для популярных маршрутов лучше предрассчитать расстояния и сохранить в Highload-блок RouteDistance, обращаясь к API только для нестандартных запросов. Это снижает и стоимость API, и время ответа калькулятора.







