Как дать скидку на произвольную сумму в момент оформления заказа, чтобы не затронуть остальные скидки?

Для того, чтобы дать скидку на произвольную сумму в момент оформления заказа в 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" сохраните файл и проверьте работу на практике. Теперь, при оформлении заказа, если указана скидка на произвольную сумму, она будет применена к заказу без затрагивания других скидок.