Для того, чтобы дать скидку на произвольную сумму в момент оформления заказа в 1C-Bitrix, не затрагивая остальные скидки, можно воспользоваться следующим алгоритмом:
1. Создайте пользовательское поле в настройках свойств заказа, где будет храниться значение скидки на произвольную сумму. Например, назовите его "Скидка на произвольную сумму". Важно, чтобы поле имело тип "число" и было доступно для редактирования в момент оформления заказа.
2. В файле обработчика события "OnOrderAdd" добавьте следующий код:
AddEventHandler("sale", "OnOrderAdd", "MyOnOrderAddHandler"); function MyOnOrderAddHandler($orderId, $arFields) { // Получаем сумму скидки на произвольную сумму из свойств заказа $discountAmount = $arFields["PROPERTY_VALUES"]["Скидка на произвольную сумму"]; // Если сумма скидки на произвольную сумму больше 0, применяем ее к заказу if ($discountAmount > 0) { // Получаем текущую корзину $basket = BitrixSaleBasket::loadItemsForOrder($orderId); // Создаем новую скидку на произвольную сумму $discount = new BitrixSaleDiscount(); $discount->setOrder($basket->getOrder()); $discount->setSaveApplied(true); // сохраняем примененные скидки // Добавляем правило скидки на произвольную сумму $rule = new BitrixSaleDiscountActionsApplyBasketDiscount(array( 'VALUE' => -$discountAmount, 'CURRENCY' => $basket->getCurrency(), 'MAX_VALUE' => 0, 'UNIT' => 'P' )); $discount->addRule($rule); // Применяем скидку $discount->calculate(); } }
В данном коде мы создаем обработчик события "OnOrderAdd", который срабатывает после создания заказа. В этом обработчике мы получаем значение скидки на произвольную сумму из свойств заказа и, если оно больше 0, создаем и применяем к заказу новую скидку с помощью класса BitrixSaleDiscount.
3. После добавления обновленного кода в обработчик события "OnOrderAdd" сохраните файл и проверьте работу на практике. Теперь, при оформлении заказа, если указана скидка на произвольную сумму, она будет применена к заказу без затрагивания других скидок.