Корзина и оформление заказа на 1С-Битрикс
Почему sale.order.ajax — главный враг конверсии
Штатный sale.order.ajax — компонент, который Битрикс предлагает для оформления заказа. Многошаговый: доставка → оплата → подтверждение. На каждом переходе теряется 10-15% пользователей. Три шага — и треть покупателей, которые уже положили товар в корзину, ушли. Не потому что передумали — потому что интерфейс спотыкнулся.
А ещё sale.order.ajax кидает 500-ку, если не настроен хотя бы один обработчик доставки. Или виснет на 15 секунд при расчёте СДЭК, потому что запрос к API синхронный и без таймаута. Или требует ИНН у физлица, потому что свойство заказа не разделено по типу плательщика. Каждый такой кейс — прямые потери.
Мы переделываем чекаут с одним фокусом — конверсия. Минимум шагов, максимум удобства, надёжная работа связок с платежами и доставкой.
Одношаговый чекаут: всё на одном экране
Все поля на одной странице. Логичная группировка, никаких лишних переходов.
- Контактные данные — имя, телефон, email. Три поля. Не пять, не десять, не «укажите дату рождения для программы лояльности»
- Доставка — выбрал город → увидел способы с ценами и сроками. AJAX-расчёт через API СДЭК, Boxberry, Почты России. Запросы параллельные с таймаутом 3 секунды — если один API завис, остальные покажутся
- Оплата — способы фильтруются по выбранной доставке. Наложенный платёж при самовывозе? Не показываем
- Промокод — поле видно, проверка мгновенная, скидка отображается в итоге сразу
- Итого — динамический пересчёт при любом изменении. Поменял количество → сумма → стоимость доставки → итого. Без перезагрузки страницы
Под капотом
- Полный AJAX — ни одной перезагрузки. Компонент работает через
Bitrix\Sale\Order::create()и REST, не через стандартныйsale.order.ajax - Валидация в реальном времени: не «заполните поле правильно», а «номер телефона: +7 (__) --». Маска
inputmask+ серверная проверка - Сохранение данных при случайном уходе —
sessionStorageхранит введённое, при возврате всё на месте - Автозаполнение адреса через DaData: начал вводить улицу → полный адрес с индексом, FIAS-кодом и координатами. Меньше ошибок на стороне курьерской службы
- Поддержка свойств заказа по типу плательщика — физлицо видит одни поля, юрлицо — другие. Переключатель в форме
Гостевой заказ: убить обязательную регистрацию
«Хочу купить USB-кабель за 300 рублей, а меня просят придумать пароль из 8 символов с заглавной буквой и спецсимволом». Обязательная регистрация убивает 25-30% конверсии на мелких заказах.
- Покупка без аккаунта — оформляем через
CSaleUser::GetAnonymousUserID()или создаём пользователя автоматически с рандомным паролем - После оформления — письмо с данными для входа. Хочет — активирует аккаунт, не хочет — и так получит заказ
- Повторный визит — определяем по email или телефону, привязываем к существующему аккаунту
- Авторизация прямо в чекауте: SMS-код вместо пароля — через
Bitrix\Main\Authentication\ShortCodeили интеграцию с SMS-гейтом
Кросс-селл: допродажи, которые не раздражают
В корзине
Рекомендации на основе реальных данных из b_sale_basket — «с этим товаром покупали» на базе ассоциативных правил, а не рандомных товаров.
- Аксессуары: к телефону — чехол и защитное стекло. Привязка через свойство инфоблока
PROPERTY_ACCESSORIES - Оптовая мотивация: «Возьмите 3 — сэкономьте 15%». Реализуется через правила корзины в
b_sale_discount - Порог бесплатной доставки: «Добавьте на 500 руб. — доставка бесплатно». Простой виджет, но увеличивает средний чек на 10-20%
Управление через админку
Менеджер привязывает рекомендуемые товары вручную или включает автоматические алгоритмы. Правила отображения: категория, диапазон цен, наличие. A/B-тестирование разных стратегий — без разработчика.
Брошенные корзины: возвращаем 15-20% ушедших
Сохранение
- Авторизованные — корзина в
b_sale_basket, доступна с любого устройства - Гости — cookie с TTL 30 дней.
FUSER_IDпривязан к cookie, корзина не пропадёт через час - Синхронизация: добавил с телефона, оформил с ноутбука — корзина единая
Возврат
- Email-серия: 3 письма. Через 1 час — напоминание. Через 24 часа — «ваш товар заканчивается». Через 72 часа — персональный промокод на 5-10%. Через
sale.basketcomponent+CEvent::Send()с отложенной отправкой через агенты - Push-уведомления через браузер —
Notification API, подписка через сервис-воркер - Ретаргетинг — данные о корзине уходят в Яндекс.Директ через eCommerce-события
Аналитика отказов
На каком шаге уходят? Если на выборе доставки — цена доставки шокирует. Если на оплате — карта отклоняется, 3D-Secure не проходит. Ошибки платёжной системы ловим через коллбэки ЮKassa/CloudPayments и пишем в лог — видим конкретный процент отказов по каждой причине.
Промокоды: правильная реализация
| Тип | Механизм в Битрикс | Нюанс |
|---|---|---|
| Фиксированная скидка | CSaleDiscount, тип «на заказ» |
Не забыть ограничить минимальную сумму — иначе скидка 500₽ при заказе на 300₽ |
| Процентная | CSaleDiscount, условие «купон» |
Максимальная скидка — задать потолок, иначе при заказе на 500К скидка 50% = 250К |
| Бесплатная доставка | Правило корзины + привязка к службе доставки | Работает только с конкретными службами — нельзя дать бесплатную «любую» |
| Подарок | Автодобавление товара в корзину через обработчик | Товар-подарок должен быть в наличии, иначе корзина сломается |
UX промокода:
- Поле видно, но не кричит — не отвлекает тех, у кого кода нет
- Мгновенная проверка: «Промокод истёк» / «Минимальная сумма 3000₽» — а не «Error 422»
- Скидка видна в итоговом расчёте отдельной строкой
- Можно убрать промокод и применить другой
UX-оптимизация: мелочи, которые решают
Десктоп:
- Прогресс-бар — пользователь видит, где он
- Умные дефолты — самый популярный способ доставки уже выбран (определяем по статистике
b_sale_order) - Минимум обязательных полей — только то, без чего нельзя отправить заказ. Отчество? Необязательно. Комментарий? Необязательно
- Пересчёт без лоадеров на 5 секунд — debounce 300ms на AJAX-запросах
Мобильные:
- Крупные кнопки — палец не промахивается.
min-height: 48pxпо гайдам Google - Правильные типы клавиатуры:
type="tel"для телефона,inputmode="numeric"для количества - Кнопка «Оформить» зафиксирована внизу —
position: sticky - Сворачиваемые секции — экранное пространство на 375px дорого
Обработка ошибок:
- «Проверьте номер карты» вместо «Payment processing error»
- Автопрокрутка к первой ошибке —
scrollIntoView({ behavior: 'smooth' }) - «Товар закончился» — обрабатываем в чекауте без потери заполненных данных. Предлагаем аналог или убираем из корзины с пересчётом
Интеграции
- DaData — адрес, ФИО, ИНН. Подсказки по мере ввода, валидация ФИАС
- Яндекс.Карты — выбор ПВЗ на карте, геолокация для определения города
- СДЭК, Boxberry, Почта России — API-расчёт стоимости и сроков в реальном времени
- ЮKassa, CloudPayments, Тинькофф — приём платежей, рекуррентные списания, холдирование
- CRM — заказ автоматически уходит в Битрикс24, создаётся сделка с привязкой к контакту
-
Склад — проверка остатков через
CCatalogStoreProduct::GetList()в реальном времени
Сроки
| Задача | Срок |
|---|---|
| Оптимизация текущего чекаута | 1-2 недели |
| Одношаговый чекаут с нуля | 3-5 недель |
| Система промокодов | 1-2 недели |
| Кросс-селл в корзине | 1 неделя |
| Механизм брошенных корзин | 2-3 недели |
| Комплексная переработка | 6-10 недель |
Увеличение конверсии чекаута на 1-2% при стабильном трафике — это рост выручки без роста рекламного бюджета. Самый быстрый ROI в e-commerce.







