0
10.01.202213:4010.01.2022 13:40:18
Долго искал решение, в итоге помогла техподдержка Битрикс. Привожу их ответ здесь, может кому тоже пригодится:
Для решения вашей задачи, вы можете использовать метод "setApplyResult" (
https://dev.1c-bitrix.ru/api_d7/bitrix/sale/classes/discount/setapplyresult.php), который позволяет указать, какие из выбранных скидок и правил исключить из расчета.
CModule::IncludeModule("sale");
$order = Bitrix\Sale\Order::load(145); // 145 - id заказа
$discount=$order->getDiscount();
$discount->setApplyResult(array(
'DISCOUNT_LIST' =>
array (
"42" => 'N', // 42 - ID скидки из таблицы b_sale_order_discount
)
));
$discount->calculate();
$order->save(); |
10.01.202213:4010.01.2022 13:40:18
0
01.02.202119:1201.02.2021 19:12:08
Появилась задача пробежаться по бизнес-процессам за некоторое количество лет и получить тех, кто был за них ответственным. Ответственный хранится в переменной бизнес-процесса с названием
Approver. Гугл ничего не дал, поэтому пошёл методом проб и ошибок. Этим методом удалось выяснить следующую последовательность действий:
В первую очередь получаем полностью инициализированный объект бизнес-процесса:
\Bitrix\Main\Loader::includeModule('bizproc');
// объект среды исполнения
$runtime = CBPRuntime::GetRuntime();
// из этой среды получаем бизнес-процесс по id
// вторым параметром сообщаем, что получаем его в тихом режиме, чтобы случайно что-нибудь попутно не запустилось.
$wf = $runtime->GetWorkflow('5ebb8da25f98d5.63283030', true);
|
В объекте бизнес-процесса
$wf хранится приватная переменная
rootActivity, которая нам и нужна. Геттера в классе не предусмотрено, поэтому чтобы ее получить, используем замыкание:
$sweetsThief = function (CBPWorkflow $wf) {
return $wf->rootActivity;
};
$sweetsThief = Closure::bind($sweetsThief, null, $wf);
/** @var CBPSequentialWorkflowActivity $rootActivity */
$rootActivity = $sweetsThief($wf);
$approver = $rootActivity->GetVariable('Approver'); // Вуаля!
|
Таким же образом можно вызывать и другие методы объекта корневой активности, обычно доступные только "изнутри" бизнес-процесса. Например
GetConstant,
GetDocumentId,
GetWorkflowStatus и др. Можно вызывать и сеттеры, но за результат таких действия автор ответственности не несет!
01.02.202119:1201.02.2021 19:12:08