Обновление свойств и количества товаров в корзине Bitrix через Sale API
В современной разработке на платформе 1С-Битрикс любые манипуляции с корзиной покупателя должны выполняться исключительно через объектно-ориентированное API модуля «Интернет-магазин» (sale). Распространенной ошибкой среди начинающих разработчиков является попытка прямого изменения записей в таблице базы данных b_sale_basket или использование устаревших методов глобального класса CSaleBasket. Такой подход крайне опасен, поскольку он не инициирует сложную цепочку внутренних бизнес-процессов ядра: автоматический пересчет правил корзины, применение скидок, расчет налогов и актуализацию стоимости доставки. В результате данные в корзине становятся некорректными, что ведет к финансовым потерям и сбоям при оформлении заказа.
Для правильного и безопасного обновления данных необходимо работать с высокоуровневыми объектами корзины. Ключевым инструментом в данном контексте выступает класс Bitrix\Sale\Basket. Загрузка объектов обычно осуществляется через статический метод loadItemsForFUser, который принимает идентификатор владельца корзины (FUser ID) и идентификатор сайта. Это позволяет получить актуальный объект корзины со всеми вложенными элементами, даже если заказ еще не начал оформляться. После того как корзина загружена, вы можете получить доступ к конкретному элементу Bitrix\Sale\BasketItem, используя его внутренний идентификатор или выполнив поиск по PRODUCT_ID.
Объект BasketItem предоставляет набор методов для управления полями записи. Например, метод setField('QUANTITY', $value) позволяет изменить количество товара, а работа с кастомными характеристиками товара осуществляется через специальную коллекцию свойств, доступную через метод getPropertyCollection(). Это критически важно для товаров с торговыми предложениями или индивидуальными параметрами, которые выбирает пользователь.
Пример реализации кода для обновления параметров товара в корзине:
use Bitrix\Main\Loader;
use Bitrix\Sale\Basket;
use Bitrix\Sale\Fuser;
use Bitrix\Main\Context;
// Обязательная проверка подключения модуля sale
if (Loader::includeModule('sale')) {
// Получаем внутренний идентификатор корзины текущего пользователя
$fUserId = Fuser::getId();
$siteId = Context::getCurrent()->getSite();
// Загружаем объект корзины со всеми товарами
$basket = Basket::loadItemsForFUser($fUserId, $siteId);
// Поиск конкретного элемента корзины по ID товара (PRODUCT_ID)
// В реальных задачах ID часто передается через AJAX-запрос
$productId = 201;
$basketItems = $basket->getExistsItems('catalog', $productId, null); // здесь null - если нам не важны свойства товара, например, размер
if (!empty($basketItems)) {
// Берем первый найденный элемент
$basketItem = current($basketItems);
// 1. Изменение количества товара с автоматической проверкой доступности
$basketItem->setField('QUANTITY', 5);
// 2. Управление коллекцией свойств товара (например, цвет или размер)
$propertyCollection = $basketItem->getPropertyCollection();
// Метод setProperty позволяет массово обновить или добавить свойства
$propertyCollection->setProperty([
[
'NAME' => 'Размер',
'CODE' => 'SIZE',
'VALUE' => 'XL',
'SORT' => 100,
],
]);
// 3. Вызов метода save() сохраняет изменения в БД и запускает пересчеты
$saveResult = $basket->save();
if (!$saveResult->isSuccess()) {
// В случае ошибки возвращаем массив описаний проблем
$errors = $saveResult->getErrorMessages();
// Логирование ошибок или вывод пользователю
}
}
}
Важно учитывать контекст выполнения: если объект корзины уже является частью объекта заказа (Bitrix\Sale\Order), то вызывать метод save() непосредственно у корзины не рекомендуется. В этом случае правильнее вызвать сохранение всего заказа через $order->save(). Это гарантирует, что итоговая сумма заказа, налоги и все связанные сущности (отгрузки, оплаты) будут синхронизированы и пересчитаны в рамках одной транзакции.
Использование объектной модели BasketItem — это стандарт качественной разработки, который обеспечивает масштабируемость и стабильность вашего решения при любых обновлениях платформы.