Документация для разработчиков

События на сохранение заказа

Все сущности сохраняются в том состоянии, в котором они есть на текущий момент, т.е. сохранение происходит на уже рассчитанном заказе. Сохранение всегда происходит через метод заказа save(). При этом сохраняется не только заказ, но и все связанные с ним сущности (оплаты и отгрузки) именно в том консистентном состоянии, которое было достигнуто путем расчетов объектов:

/** \Bitrix\Sale\Order $order */
$order = \Bitrix\Sale\Order::load(18);
$order->setField("USER_DESCRIPTION", "Доставить к подъезду");

$shipmentCollection = $order->getShipmentCollection();
/** \Bitrix\Sale\Shipment $shipment */
foreach ($shipmentCollection as $shipment)
{
    if (!$shipment->isSystem())
        $shipment->allowDelivery();
}

$order->save();

Вмешаться в процесс сохранения можно с помощью двух событий на сохранение заказа.

СобытиеОписание и параметры
OnSaleOrderBeforeSaved Происходит в самом начале процесса сохранения.

Параметры
ENTITY Объект заказа.
VALUES Старые значения полей заказа.
OnSaleOrderSaved Происходит в конце сохранения, когда заказ и все связанные сущности уже сохранены.

Параметры
ENTITY Объект заказа.
VALUES Старые значения полей заказа.
IS_NEW Принимает одно из двух значений: true - если заказ новый, false - если нет. Использование данного флага позволяет избавиться от зацикливаний при вызове сохранения заказа в событии.

Примеры

//пример использования события OnSaleOrderSaved

use Bitrix\Main; 
Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderSaved',
    'myFunction'
);

//в обработчике получаем сумму, с которой планируются некоторые действия в дальнейшем:

function myFunction(Main\Event $event)
{
    /** @var Order $order */
    $order = $event->getParameter("ENTITY");
    $oldValues = $event->getParameter("VALUES");
    $isNew = $event->getParameter("IS_NEW");

    if ($isNew)
    {
        $sum = $order->getPrice();
        // . . . 
    }
}



Пользовательские комментарии

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

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Cтанислав Захаров
P.S. чтобы применить изменения для $order
Код
//пример использования события OnSaleOrderBeforeSaved

use Bitrix\Main; 
Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderBeforeSaved',
    'myFunction'
);

//в обработчике изменим комментарий:

function myFunction(Main\Event $event)
{
    /** @var Order $order */
    $order = $event->getParameter("ENTITY");
    $order->setField('COMMENTS', 'Новый комментарий');
    $event->addResult(
            new Main\EventResult(
                Main\EventResult::SUCCESS, $order
            )
        );
}  
4
Максим Масалов
Если вам нужно изменить значения определенных свойств в заказе, но при этом в этих значениях участвуют другие свойства, то сделать это можно таким образом.
Код
use Bitrix\Main;
Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderBeforeSaved',
    'saleOrderBeforeSaved'
);


function saleOrderBeforeSaved(Main\Event $event)
{
    /** @var \Bitrix\Sale\Order $order */
    $order = $event->getParameter("ENTITY");

    /** @var \Bitrix\Sale\PropertyValueCollection $propertyCollection */
    $propertyCollection = $order->getPropertyCollection();

    $propsData = [];

    /**
     * Собираем все свойства и их значения в массив
     * @var \Bitrix\Sale\PropertyValue $propertyItem
     */
    foreach ($propertyCollection as $propertyItem) {
        if (!empty($propertyItem->getField("CODE"))) {
            $propsData[$propertyItem->getField("CODE")] = trim($propertyItem->getValue());
        }
    }

    /**
     * Перебираем свойства и изменяем нужные значения
     * @var \Bitrix\Sale\PropertyValue $propertyItem
     */
    foreach ($propertyCollection as $propertyItem) {

        switch ($propertyItem->getField("CODE")) {

            // Установка полного адреса в формате: Адрес, Город, Индекс
            case 'F_PATH':
                $val = trim($propsData['ADDRESS'] . ', ' . $propsData['CITY'] . ', ' . $propsData['ZIP']);
                $propertyItem->setField("VALUE", $val);
                break;

            // Прописываем ФИО в одно поле
            case 'F_FIO':
                $val = $propsData['FNAME'] . ' ' . $propsData['LNAME'] . ' ' . $propsData['MNAME'];
                $propertyItem->setField("VALUE", $val);
                break;

        }
    }

}
© «Битрикс», 2001-2019, «1С-Битрикс», 2019
Наверх