Изменение коэффициента единицы измерения при использовании событий - Сергей Житников: Web-разработчик

Изменение коэффициента единицы измерения при использовании событий

При использовании события OnBeforeIBlockElementUpdateHandler или OnAfterIBlockElementUpdate, у меня никак не получалось изменить параметр товара «коэффициент единицы измерения». Причина, как выяснилось, в том, что сначала отрабатывают события изменения элемента, а уже потом битрикс под капотом меняет нужный параметр на свой, дефолтный, или тот, который был раньше установлен в элементе (не знаю как под капотом работает, не разбирался). И не дает заменить значение параметра для элемента на нужное.

Изменение значения коэффициента единицы измерения при использовании событий

Если нужно использовать события, вопрос изменения параметра решается следующим образом:

  • Создаем одно из событий:
    • \Bitrix\Catalog\MeasureRatio::OnBeforeUpdate
    • \Bitrix\Catalog\MeasureRatio::OnUpdate
    • \Bitrix\Catalog\MeasureRatio::OnAfterUpdate
  • В обработчике меняем данные прямо в объекте события

Выглядит это примерно так:

/** Обратите внимание, что событие прописывается с полным путем */
EventManager::getInstance()->addEventHandler(    "catalog",    "\Bitrix\Catalog\MeasureRatio::OnBeforeUpdate",   'MeasureRatioOnBeforeUpdateHandler');

/** Прописываем для него обработчик*/
function MeasureRatioOnBeforeUpdateHandler(&$eventObject)
{
    $productId = $eventObject->getParameter('fields')['PRODUCT_ID'];
    $result = new \Bitrix\Main\ORM\EventResult;

    $dbItem = \Bitrix\Iblock\ElementPropertyTable::getList([
        'select' => ['VALUE'],
        'filter' => ['IBLOCK_ELEMENT_ID' => $productId, 'IBLOCK_PROPERTY_ID' => PROP_CODE],
    ])->fetch();

   $dbItem = $dbItem['VALUE'];

   $result->modifyFields(array('RATIO' => $newMeasureRatioVal));
   return $result;
}

Для модификации используется \Bitrix\Main\ORM\EventResult;. Подробности по классу можно посмотреть по ссылке.

Об этой проблеме писали на форуме, где я и подсмотрел решение. Также один из форумчанинов писал, что ему помогло использвание события OnCompleteCatalogImport1C, хотя я не проверял, насколько рабочим может быть решение.

Изменение коэффициента единицы измерения в коде

Здесь все достаточно просто. При необходимости изменения параметра в коде, проблем не возникает. Можно использовать методы:

use Bitrix\Catalog\MeasureRatioTable;

MeasureRatioTable::delete($recordId);

MeasureRatioTable::add([
    'PRODUCT_ID' => $productId,
    'RATIO' => $ratioValue,
    'IS_DEFAULT' => 'Y' //Значения Y/N
]);

MeasureRatioTable::update($recordId,
[
    'PRODUCT_ID' => $productId,
    'RATIO' => $ratioValue,
    'IS_DEFAULT' => 'Y' //Значения Y/N
]);

MeasureRatioTable::getList([
    'select' => ['ID', 'RATIO', 'PRODUCT_ID'],
    'filter' => ['PRODUCT_ID' => $productId]
]);

Сергей Житников
Об авторе

Сергей Житников - Веб-разработчик

Занимаюсь веб-разработкой более 5 лет. Специализируюсь на создании адаптивных сайтов и веб-приложений на HTML5, CSS3 и JavaScript. Работаю с популярными CMS и фреймворками, а также уделяю большое внимание оптимизации производительности и чистоте кода.

Есть проект или идея? Буду рад помочь!

Связаться со мной

Последние статьи

19.06.2026
В статье собрал шпаргалку по основным компонентам Bitrix: bitrix:menu, news.list, news.detail, sale.basket.basket.line, main.include и breadcrumb. Разобрал настройку меню из разделов и элементов инфоблока через файлы .menu_ext.php, показываю полные конфигурации компонентов с пояснениями ключевых параметров. Готовые примеры для быстрого копирования и использования в проектах.
19.06.2026
Купоны в Битрикс неразрывно связаны с правилами работы с корзиной — без привязки к правилу они не сработают, а правило без купонов применит скидку на все товары. Разбираю создание купонов через DiscountCouponTable::add(): обязательные и опциональные поля, типы купонов, флаги активности. Показываю примеры работы с датами через объект DateTime (прибавление дней, месяцев и минут).
19.06.2026
Разбираю готовые примеры работы с изображениями в PHP: сохранение на сервер, вывод в браузер, рисование линий и прямоугольников. Отдельно — нюансы с форматами файлов (JPEG/PNG) и поддержкой кириллицы через шрифты.