События перед записью поля "Доступное количество"

События позволяют менять поля товара после полного рассчета остатков для него. В модуле используется для смены поля QUANTITY у товара. Фактически результат события записывается в товар следущим методом:

\Bitrix\Catalog\Model\Product::update($productId, $arUpdateProductFields);

[OnBeforeUpdateProductInStockRow] Для вкладки "Остатки"

Это событие стоит применять если используете вкладки "Остатки"

\Bitrix\Main\EventManager::getInstance()->addEventHandler( 
    'rbs.moyskladstocks',
    'OnBeforeUpdateProductInStockRow',
    'OnBeforeUpdateProductInStockRowHandler'
);

function OnBeforeUpdateProductInStockRowHandler(\Bitrix\Main\Event $event)
{
    $eventParams = $event->getParameters();

    $arUpdateProductFields = $eventParams['arUpdateProductFields']; //поля товара, можно изменять любые поля, но модуль здесь передает только рассчитанное доступное количество
    
    $productId= $eventParams['productBx']; //передается ID товара
    $currentStocks= $eventParams['currentStocks']; //передаются текущие остатки ДО изменения, ключи массива -- это ID склада
    $productInfoStocks= $eventParams['productInfoStocks']; //передается полный массив данных которые влияют на изменения остатков, ниже описаны ключи массива
    
            $msStocks = $productInfoStocks['MS_STOCKS']; //актуальные остатки из МС 
            $bxQuantity = $productInfoStocks['BX_QUANTITY']; //поле "доступное количество" ДО изменения
            $bxStocks = $productInfoStocks['BX_STOCKS']; //тоже самое что и в $currentStocks (для совместимости)
    
    

     //возвращаем SUCCESS если нужно поменять массив полей товара, этот массив замениться тем, что передает модуль в товар
     return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arUpdateProductFields);
}

[OnBeforeUpdateProductInCurrentStockRow] для вкладки "Быстрые остатки"

Событие полностью аналогично событию выше, но работает при передаче быстрых остатков

\Bitrix\Main\EventManager::getInstance()->addEventHandler( 
    'rbs.moyskladstocks',
    'OnBeforeUpdateProductInCurrentStockRow',
    'OnBeforeUpdateProductInCurrentStockRowHandler'
);

function OnBeforeUpdateProductInCurrentStockRowHandler(\Bitrix\Main\Event $event)
{
    $eventParams = $event->getParameters();

    $arUpdateProductFields = $eventParams['arUpdateProductFields']; //поля товара, можно изменять любые поля, но модуль здесь передает только рассчитанное доступное количество
    
    $productId= $eventParams['productBx']; //передается ID товара
    $currentStocks= $eventParams['currentStocks']; //передаются текущие остатки ДО изменения, ключи массива -- это ID склада
    $productInfoStocks= $eventParams['productInfoStocks']; //передается полный массив данных которые влияют на изменения остатков, ниже описаны ключи массива
    
            $msStocks = $productInfoStocks['MS_STOCKS']; //актуальные остатки из МС 
            $bxQuantity = $productInfoStocks['BX_QUANTITY']; //поле "доступное количество" ДО изменения
            $bxStocks = $productInfoStocks['BX_STOCKS']; //тоже самое что и в $currentStocks (для совместимости)
    
    

     //возвращаем SUCCESS если нужно поменять массив полей товара, этот массив замениться тем, что передает модуль в товар
     return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arUpdateProductFields);
}

Last updated

Was this helpful?