«Купить в 1 клик» — это короткий сценарий, где покупатель оставляет только телефон и имя, а полноценный заказ в магазине создаётся программно на стороне сервера. В 1С-Битрикс для этого нет отдельного «коробочного» компонента: собирают связку из своей AJAX-формы, кода на модуле sale и уведомления менеджеру. Разберём, как сделать это правильно и без костылей.
Что такое «купить в 1 клик» и чем это не является
Быстрый заказ решает одну задачу: снять барьер оформления. Вместо многошагового sale.order.ajax покупатель видит кнопку в карточке товара, нажимает её, вводит телефон — и заказ уже в системе. Всю недостающую информацию (адрес, доставку, оплату) менеджер уточняет по телефону.
Важно не путать этот сценарий с двумя похожими механизмами Битрикса:
- Подписка на товар — компонент
catalog.product.subscribe. Он оповещает клиента, когда отсутствующий товар появится в наличии, и не создаёт заказ. Это другой сценарий, хотя его форма тоже минимальна. - Оформление без регистрации — обычный checkout, где просто не требуется логин. Заказ создаёт штатный компонент, а не ваш код.
sale. Готового компонента с таким названием в дистрибутиве нет, и это нормально.Минимальная форма: только телефон и имя
Форма должна быть предельно короткой — каждое лишнее поле снижает конверсию. Оптимальный набор:
- Телефон — единственное обязательное поле; по нему менеджер перезвонит.
- Имя — желательное, но не блокирующее.
- Скрытые поля —
PRODUCT_IDи, при необходимости,QUANTITYи код торгового предложения (SKU).
Форму выводят в шаблоне карточки и отправляют через BX.ajax.runAction или обычный fetch на свой контроллер. Обязательно прокидывайте sessid (bitrix_sessid()) и проверяйте его на сервере — это защита от CSRF. Валидацию телефона делайте и на клиенте, и на сервере: маска на фронте не заменяет серверную проверку.
PRODUCT_ID и количество, а цену и наличие берите из каталога на сервере. Иначе покупатель сможет подменить сумму в запросе.Программное создание заказа через Sale\Order
Заказ собирается объектной D7-моделью модуля продаж. Базовый каркас контроллера выглядит так:
- Подключаем модуль:
Loader::includeModule('sale')иLoader::includeModule('catalog'). - Создаём заказ:
$order = \Bitrix\Sale\Order::create($siteId, $userId);. Для анонимных заявок используют «пользователя по умолчанию» — его ID возвращает\CSaleUser::GetAnonymousUserID(). - Формируем корзину:
$basket = \Bitrix\Sale\Basket::create($siteId);, добавляем позицию через$basket->createItem('catalog', $productId)и задаёмQUANTITY. ПоляPRODUCT_PROVIDER_CLASSиMODULEобеспечивают подтягивание актуальной цены из каталога. - Привязываем корзину:
$order->setBasket($basket). - Сохраняем телефон и имя в свойства заказа через
$order->getPropertyCollection()— по кодам свойств (PHONE,FIO). - Вызываем
$order->save();и проверяем$result->isSuccess().
Пока не заданы доставка и оплата, заказ создастся в статусе черновика — это ожидаемо: их проставит менеджер. При желании можно сразу привязать «пустую» службу доставки и способ оплаты через getShipmentCollection() и getPaymentCollection(), чтобы заказ прошёл штатные обработчики.
Вывод кнопки в карточке товара
Кнопку добавляют в шаблон catalog.element (или в кастомный компонент карточки). Практичнее не хардкодить разметку, а сделать её частью шаблона bitrix/catalog.element/.default/template.php в вашем локальном решении, чтобы обновления ядра её не затирали.
Ключевые моменты вывода:
- Атрибут
data-product-id="<?= $arResult['ID'] ?>"— чтобы JS знал, что заказывать. - Для товаров с торговыми предложениями кнопка должна брать ID выбранного SKU, а не родителя. Подпишитесь на событие смены оффера в JS-объекте карточки.
- Форма открывается в модальном окне (
BX.PopupWindowManager) — так покупатель не уходит со страницы. - Кнопку прячьте, если товара нет в наличии (
CAN_BUY= N), либо заменяйте её на подпискуcatalog.product.subscribe.
Уведомление менеджеру и клиенту
После сохранения заказа менеджер должен узнать о заявке немедленно. В Битриксе для этого есть штатный механизм почтовых событий:
| Способ | Как реализовать | Когда уместно |
|---|---|---|
| Почтовое событие | \Bitrix\Main\Mail\Event::send() с новым типом события и шаблоном письма | Базовый вариант, письмо менеджеру и клиенту |
Штатное SALE_NEW_ORDER | Срабатывает автоматически при save(), если заказ создан полноценно | Когда заявка проходит как обычный заказ |
| SMS / мессенджер | Обработчик события OnSaleOrderSaved + внешний API | Когда важна скорость реакции |
Отдельно продумайте пометку таких заявок: добавьте свойство-флаг QUICK_ORDER = Y или отдельный статус, чтобы менеджер видел, что часть данных ещё не заполнена. Это сильно упрощает обработку в CRM или при выгрузке в 1С.
Подводные камни
Сценарий кажется простым, но на проде всплывают нюансы:
- Цена и валюта. Берите их через провайдер каталога, иначе в заказ попадёт цена без скидок и наценок.
- Торговые предложения. Забыли передать ID оффера — заказ уйдёт на товар-родитель, которого физически нет.
- Обмен с 1С. Черновой заказ без доставки может «сломать» выгрузку. Согласуйте с интеграцией минимальный набор полей.
- Спам и боты. Минимальная форма — лёгкая мишень. Ставьте капчу или honeypot и лимит по IP.
- Композитный кэш. Карточка часто отдаётся из композита; форму и
sessidподгружайте отдельным AJAX-запросом, иначе токен будет протухшим.
$result->isSuccess() и логируйте ошибки. Молча «проглоченный» сбой сохранения — самая частая причина потерянных заявок.Итог
«Купить в 1 клик» в 1С-Битрикс — это не компонент из коробки, а аккуратная связка: короткая AJAX-форма в карточке, серверное создание заказа через \Bitrix\Sale\Order с ценой из каталога, флаг быстрой заявки и мгновенное уведомление менеджеру. Не путайте её с подпиской catalog.product.subscribe и не доверяйте данным с фронта. Отдельного внимания требуют торговые предложения, композитный кэш и обмен с 1С.
Если нужно внедрить быстрый заказ так, чтобы он корректно выгружался в 1С и не терял заявки, мы в B2Bsite проектируем и дорабатываем такие сценарии под конкретный магазин — от формы в карточке до интеграции с CRM и учётной системой.
Частые вопросы
Есть ли в Битриксе готовый компонент «купить в 1 клик»?
Нет, отдельного коробочного компонента с таким названием в дистрибутиве нет. Сценарий собирают из своей AJAX-формы и программного создания заказа через модуль sale.
Чем catalog.product.subscribe отличается от быстрого заказа?
Компонент catalog.product.subscribe только подписывает клиента на оповещение о поступлении товара в наличие и заказ не создаёт. Быстрый заказ, наоборот, сразу формирует заявку в магазине.
Какие поля обязательны в форме быстрого заказа?
Достаточно телефона — по нему менеджер перезвонит и уточнит детали. Имя желательно, но не обязательно; остальные данные заполняются при обработке заявки.
Как создать заказ программно без регистрации покупателя?
Используйте ID анонимного пользователя, который возвращает CSaleUser::GetAnonymousUserID(), и передайте его в Order::create(). Так заявка не требует логина.
Как правильно взять цену товара при быстром заказе?
Цену нельзя брать из запроса с фронта — её подставляет провайдер каталога при добавлении позиции в корзину. С фронта передавайте только ID товара и количество.
Как уведомить менеджера о новой заявке?
Проще всего отправить почтовое событие через Bitrix\Main\Mail\Event::send или использовать штатное SALE_NEW_ORDER. Для скорости добавляют SMS или сообщение в мессенджер на обработчике OnSaleOrderSaved.
Как отличить быстрые заказы от обычных?
Заведите свойство-флаг вроде QUICK_ORDER = Y или отдельный статус заказа. Тогда менеджер сразу видит, что часть данных ещё нужно уточнить по телефону.
Что учесть при товарах с торговыми предложениями?
Кнопка должна передавать ID выбранного SKU, а не родительского товара. Иначе заказ уйдёт на элемент-родитель, которого нет на складе.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.