Разработка сайта автодилера на 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Разработка сайта автодилера на 1С-Битрикс
Сложная
от 1 недели до 3 месяцев
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1173
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    745
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Разработка сайта автодилера на 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 из их базы.

Архитектура генератора фидов:

  1. Абстрактный класс BaseFeedGenerator — выборка элементов из инфоблока через CIBlockElement::GetList, итерация, запись XML через XMLWriter.

  2. Конкретные классы: AutoRuFeedGenerator, AvitoAutoFeedGenerator, AvByFeedGenerator — переопределяют маппинг свойств в XML-теги и трансформацию значений (АКПП → AUTOMATIC для auto.ru, АКПП → «Автоматическая» для Avito).

  3. Таблица маппинга — Highload-блок FeedMapping с полями UF_PROPERTY_CODE, UF_FEED_TYPE, UF_LOCAL_VALUE, UF_FEED_VALUE. Менеджер может добавить соответствие без разработчика: «Полный привод» → ALL_WHEEL_DRIVE (auto.ru), «Полный» (Avito).

  4. Агент Битрикса (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.

  5. Валидация перед публикацией. После генерации — проверка 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. Аналитика, прототипирование (1-2 недели) — структура каталога, дерево марок-моделей, прототипы Figma
  2. Дизайн (2-3 недели) — каталог, карточка, фильтры, мобильная версия
  3. Разработка ядра (3-5 недель) — инфоблоки, Highload-справочники, каскадный фильтр, карточка автомобиля
  4. Интеграции (2-4 недели) — XML-фиды, 1С-обмен, CRM, калькуляторы
  5. Визуальный контент (1-2 недели) — 360-обзор, панорамы, галерея
  6. Тестирование, SEO (1-2 недели) — валидация фидов, Schema.org, нагрузочное тестирование
  7. Запуск (3-5 дней) — деплой, импорт каталога, мониторинг фидов
Масштаб Сроки
Монобрендовый дилер, до 200 авто, базовый фильтр 6-8 недель
Мультибрендовый дилер, 500-2000 авто, фиды + 1С 10-14 недель
Дилерская сеть, 3000+ авто, мультисайтовость, CRM 14-24 недели

Сроки не включают фотосъёмку автомобилей и подготовку 360-контента — это параллельный процесс, который стартует на этапе разработки.