Разработка сайта автодилера на 1С-Битрикс
Сайт автодилера — это каталог, в котором один товар стоит от полутора до двадцати миллионов. Посетитель не добавляет машину в корзину — он подбирает, сравнивает, считает кредит, записывается на тест-драйв. Средняя сессия на дилерском сайте — 6-9 минут, 3-4 переключения фильтров, 2-3 открытых карточки. Если фильтр по марке-модели тормозит, фотографии грузятся по одной, а калькулятор кредита требует перезагрузки страницы — посетитель уходит на auto.ru, где всё это работает. Задача — собрать архитектуру, которая не уступает агрегаторам по скорости работы каталога, при этом остаётся управляемой из админки Битрикса.
Архитектура каталога: новые автомобили и автомобили с пробегом
Первое архитектурное решение — хранить новые и подержанные автомобили в одном инфоблоке или в разных. Ответ зависит от бизнес-логики, а не от технических ограничений.
Один инфоблок, разделы по типам — подходит мультибрендовому дилеру с каталогом до 2000 позиций. Новые и б/у автомобили имеют 80%+ общих свойств: марка, модель, год, двигатель, коробка, цвет, цена, фотографии. Различия: у новых есть комплектация (trim level) и гарантийные условия, у б/у — пробег, VIN, количество владельцев, история обслуживания. Пустые свойства не создают записей в b_iblock_element_property — таблица не раздувается. Плюс: единый bitrix:catalog.smart_filter, единый поиск, одна лента в админке.
Два инфоблока — оправдано, когда новые автомобили формируются из конфигуратора (марка → модель → комплектация → цвет → опции), а б/у — это конкретные экземпляры с VIN. У конфигуратора — своя логика вложенности (Highload-блоки комплектаций, пакетов опций), которая не нужна подержанным. Смешивать в одном инфоблоке — засорять админку. Минус: поиск «все BMW X5» по обоим инфоблокам требует кастомный компонент.
Рекомендуемая структура для среднего дилера (500-3000 автомобилей):
- Инфоблок «Автомобили» — разделы: Новые, С пробегом
- Highload-блок «Марки» — справочник марок (BMW, Toyota, Kia...) с логотипами
-
Highload-блок «Модели» — справочник моделей с привязкой к марке через
UF_BRAND_ID - Highload-блок «Поколения» — поколения моделей (кузов, годы выпуска)
- Highload-блок «Комплектации» — для новых: набор опций + цена
-
Инфоблок «Акции» — спецпредложения с привязкой к автомобилям через
PROPERTY_CAR_IDS
Свойства автомобиля — минимум 40 полей. Ключевые для фильтрации и агрегаторов:
| Свойство | Код | Тип | Индексация |
|---|---|---|---|
| Марка | BRAND | S:Highload | Фасетный индекс |
| Модель | MODEL | S:Highload | Фасетный индекс |
| Год выпуска | YEAR | N (число) | Фасетный индекс |
| Цена | PRICE | N | Фасетный индекс |
| Пробег | MILEAGE | N | Фасетный индекс |
| Тип двигателя | ENGINE_TYPE | L (список: бензин, дизель, гибрид, электро) | Фасетный индекс |
| Объём двигателя | ENGINE_VOLUME | N | Фасетный индекс |
| Коробка передач | TRANSMISSION | L (МКПП, АКПП, робот, вариатор) | Фасетный индекс |
| Привод | DRIVE | L (передний, задний, полный) | Фасетный индекс |
| Кузов | BODY_TYPE | L (седан, SUV, хэтчбек...) | Фасетный индекс |
| Цвет | COLOR | S (строка) | Фасетный индекс |
| VIN | VIN | S | Нет (уникальный, поиск по точному значению) |
| Статус | STATUS | L (в наличии, в пути, зарезервирован) | Фасетный индекс |
| Фото экстерьер | PHOTOS | F (файл, множественное) | Нет |
| Фото интерьер | PHOTOS_INTERIOR | F (множественное) | Нет |
| 360 экстерьер | SPIN_360_URL | S | Нет |
| Панорама салона | INTERIOR_PANORAMA | S | Нет |
VIN хранится как строковое свойство без фасетного индекса — по нему ищут точным совпадением, а не диапазоном. Поиск по VIN реализуется через CIBlockElement::GetList с фильтром ['=PROPERTY_VIN' => $vin].
Зависимая фильтрация марка → модель: почему это сложнее, чем кажется
Штатный bitrix:catalog.smart_filter показывает все значения всех свойств одновременно. Пользователь выбирает марку BMW — но в списке моделей по-прежнему висят Camry, Ceed, Solaris. Это ломает UX дилерского сайта. Нужна каскадная фильтрация: выбрал марку — список моделей пересчитался, выбрал модель — список поколений пересчитался.
Вариант 1: кастомный AJAX-контроллер. Отдельный endpoint /api/catalog/filter-values/, который принимает текущие выбранные фильтры и возвращает допустимые значения остальных свойств.
// Контроллер каскадного фильтра
class FilterValuesController extends \Bitrix\Main\Engine\Controller
{
public function getModelsAction(int $brandId): array
{
// Выбираем модели, у которых есть хотя бы один автомобиль с этой маркой
$models = [];
$res = \CIBlockElement::GetList(
[],
[
'IBLOCK_ID' => CAR_IBLOCK_ID,
'ACTIVE' => 'Y',
'PROPERTY_BRAND' => $brandId,
],
['PROPERTY_MODEL' => 'CNT'], // GROUP BY MODEL
false,
['PROPERTY_MODEL']
);
while ($row = $res->Fetch()) {
$models[] = [
'id' => $row['PROPERTY_MODEL_VALUE'],
'count' => $row['CNT'],
];
}
return $models;
}
}
На фронте — событие change на select марки, AJAX-запрос через BX.ajax.runAction('controller.filterValues.getModels', {data: {brandId: val}}), обновление select модели. Для select используем Choices.js или Tom Select — стандартный <select> не годится при 50+ моделях.
Вариант 2: предзагрузка зависимостей. При рендере страницы каталога в JavaScript передаётся JSON-объект всех зависимостей: {brand_1: [model_5, model_12, ...], brand_2: [...]}. При 30 марках и 200 моделях — это 3-5 КБ JSON. Выбор марки фильтрует модели на клиенте без AJAX. Быстрее, но не учитывает текущий сток — показывает модель, даже если автомобилей этой модели сейчас нет в наличии. Решение — в JSON включать count: {model_5: {name: "X5", count: 7}}, и скрывать модели с count: 0.
Вариант 3: комбинация. Предзагрузка дерева марка-модель-поколение при первом заходе (JSON), AJAX-пересчёт count при изменении любого фильтра. Это даёт моментальный отклик на выбор марки (список моделей появляется без задержки) и актуальные счётчики (пересчитанные с учётом цены, года, пробега).
Для range-ползунков (цена, пробег, год выпуска) — логика аналогична каталогу недвижимости: bitrix:catalog.smart_filter отдаёт MIN_VALUE/MAX_VALUE, на фронте noUiSlider, значения передаются через GET-параметры arrFilter_P1_MIN/arrFilter_P1_MAX. AJAX-подгрузка результатов через bitrix:catalog.section с AJAX_MODE=Y.
XML-фиды для авто-агрегаторов: три формата, три головные боли
Авто-агрегаторы — основной источник трафика для дилера. auto.ru, Avito Авто, av.by — у каждого свой XML-формат, свой набор обязательных полей, свои правила валидации. Ошибка в фиде — объявления снимаются с публикации, дилер теряет звонки.
auto.ru использует формат cars.xml, основанный на стандарте Яндекса:
<cars>
<car>
<mark_id>BMW</mark_id>
<folder_id>X5</folder_id>
<modification_id>xDrive30d</modification_id>
<body_type>ALLROAD_5_DOORS</body_type>
<year>2024</year>
<run>0</run>
<color>ЧЕРНЫЙ</color>
<transmission>AUTOMATIC</transmission>
<engine_type>DIESEL</engine_type>
<engine_volume>3.0</engine_volume>
<price>7890000</price>
<currency>RUR</currency>
<vin>WBAJC51090B123456</vin>
<unique_id>car_12345</unique_id>
<images>
<image>https://site.ru/upload/cars/12345/photo1.jpg</image>
<image>https://site.ru/upload/cars/12345/photo2.jpg</image>
</images>
</car>
</cars>
Критические поля: mark_id и folder_id должны совпадать со справочником auto.ru (не произвольные строки, а конкретные идентификаторы). Если в вашем Highload-блоке марка называется «БМВ», а в справочнике auto.ru — BMW, фид будет отклонён. Нужен маппинг — дополнительное поле UF_AUTORU_CODE в Highload-блоке марок и моделей.
Avito Авто — формат Autoload:
<Ads formatVersion="3" target="Avito.ru">
<Ad>
<Id>car_12345</Id>
<Category>Транспорт</Category>
<GoodsType>Автомобили</GoodsType>
<Make>BMW</Make>
<Model>X5</Model>
<Generation>IV (G05) Рестайлинг</Generation>
<Year>2024</Year>
<Kilometrage>0</Kilometrage>
<BodyType>Внедорожник</BodyType>
<EngineType>Дизель</EngineType>
<EngineSize>3.0</EngineSize>
<Transmission>Автоматическая</Transmission>
<Price>7890000</Price>
<VIN>WBAJC51090B123456</VIN>
<Images>
<Image url="https://site.ru/upload/cars/12345/photo1.jpg"/>
</Images>
</Ad>
</Ads>
Обратите внимание: у Avito значения кузова — на русском («Внедорожник», а не «ALLROAD_5_DOORS»), тип двигателя — «Дизель», а не «DIESEL». Каждый агрегатор говорит на своём языке. Если попытаться отдать одни и те же строки — фид не пройдёт валидацию.
av.by (Беларусь) — собственный XML-формат, поля на русском, требует указание города по справочнику av.by, обязательны brand_id и model_id из их базы.
Архитектура генератора фидов:
-
Абстрактный класс
BaseFeedGenerator— выборка элементов из инфоблока черезCIBlockElement::GetList, итерация, запись XML черезXMLWriter. -
Конкретные классы:
AutoRuFeedGenerator,AvitoAutoFeedGenerator,AvByFeedGenerator— переопределяют маппинг свойств в XML-теги и трансформацию значений (АКПП → AUTOMATIC для auto.ru, АКПП → «Автоматическая» для Avito). -
Таблица маппинга — Highload-блок
FeedMappingс полямиUF_PROPERTY_CODE,UF_FEED_TYPE,UF_LOCAL_VALUE,UF_FEED_VALUE. Менеджер может добавить соответствие без разработчика: «Полный привод» →ALL_WHEEL_DRIVE(auto.ru), «Полный» (Avito). -
Агент Битрикса (
CAgent) запускается раз в 30 минут — 1 час, генерирует файлы в/upload/feeds/auto_ru.xml,/upload/feeds/avito_auto.xml,/upload/feeds/av_by.xml. При 1000 автомобилей — генерация за 5-15 секунд, XML ~2-4 MB. -
Валидация перед публикацией. После генерации — проверка XSD-схемой (auto.ru публикует свою XSD). Если фид невалиден — отправка уведомления менеджеру, старый фид не перезаписывается.
Сравнение автомобилей
Сравнение — таблица характеристик двух-четырёх автомобилей рядом. Пользователь добавляет машины кнопкой «Сравнить» из каталога и карточки. ID сохраняются в localStorage (неавторизованные) или в Highload-блоке UserCompare (авторизованные). Максимум — 4 автомобиля, больше теряется наглядность.
Компонент сравнения: CIBlockElement::GetList по массиву ID, загрузка всех свойств, рендер таблицы. Свойства с одинаковыми значениями выделяются серым, различия — контрастным цветом. Горизонтальный скролл на мобильных.
Калькулятор trade-in
Форма оценки автомобиля клиента. Входные данные: марка, модель, год, пробег, состояние (отлично / хорошо / удовлетворительно). На клиенте — JavaScript-формула: берётся базовая стоимость из справочника (Highload-блок TradeInPrices с полями UF_BRAND, UF_MODEL, UF_YEAR, UF_BASE_PRICE), применяются коэффициенты за пробег и состояние. Результат — ориентировочная стоимость. Точная оценка — после осмотра на площадке.
Кредитный калькулятор — аннуитетная формула на JavaScript: три ползунка (стоимость автомобиля, первый взнос, срок), результат — ежемесячный платёж. Ставки хранятся в Highload-блоке «Банки-партнёры». Для лизинга — отдельная формула с остаточной стоимостью.
Интеграция с 1С и складской учёт
Дилерский сайт без актуальных остатков — бессмысленная витрина. Клиент звонит по объявлению, а машина продана вчера. Синхронизация реализуется через:
CommerceML — штатный механизм обмена Битрикса и 1С. Модуль sale поддерживает импорт каталога через /bitrix/admin/1c_exchange.php. Проблема: CommerceML спроектирован под товары с SKU, а не под автомобили с 40 свойствами. VIN, пробег, количество владельцев — нет стандартных полей. Решение — маппинг через OnBeforeCatalogImport1C или дополнительный обработчик, который парсит <ЗначениеРеквизита> из XML и заполняет свойства инфоблока.
REST API 1С — более гибкий вариант. HTTP-сервис на стороне 1С отдаёт JSON с актуальным списком автомобилей. На стороне Битрикса — агент или webhook, который раз в 15-30 минут запрашивает обновления и синхронизирует: новые автомобили создаёт, проданные деактивирует, изменённые обновляет. Сверка по VIN как уникальному ключу.
360-обзор и визуальный контент
360-обзор экстерьера — набор из 36-72 фотографий автомобиля, снятых по кругу. На фронте — JavaScript-библиотека (SpriteSpin, 360-image-viewer или кастомный скрипт на canvas), которая анимирует переключение кадров при перетаскивании мышью. Фотографии хранятся в отдельной директории /upload/cars/{ID}/360/, ссылка на директорию — в свойстве SPIN_360_URL.
Панорама салона — сферическая фотография, отображаемая через Pannellum.js или встроенный Google Street View-подобный viewer. Хранится как URL в свойстве INTERIOR_PANORAMA.
Запись на тест-драйв и сервис
Форма записи на тест-драйв: выбор автомобиля (предзаполняется, если пользователь пришёл с карточки), дата, время, имя, телефон. Данные отправляются через bitrix:form.result.new или REST API Битрикс24 (crm.lead.add с SOURCE_ID = "TEST_DRIVE", кастомное поле UF_CRM_CAR_ID). Менеджер получает уведомление в CRM, клиент — SMS-подтверждение через модуль messageservice.
Запись на сервис — аналогичная форма, но с выбором вида работ (ТО, шиномонтаж, кузовной ремонт) и предпочтительной датой. Данные → сделка в Битрикс24 с направлением «Сервис».
SEO и Schema.org для автомобилей
Каждая карточка автомобиля — посадочная страница для запроса «купить BMW X5 2024 дизель». Шаблоны SEO через настройки инфоблока:
- Title:
Купить #PROPERTY_BRAND# #PROPERTY_MODEL# #PROPERTY_YEAR# — #PROPERTY_CITY# | Дилер - Description:
#PROPERTY_BRAND# #PROPERTY_MODEL# #PROPERTY_YEAR#, #PROPERTY_ENGINE_TYPE#, #PROPERTY_TRANSMISSION#, пробег #PROPERTY_MILEAGE# км
Микроразметка Schema.org Vehicle + Offer:
{
"@context": "https://schema.org",
"@type": "Vehicle",
"name": "BMW X5 xDrive30d",
"brand": {"@type": "Brand", "name": "BMW"},
"model": "X5",
"vehicleModelDate": "2024",
"mileageFromOdometer": {
"@type": "QuantitativeValue",
"value": "0",
"unitCode": "KMT"
},
"fuelType": "Diesel",
"vehicleTransmission": "Automatic",
"color": "Black",
"vehicleIdentificationNumber": "WBAJC51090B123456",
"image": ["https://site.ru/upload/cars/12345/photo1.jpg"],
"offers": {
"@type": "Offer",
"price": "7890000",
"priceCurrency": "RUB",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "AutoDealer",
"name": "Название дилера"
}
}
}
Google распознаёт Vehicle и может показать карточку в расширенных результатах с фотографией, ценой, пробегом.
Этапы и сроки
- Аналитика, прототипирование (1-2 недели) — структура каталога, дерево марок-моделей, прототипы Figma
- Дизайн (2-3 недели) — каталог, карточка, фильтры, мобильная версия
- Разработка ядра (3-5 недель) — инфоблоки, Highload-справочники, каскадный фильтр, карточка автомобиля
- Интеграции (2-4 недели) — XML-фиды, 1С-обмен, CRM, калькуляторы
- Визуальный контент (1-2 недели) — 360-обзор, панорамы, галерея
- Тестирование, SEO (1-2 недели) — валидация фидов, Schema.org, нагрузочное тестирование
- Запуск (3-5 дней) — деплой, импорт каталога, мониторинг фидов
| Масштаб | Сроки |
|---|---|
| Монобрендовый дилер, до 200 авто, базовый фильтр | 6-8 недель |
| Мультибрендовый дилер, 500-2000 авто, фиды + 1С | 10-14 недель |
| Дилерская сеть, 3000+ авто, мультисайтовость, CRM | 14-24 недели |
Сроки не включают фотосъёмку автомобилей и подготовку 360-контента — это параллельный процесс, который стартует на этапе разработки.







