«Повторить заказ» — это возможность одним кликом перенести состав ранее оформленного заказа в текущую корзину покупателя. Для B2B и товаров регулярного спроса функция заметно сокращает путь до повторной покупки, но за простой кнопкой стоит логика копирования корзины, проверки доступности и пересчёта цен.
Что такое повтор заказа и кому он нужен
Повтор заказа — типовой сценарий личного кабинета, при котором покупатель берёт готовый список позиций из истории и складывает его в корзину, не собирая товары заново. Для оптовиков, HoReCa, расходников и подписочных категорий это ключевой инструмент удержания: клиент заказывает одно и то же по циклу, и лишние шаги напрямую бьют по конверсии.
В 1С-Битрикс функция реализована штатно внутри компонентов личного кабинета и не требует стороннего решения. Важно понимать: повтор — это копирование состава (товары и количества), а не клонирование самого заказа. Новый заказ покупатель оформляет заново — с актуальными ценами, доставкой и оплатой на момент повтора.
Где живёт функция: компоненты кабинета
За историю заказов и повтор отвечают компоненты из модуля sale:
bitrix:sale.personal.order.list— список «Мои заказы» с кнопкой повтора у каждой строки;bitrix:sale.personal.order.detail— детальная страница заказа, где повтор доступен целиком по заказу;bitrix:sale.personal.order— комплексный компонент, который объединяет список и детальную и раздаёт им общие пути.
В штатных решениях (например, «Аспро», типовой eShop) эти компоненты уже подключены в разделе /personal/order/. Кнопка повтора формирует ссылку на ту же страницу с параметром действия — обычно это ?ID=<order_id>©_ORDER=Y, после чего компонент обрабатывает запрос и перенаправляет покупателя в корзину.
Как работает механизм повтора
При переходе по ссылке повтора компонент личного кабинета загружает исходный заказ через объектную модель заказа (\Bitrix\Sale\Order::load()), проходит по его корзине и добавляет каждую позицию в корзину текущего пользователя. Ключевой нюанс: товары добавляются по идентификатору, а не переносятся «как есть».
- Компонент получает список товаров и количеств исходного заказа.
- По каждому
PRODUCT_IDзаново запрашиваются актуальные данные каталога — цена, скидки, доступность. - Позиция кладётся в корзину покупателя (через API корзины
\Bitrix\Sale\Basket). - Пользователь редиректится на страницу корзины (
PATH_TO_BASKET) с уже наполненным составом.
Недоступные товары, остатки и торговые предложения
Самая частая причина жалоб на повтор — «часть товаров пропала». Так и задумано: если позиция снята с публикации, деактивирована или списана со склада при включённом контроле остатков, компонент её пропускает, чтобы не сформировать некорректную корзину.
| Ситуация | Поведение при повторе |
|---|---|
| Товар деактивирован / снят с публикации | Позиция не добавляется |
Нет на складе (при Разрешить оформление при отсутствии = Нет) | Пропуск или добавление в нулевом количестве |
| Торговое предложение (SKU) удалено | Пропуск конкретного предложения |
| Изменилась цена | Добавляется по актуальной цене |
Для товаров с торговыми предложениями повтор оперирует конкретным OFFER_ID. Если у SKU менялась структура (пересобрали свойства, переиндексировали), старый идентификатор может не найтись — тогда позицию тоже пропустят. Поэтому важно предупреждать покупателя сообщением о том, что часть позиций недоступна, а не молча наполнять корзину.
Настройка кнопки и путей
Кнопка повтора управляется параметрами компонента и его шаблоном. Проверьте в первую очередь пути навигации:
PATH_TO_BASKET— куда редиректить после копирования (обычно/personal/cart/);PATH_TO_ORDER/PATH_TO_DETAIL— страница детального заказа;- в комплексном компоненте пути раздаются автоматически, в отдельных — задаются вручную.
Сама кнопка живёт в шаблоне sale.personal.order.list и рисуется через ссылку с COPY_ORDER=Y. Если её нужно скрыть для отдельных статусов заказа или показать только оплаченным клиентам — это делается в шаблоне на основе данных $arResult (статус, оплата). Не редактируйте оригинальный шаблон компонента: скопируйте его в /local/templates/ и правьте копию, чтобы не потерять изменения при обновлении.
Свой повтор через API корзины (D7)
Когда нужен нестандартный сценарий — повтор с кнопки в другом месте, AJAX-добавление без ухода со страницы, свои проверки прав — реализуйте логику на API. Базовый приём: загрузить заказ, взять его корзину и наполнить корзину текущего пользователя.
Ключевые классы — \Bitrix\Sale\Order для загрузки исходного заказа и \Bitrix\Sale\Basket для текущей корзины. По каждой позиции вызывается добавление товара с проверкой доступности через Catalog и последующим $basket->save().
USER_ID), иначе получите доступ к чужой истории. Компонент делает это сам, а вот кастомный обработчик легко забыть защитить.AJAX-повтор удобно завернуть в контроллер на \Bitrix\Main\Engine\Controller и дергать через BX.ajax.runComponentAction или /bitrix/services/main/ajax.php — так корзина обновляется без перезагрузки, а мини-корзина в шапке подхватывает новые позиции.
Диагностика типовых проблем
Если повтор «не работает», обычно виноват один из предсказуемых пунктов:
- Кнопка не появляется — правится не тот шаблон (системный вместо
/local/) или не переданы пути в компонент. - Корзина пустая после повтора — все позиции оказались недоступны (снятие с публикации, остатки), проверьте товары исходного заказа.
- Дублирование позиций — товар уже был в корзине; по умолчанию количество суммируется, что иногда воспринимают как баг.
- Пропадают торговые предложения — рассинхрон каталога с 1С, изменились ID офферов после обмена.
- Другая сумма — сработал актуальный пересчёт цен и скидок, это ожидаемо.
Для отладки включите обработку ошибок и смотрите, что возвращает добавление в корзину: методы API отдают Result с массивом ошибок по каждой позиции. Именно там видно, почему конкретный товар не попал в корзину.
Итог
Повтор заказа в 1С-Битрикс — это штатная функция компонентов sale.personal.order, которая копирует состав прошлого заказа в текущую корзину по идентификаторам товаров, с актуальными ценами и проверкой доступности. Настройка сводится к корректным путям и аккуратной правке шаблона в /local/, а сложные сценарии закрываются API корзины на D7.
Если нужно довести повтор до безупречного UX — с понятными сообщениями о недоступных позициях, AJAX без перезагрузки и синхронизацией остатков через обмен с 1С, — мы в B2Bsite проектируем и дорабатываем личный кабинет под конкретную модель продаж, чтобы повторная покупка занимала минимум кликов и не спотыкалась о рассинхрон каталога.
Частые вопросы
Повтор создаёт новый заказ автоматически?
Нет. Функция только наполняет корзину составом прошлого заказа. Оформление покупатель проходит заново — с выбором доставки, оплаты и подтверждением.
Почему после повтора сумма отличается от исходной?
Цены и скидки берутся на момент повтора, а не из старого заказа. Если товар подорожал или закончилась акция, сумма пересчитывается по актуальным данным каталога.
Куда пропадают некоторые товары при повторе?
Пропускаются позиции, снятые с публикации, деактивированные или отсутствующие на складе при запрете оформления без остатка. Так корзина не наполняется недоступными товарами.
Какие компоненты отвечают за повтор заказа?
Компоненты модуля sale: sale.personal.order.list и sale.personal.order.detail, а также комплексный sale.personal.order. Кнопка повтора формирует ссылку с параметром COPY_ORDER=Y.
Можно ли сделать повтор без перезагрузки страницы?
Да, через AJAX-контроллер на базе Engine\Controller и API корзины Bitrix\Sale\Basket. Тогда позиции добавляются в фоне, а мини-корзина в шапке обновляется сразу.
Как скрыть кнопку повтора для некоторых заказов?
Логика выводится в шаблоне компонента на основе данных заказа — статуса и оплаты. Правьте копию шаблона в /local/templates/, а не системный файл.
Повтор работает с товарами, у которых есть торговые предложения?
Да, повтор оперирует конкретным идентификатором предложения. Но если структура SKU менялась после обмена с 1С и старый ID не найден, такую позицию пропустят.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.