Алексей, нельзя же так утром в понедельник по лбу :cry:
1. Событие вызывается ДО сохранения заказа. Это означает, что вызов $order->save приводит к абсолютно непредсказуемым результатам. В обработчике его быть не должно, save и так будет вызван. Ваша задача - передать измененные данные.
2. [QUOTE]Алексей Волков написал:
$orderEnt = $event->getParameter("ENTITY");
$arPayVals = $orderEnt->getFields()->getValues();
$order = \Bitrix\Sale\Order::load($arPayVals['ORDER_ID']);[/QUOTE]
приводит к тому, что вы получаете данные из базы, которые в общем случае уже могут отличаться, т.к. вы отслеживаете изменение только одной сущности.
3. Зачем вы дергаете обновление корзины (refreshData) и никак не пробрасываете результаты пересчета в заказа?
Правильный вариант (здесь нет проверки на ваши условия):[CODE]$payment = $event->getParameter('ENTITY');
if ($payment instanceof \Bitrix\Sale\PaymentBase)
{
$order = $payment->getOrder();
$discount = $order->getDiscount();
$discount->setApplyResult(array('DISCOUNT_LIST' => array('ТЕКУЩИЙ_ИД_СКИДКИ' => 'N'))); // скидка, которую необходимо отменить. для нескольких скидок - несколько записей
$res = $discount->calculate();
if ($res->isSuccess())
{
if (($discountData = $res->getData()) && !empty($discountData) && is_array($discountData))
{
$r = $order->applyDiscount($discountData);
}
}
}
[/CODE]ТЕКУЩИЙ_ИД_СКИДКИ берется не из b_sale_discount, а из b_sale_order_discount. Привязка к заказу этой таблицы - b_sale_order_rules
1. Событие вызывается ДО сохранения заказа. Это означает, что вызов $order->save приводит к абсолютно непредсказуемым результатам. В обработчике его быть не должно, save и так будет вызван. Ваша задача - передать измененные данные.
2. [QUOTE]Алексей Волков написал:
$orderEnt = $event->getParameter("ENTITY");
$arPayVals = $orderEnt->getFields()->getValues();
$order = \Bitrix\Sale\Order::load($arPayVals['ORDER_ID']);[/QUOTE]
приводит к тому, что вы получаете данные из базы, которые в общем случае уже могут отличаться, т.к. вы отслеживаете изменение только одной сущности.
3. Зачем вы дергаете обновление корзины (refreshData) и никак не пробрасываете результаты пересчета в заказа?
Правильный вариант (здесь нет проверки на ваши условия):[CODE]$payment = $event->getParameter('ENTITY');
if ($payment instanceof \Bitrix\Sale\PaymentBase)
{
$order = $payment->getOrder();
$discount = $order->getDiscount();
$discount->setApplyResult(array('DISCOUNT_LIST' => array('ТЕКУЩИЙ_ИД_СКИДКИ' => 'N'))); // скидка, которую необходимо отменить. для нескольких скидок - несколько записей
$res = $discount->calculate();
if ($res->isSuccess())
{
if (($discountData = $res->getData()) && !empty($discountData) && is_array($discountData))
{
$r = $order->applyDiscount($discountData);
}
}
}
[/CODE]ТЕКУЩИЙ_ИД_СКИДКИ берется не из b_sale_discount, а из b_sale_order_discount. Привязка к заказу этой таблицы - b_sale_order_rules