Закупочная цена из 1с в Bitrix

По умолчанию, при обмене 1с с сайтом, нет технической возможности установить «Закупочную цену» в специальное поле, отсюда приходится переносить её самому.

Данный класс охватывает события изменения цены, и цену с определённым id указывает в качестве закупочной данному товару.

namespace SiteEvent\Catalog;

use Bitrix\Catalog\Model\Product;
use Bitrix\Catalog\PriceTable;
use Bitrix\Main\Event;
use Bitrix\Main\EventManager;

class PriceMovePurchasing
{
    const module = 'catalog';
    static $priceId = null;

    /**
     * Инициализация событий
     *
     * @param $priceId
     * @return bool
     */
    public static function initEvents($priceId)
    {
        if (!is_numeric($priceId)) {
            return false;
        }

        self::$priceId = $priceId;
        $event = EventManager::getInstance();
        $event->addEventHandler(
            self::module,
            'Bitrix\Catalog\Model\Price::OnBeforeUpdate',
            [__CLASS__, 'OnBeforeUpdate']
        );

        $event->addEventHandler(
            self::module,
            'Bitrix\Catalog\Model\Price::OnBeforeAdd',
            [__CLASS__, 'OnBeforeAdd']
        );

        $event->addEventHandler(
            self::module,
            'Bitrix\Catalog\Model\Price::OnBeforeDelete',
            [__CLASS__, 'OnBeforeDelete']
        );

        // удаление через административный интерфейс
        $event->addEventHandler(
            self::module,
            'OnBeforeProductPriceDelete',
            [__CLASS__, 'OnBeforeDeleteAdmin']
        );

        return true;
    }

    /**
     * @param Event $event
     * id
     * fields
     * external_fields
     * actions
     */
    public static function OnBeforeUpdate(Event $event)
    {
        $arParams = $event->getParameters();

        self::movePrice($arParams['fields']);
    }

    /**
     * Добавление закупочной цены для товара
     *
     * @param $arFields
     */
    protected static function movePrice($arFields)
    {
        if ($arFields['CATALOG_GROUP_ID'] == self::$priceId) {
            $arData = [
                'PURCHASING_PRICE' => $arFields['PRICE'],
                'PURCHASING_CURRENCY' => $arFields['CURRENCY']
            ];

            Product::update($arFields['PRODUCT_ID'], $arData);
        }
    }

    /**
     * @param Event $event
     * data
     */
    public static function OnBeforeAdd(Event $event)
    {
        $arParams = $event->getParameters();

        self::movePrice($arParams['fields']);
    }

    /**
     * @param Event $event
     * id
     */
    public static function OnBeforeDelete(Event $event)
    {
        $arParams = $event->getParameters();

        $arPrice = PriceTable::getById($arParams['id'])->fetch();

        self::deletePrice($arPrice);
    }

    /**
     * Удаление закупочной цены у товара
     *
     * @param $arFields
     */
    protected static function deletePrice($arFields)
    {
        if ($arFields['CATALOG_GROUP_ID'] == self::$priceId) {
            $arData = [
                'PURCHASING_PRICE' => '',
                'PURCHASING_CURRENCY' => $arFields['CURRENCY']
            ];

            Product::update($arFields['PRODUCT_ID'], $arData);
        }
    }

    /**
     * @param $ProductID
     * @param $arExceptionIDs
     */
    public static function OnBeforeDeleteAdmin($ProductID, $arExceptionIDs)
    {
        try {
            $dbPrice = PriceTable::getList(
                [
                    'filter' => [
                        'PRODUCT_ID' => $ProductID,
                        '!ID' => $arExceptionIDs
                    ]
                ]
            );

            while ($arPrice = $dbPrice->fetch()) {
                self::deletePrice($arPrice);
            }
        } catch (\Exception $e) {
        }
    }
}

Вызывается он в init.php, где $id — id цены, в которой находятся закупочные цены

\SiteEvent\Catalog\PriceMovePurchasing::initEvents($id);