Перейти к содержимому

Не работает оформление заказа - корзина есть, а на оформлении пусто

В корзине товары есть, а страница оформления показывает пустоту или не открывается вовсе.

Как проверить

Смотрим, что лежит в корзине покупателя:

$basket = Bitrix\Sale\Basket::loadItemsForFUser(
Bitrix\Sale\Fuser::getId(),
Bitrix\Main\Context::getCurrent()->getSite()
);
foreach ($basket as $item) {
printf("%-28s кол=%s сайт=%s заказ=%s можно_купить=%s\n",
$item->getField('NAME'), $item->getQuantity(),
$item->getField('LID'), $item->getField('ORDER_ID') ?: '-',
$item->canBuy() ? 'да' : 'нет');
}

Три поля решают почти всё. Непустой ORDER_ID означает, что строка уже ушла в заказ, чужой LID - что корзина принадлежит другому сайту, а canBuy показывает позиции, которые оформление отбросит.

Смотрим ошибки шаблона оформления:

Окно терминала
tail -n 60 /home/bitrix/www/bitrix/php_interface/dbconn_error.log 2>/dev/null
grep -i 'order.ajax\|sale.order' /var/log/nginx/error.log | tail -20

Белый экран на оформлении почти всегда даёт ошибка PHP в шаблоне, а не логика модуля. В логе она видна с именем файла и строкой.

Проверяем типы плательщиков сайта:

$types = CSalePersonType::GetList([], ['LID' => $siteId, 'ACTIVE' => 'Y']);
while ($type = $types->Fetch()) {
printf("%-3d %-24s сайт=%s\n", $type['ID'], $type['NAME'], $type['LID']);
}

Пустой список означает, что форма оформления соберётся без свойств, доставки и оплаты: собирать их не для кого.

Причины

  1. Корзина принадлежит другому сайту примерно 35% случаев

    ПризнакПозиции есть в базе, но страница оформления пуста, и так на мультисайте или после смены домена.

    ПроверкаСверяем поле LID у позиций корзины с идентификатором текущего сайта.

    Что делатьЗагружаем корзину с явным идентификатором сайта и переносим позиции, если домен менялся.

  2. Товар стал недоступен для покупки примерно 30% случаев

    ПризнакЧасть позиций пропадает на оформлении, остальные проходят.

    ПроверкаЧитаем canBuy у каждой позиции: активность товара, остаток, права группы на покупку.

    Что делатьВозвращаем товару активность и остаток либо убираем позицию из корзины с понятным сообщением.

  3. Не задан тип плательщика примерно 20% случаев

    ПризнакСтраница открывается, но форма пустая: ни свойств, ни доставки, ни оплаты.

    ПроверкаПроверяем, что для сайта заведён хотя бы один тип плательщика и он активен.

    Что делатьЗаводим тип плательщика и привязываем к нему свойства, службы доставки и платёжные системы.

  4. Ошибка в шаблоне оформления примерно 15% случаев

    ПризнакБелый экран или обрыв вёрстки на середине страницы.

    ПроверкаСмотрим лог ошибок PHP и временно включаем вывод ошибок на копии сайта.

    Что делатьПравим шаблон в своей копии компонента, а не в /bitrix/: правки ядра снесёт обновление.

Если ничего не помогло

Чистим корзину от строк, уехавших в заказ:

foreach ($basket as $item) {
if ($item->getField('ORDER_ID')) {
$item->delete(); // строка принадлежит заказу, в корзине ей не место
}
}
$basket->save();

Такие строки остаются после неудачного оформления: корзина видна в шапке, а на оформлении пуста. Удаление безопасно, сам заказ свои позиции не теряет.

Пробуем оформление на штатном шаблоне:

$APPLICATION->IncludeComponent('bitrix:sale.order.ajax', '', [
'PERSON_TYPE' => [], // пусто означает все активные типы
'ALLOW_AUTO_REGISTER' => 'Y',
]);

Пустой шаблон компонента подключает штатный. Если на нём оформление проходит, дело в своей копии, и разбирать надо её. Если не проходит и там, проблема в данных: корзине, товарах или настройках модуля продаж.

Частые вопросы

В корзине товары есть, а в оформлении нет. Куда они делись?

Скорее всего у позиций непустой ORDER_ID: они уже привязаны к созданному ранее заказу. Такое случается, когда заказ создавался из живой корзины покупателя, а не из новой.

Как проверить наличие товара при оформлении?

Метод canBuy у позиции уже учитывает активность, остаток и права. Своя проверка нужна только для нестандартных правил, и её вешают на событие проверки заказа.

Можно ли пересобрать корзину в момент оформления?

Да, но осторожно: пересборка меняет идентификаторы позиций, а форма оформления к ним привязана. Обычно достаточно обновить количество и цены, а не создавать позиции заново.

Почему кнопка оформления не ведёт дальше?

Чаще всего ошибка JavaScript на странице корзины: обработчик кнопки не отработал. Смотрят консоль браузера, а не логи сервера - до сервера запрос не дошёл.

Смежное

Первоисточник