При разработке интернет-магазинов на Битрикс часто возникает необходимость добавить в корзину товар с ценой, отличной от указанной в каталоге. Это может потребоваться для реализации индивидуальных цен, специальных предложений или услуг с гибким ценообразованием.
Основной метод добавления товара с произвольной ценой
Для реализации этой функциональности используем параметр CUSTOM_PRICE = 'Y', который позволяет переопределить стандартную цену товара.
use Bitrix\Main\Context;
use Bitrix\Currency\CurrencyManager;
use Bitrix\Sale;
// Инициализация
$productId = 111; // ID товара
$quantity = 1; // Количество
$customPrice = 123; // Кастомная цена
try {
// Получаем текущую корзину
$basket = Sale\Basket::loadItemsForFUser(
Sale\Fuser::getId(),
Context::getCurrent()->getSite()
);
// Проверяем, есть ли уже такой товар в корзине
if ($item = $basket->getExistsItem('catalog', $productId)) {
$item->setField('QUANTITY', $item->getQuantity() + $quantity);
} else {
// Создаем новый элемент корзины
$item = $basket->createItem('catalog', $productId);
// Получаем информацию о товаре для корректного заполнения
$product = \Bitrix\Catalog\ProductTable::getById($productId)->fetch();
// Устанавливаем параметры товара
$item->setFields([
'QUANTITY' => $quantity,
'CURRENCY' => CurrencyManager::getBaseCurrency(),
'LID' => Context::getCurrent()->getSite(),
'PRICE' => $customPrice,
'CUSTOM_PRICE' => 'Y',
'NAME' => $product['NAME'] ?? 'Индивидуальное предложение',
'PRODUCT_PROVIDER_CLASS' => '\Bitrix\Catalog\Product\CatalogProvider',
'PRODUCT_ID' => $productId,
'DISCOUNT_PRICE' => 0 // Отключаем скидки для этого товара
]);
}
// Сохраняем изменения
$result = $basket->save();
if (!$result->isSuccess()) {
$errors = $result->getErrorMessages();
// Обработка ошибок сохранения
}
} catch (\Exception $e) {
// Логирование и обработка исключений
error_log($e->getMessage());
}Дополнительные возможности
1. Добавление ссылки на детальную страницу
if (!empty($product['IBLOCK_ID'])) {
$item->setField('DETAIL_PAGE_URL',
\CIBlock::GetArrayByID($product['IBLOCK_ID'], 'DETAIL_PAGE_URL'));
}2. Учет единиц измерения
if (!empty($product['MEASURE'])) {
$item->setFields([
'MEASURE_CODE' => $product['MEASURE'],
'MEASURE_NAME' => $product['MEASURE_NAME'] ?? 'шт.'
]);
}3. Использование внешних идентификаторов
if (!empty($product['EXTERNAL_ID'])) {
$item->setField('CATALOG_XML_ID', $product['EXTERNAL_ID']);
}Альтернативный подход через BasketComponentHelper
Для более простой интеграции можно использовать встроенный хелпер:
\Bitrix\Sale\BasketComponentHelper::addProductToBasket($basket, [
'PRODUCT_ID' => $productId,
'QUANTITY' => $quantity,
'CUSTOM_PRICE' => 'Y',
'PRICE' => $customPrice,
'CURRENCY' => CurrencyManager::getBaseCurrency(),
'PRODUCT_PROVIDER_CLASS' => '\Bitrix\Catalog\Product\CatalogProvider'
]);Важные замечания
-
Права доступа: Убедитесь, что текущий пользователь имеет права на добавление товаров в корзину.
-
Обработка скидок: При установке
CUSTOM_PRICE = 'Y'скидки на товар автоматически не применяются. -
Валидация данных: Всегда проверяйте входные параметры:
if (!\Bitrix\Catalog\ProductTable::getById($productId)->fetch()) { throw new \Exception('Товар не найден'); }
-
Производительность: При массовом добавлении товаров используйте пакетную обработку.
Заключение
Использование API D7 Битрикс для работы с корзиной предоставляет гибкие возможности по управлению товарами и ценами. Представленный подход особенно полезен для реализации нестандартных сценариев работы с корзиной, таких как индивидуальные цены для клиентов или специальные предложения.
Для более сложных интеграций рекомендуется изучить официальную документацию Битрикс и учитывать особенности конкретной конфигурации магазина.