В данной статье мы рассмотрим основные приемы работы с корзиной интернет-магазина на платформе 1С-Битрикс. Мы охватим создание корзины, добавление товаров, изменение позиций, работу с ценами и скидками, а также удаление элементов из корзины.

Важные замечания
Перед тем как начать работу с методами, стоит обратить внимание на несколько важных моментов:
- Запрещено использовать метод `\Bitrix\Sale\Basket::save()` при работе с корзиной, если она привязана к заказу. Это может привести к несанкционированному изменению связанных сущностей (например, оплаты или отгрузки). Вместо этого используйте метод сохранения через заказ: `\Bitrix\Sale\Order::save()`. В ближайших версиях Битрикс будет генерировать предупреждения уровня `E_WARNING`, если будет вызван `\Bitrix\Sale\Basket::save()` при привязке корзины к заказу.
1. Создание корзины
Для создания новой корзины в Битрикс используется метод `\Bitrix\Sale\Basket::create()`, который требует указания ID сайта, к которому будет привязана корзина.
$siteId = 's1'; // ID сайта
$basket = \Bitrix\Sale\Basket::create($siteId);
Этот метод создает пустую корзину для указанного сайта.
2. Получение корзины
Корзина может быть получена в двух случаях: когда она привязана к заказу и когда не привязана к заказу.
Корзина, не привязанная к заказу:
Для получения корзины, которая не привязана к заказу, используем метод `loadItemsForFUser()`:
$fuser = 1; // ID пользователя
$siteId = 's1'; // ID сайта
$basket = \Bitrix\Sale\Basket::loadItemsForFUser($fuser, $siteId);
Корзина, привязанная к заказу:
Если корзина привязана к заказу, то её можно получить через объект заказа:
$orderId = 123; // ID заказа
$order = \Bitrix\Sale\Order::load($orderId);
$basket = $order->getBasket();
3. Получение списка товаров из корзины
Чтобы получить список товаров, можно использовать метод `getList()`, который позволяет работать напрямую с базой данных.
Пример получения списка товаров для текущего пользователя:
$dbRes = \Bitrix\Sale\Basket::getList(
[
'select' => ['NAME', 'QUANTITY'],
'filter' => [
'=FUSER_ID' => \Bitrix\Sale\Fuser::getId(),
'=ORDER_ID' => null,
'=LID' => \Bitrix\Main\Context::getCurrent()->getSite(),
'=CAN_BUY' => 'Y',
]
]
);
while ($item = $dbRes->fetch()) {
var_dump($item);
}
4. Получение веса и стоимости корзины
Чтобы получить информацию о весе и стоимости корзины, можно использовать следующие методы:
- Вес корзины:
$basket->getWeight();
$basket->getBasePrice();
$price = $basket->getPrice();
Если корзина не привязана к заказу и необходимо учитывать скидки, используйте следующий подход:
$basket = \Bitrix\Sale\Basket::loadItemsForFUser($fuser, $siteId);
$context = new \Bitrix\Sale\Discount\Context\Fuser($basket->getFUserId());
$discounts = \Bitrix\Sale\Discount::buildFromBasket($basket, $context);
$r = $discounts->calculate();
if (!$r->isSuccess()) {
var_dump($r->getErrorMessages());
}
$result = $r->getData();
if (isset($result['BASKET_ITEMS'])) {
$r = $basket->applyDiscount($result['BASKET_ITEMS']);
if (!$r->isSuccess()) {
var_dump($r->getErrorMessages());
}
}
5. Добавление товара в корзину
Существует несколько вариантов добавления товара в корзину:
Вариант 1:
$basketItem = $basket->createItem($moduleId, $productId);
$basketItem->setField('QUANTITY', 4);
Вариант 2:
$basketItem = \Bitrix\Sale\BasketItem::create($basket, $moduleId, $productId);
$basketItem->setField('QUANTITY', 4);
$basket->addItem($basketItem);
6. Получение позиции корзины
Позицию корзины можно получить по её ID, коду или индексу.
- По ID:
$basketItem = $basket->getItemById($id);
$basketItem = $basket->getItemByBasketCode($itemCode);
$basketItem = $basket->getItemByIndex($index);
7. Изменение позиции корзины
Можно изменять как отдельные поля, так и целые группы полей.
Изменение одного поля:
Если корзина не привязана к заказу:
$basket = \Bitrix\Sale\Basket::loadItemsForFUser($fuser, $siteId);
$basketItem = $basket->getItemById($basketItemId);
if ($basketItem) {
$basketItem->setField('FIELD_NAME', $value);
}
$basket->save();
Если корзина привязана к заказу:
$order = \Bitrix\Sale\Order::load(123);
$basket = $order->getBasket();
$basketItem = $basket->getItemById(1);
if ($basketItem) {
$basketItem->setField('FIELD_NAME', $value);
}
$order->save();
Изменение группы полей:
Если корзина не привязана к заказу:
$basket = \Bitrix\Sale\Basket::loadItemsForFUser($fuser, $siteId);
$basketItem = $basket->getItemById($basketItemId);
if ($basketItem) {
$basketItem->setFields([
'FIELD_NAME_1' => $value,
'FIELD_NAME_2' => $value,
]);
}
$basket->save();
Если корзина привязана к заказу:
$order = \Bitrix\Sale\Order::load(123);
$basket = $order->getBasket();
$basketItem = $basket->getItemById(1);
if ($basketItem) {
$basketItem->setFields([
'FIELD_NAME_1' => $value,
'FIELD_NAME_2' => $value,
]);
}
$order->save();
8. Удаление товара из корзины
Удалить товар из корзины можно как при привязке корзины к заказу, так и без неё.
Если корзина привязана к заказу:
$order = \Bitrix\Sale\Order::load(123);
$basket = $order->getBasket();
$basketItem = $basket->getItemById(1);
if ($basketItem) {
$basketItem->delete();
}
$order->save();
Если корзина не привязана к заказу:
$basket = \Bitrix\Sale\Basket::loadItemsForFUser($fuser, SITE_ID);
$basketItem = $basket->getItemById($basketItemId);
$result = $basketItem->delete();
if ($result->isSuccess()) {
$basket->save();
}
Заключение
Работа с корзиной в Битрикс D7 предоставляет множество возможностей для реализации функционала интернет-магазина. Важно помнить о правильном подходе к сохранению данных и работе с заказами. Надеемся, что это руководство поможет вам эффективно использовать методы работы с корзиной и заказами в Битрикс.