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

События работы со скидками

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

События

Событие Описание и параметры
onBuildDiscountProviders

При первой инициализации менеджера скидок в методе \Bitrix\Sale\OrderDiscountBase::initDiscountProviders. Обработчик регистрирует провайдер скидок стороннего модуля.

Событие не передает параметры. Обработчик должен вернуть объект \Bitrix\Main\EventResult с описанием провайдера

onBuildCouponProviders

При построении списка провайдеров купонов в методе \Bitrix\Sale\DiscountCouponsManagerBase::loadCouponProviders.

Параметры

  • COUPON_UNKNOWN — идентификатор неизвестного типа купона, int
  • COUPON_TYPES — список типов купонов, array

Обработчик должен вернуть объект \Bitrix\Main\EventResult с описанием провайдера купонов

onExtendOrderData

При подготовке дополнительных данных заказа для расчета скидок в методе \Bitrix\Sale\DiscountBase::extendOrderData.

Параметры

  • ORDER — текущие данные заказа, array
  • ENTITY — список полей объектов, которые нужны для расчета скидок, array

Успешный результат обработчика должен содержать массив дополнительных данных. Менеджер рекурсивно объединит его с данными заказа

onManagerCouponAdd

При добавлении нового купона в менеджер методом \Bitrix\Sale\DiscountCouponsManagerBase::add.

Событие передает поля купона. Основные поля: COUPON, MODULE_ID, ID, DISCOUNT_ID, TYPE, STATUS и CHECK_CODE

onManagerCouponDelete

После удаления купона из менеджера методом \Bitrix\Sale\DiscountCouponsManagerBase::delete.

Событие передает поля удаленного купона. Основные поля: COUPON, MODULE_ID, ID, DISCOUNT_ID, TYPE, STATUS и CHECK_CODE

onManagerCouponApplyByProduct

После применения одного или нескольких купонов к позиции корзины методом \Bitrix\Sale\DiscountCouponsManagerBase::setApplyByProduct.

Параметры

  • PRODUCT — данные позиции корзины, array
  • COUPONS — примененные купоны, array
onManagerCouponApply

После обработки применения купона к корзине или доставке методом \Bitrix\Sale\DiscountCouponsManagerBase::setApply.

Событие передает данные в ключах COUPON, BASKET и DELIVERY. Набор ключей зависит от того, к чему применен купон

onManagerSaveApplied

После завершения сохранения примененных купонов методом \Bitrix\Sale\DiscountCouponsManagerBase::saveApplied.

Событие передает массив с результатами по идентификаторам модулей. Данные модуля содержат ключ COUPONS и могут содержать ключи DEACTIVATE, LIMITED, INCREMENT и ERROR

События onManagerCouponAdd, onManagerCouponDelete, onManagerCouponApplyByProduct, onManagerCouponApply и onManagerSaveApplied уведомляют об изменениях. Вызывающий код не обрабатывает результаты их обработчиков.

Ответ обработчика onBuildDiscountProviders

\Bitrix\Main\EventResult функция-обработчик(
	\Bitrix\Main\Event $event
);

Верните объект \Bitrix\Main\EventResult с типом \Bitrix\Main\EventResult::SUCCESS. Во втором аргументе конструктора передайте массив функций провайдера, а в третьем — идентификатор модуля провайдера.

Ключ Описание
prepareData Обязательная функция. Получает массив скидки и настройки менеджера. Возвращает подготовленный массив скидки или false, если данные нельзя подготовить
getEditUrl Получает массив с ключами ID и MODULE_ID. Возвращает ссылку на страницу редактирования скидки
calculateApplyCoupons Получает массив купонов, данные корзины и параметры расчета. Возвращает результат применения купонов
roundPrice Получает данные позиции корзины и правило округления. Возвращает массив с ключами PRICE, DISCOUNT_PRICE и ROUND_RULE
roundBasket Получает позиции корзины, правила округления и данные заказа без корзины. Возвращает позиции с округленными ценами

Идентификатор модуля в результате события должен совпадать с MODULE_ID скидки. Менеджер добавляет провайдер, только если обработчик вернул успешный результат, непустой массив и ключ prepareData. Регистрируйте обработчик до первого обращения к менеджеру скидок: после инициализации повторный вызов \Bitrix\Sale\OrderDiscountBase::init не отправляет событие повторно.

Ответ обработчика onBuildCouponProviders

Верните объект \Bitrix\Main\EventResult с типом \Bitrix\Main\EventResult::SUCCESS. Во втором аргументе конструктора передайте массив функций провайдера, а в третьем — идентификатор модуля провайдера.

Ключ Описание
getData Обязательная функция. Получает код купона и возвращает данные купона или false
isExist Обязательная функция. Получает код купона и возвращает данные найденного купона или false
saveApplied Обязательная функция. Получает примененные купоны, идентификатор пользователя заказа и дату применения. Возвращает результат сохранения
mode Необязательный режим данных купона: \Bitrix\Sale\DiscountCouponsManagerBase::COUPON_MODE_SIMPLE или \Bitrix\Sale\DiscountCouponsManagerBase::COUPON_MODE_FULL. По умолчанию используется простой режим

Менеджер купонов запрашивает сторонние провайдеры, только если настройка модуля sale use_sale_discount_only не равна Y.

Пример

Регистрация провайдера скидок

Пример регистрирует минимальный провайдер модуля example.discount. Функция prepareData преобразует скидку в формат, который менеджер сохраняет вместе с заказом.

<?php

use Bitrix\Main\Event;
use Bitrix\Main\EventManager;
use Bitrix\Main\EventResult;

$prepareData = static function(array $discount, array $config)
{
	if (empty($discount['ID']))
	{
		return false;
	}

	$discountId = (int)$discount['ID'];

	return [
		'MODULE_ID' => 'example.discount',
		'DISCOUNT_ID' => $discountId,
		'NAME' => (string)($discount['NAME'] ?? 'Скидка стороннего модуля'),
		'CONDITIONS' => $discount['CONDITIONS'] ?? [],
		'UNPACK' => (string)($discount['UNPACK'] ?? ''),
		'ACTIONS' => $discount['ACTIONS'] ?? [],
		'APPLICATION' => (string)($discount['APPLICATION'] ?? ''),
		'USE_COUPONS' => (string)($discount['USE_COUPONS'] ?? 'N'),
		'SORT' => (int)($discount['SORT'] ?? 100),
		'PRIORITY' => (int)($discount['PRIORITY'] ?? 1),
		'LAST_DISCOUNT' => (string)($discount['LAST_DISCOUNT'] ?? 'N'),
		'ACTIONS_DESCR' => $discount['ACTIONS_DESCR'] ?? [],
		'EDIT_PAGE_URL' => '/bitrix/admin/example_discount_edit.php?ID=' . $discountId,
	];
};

EventManager::getInstance()->addEventHandler(
	'sale',
	'onBuildDiscountProviders',
	static function(Event $event) use ($prepareData): EventResult
	{
		return new EventResult(
			EventResult::SUCCESS,
			[
				'prepareData' => $prepareData,
			],
			'example.discount'
		);
	}
);

Обработка добавления купона

Пример записывает идентификатор скидки в журнал после добавления купона в менеджер.

<?php

use Bitrix\Main\Diag\Debug;
use Bitrix\Main\Event;
use Bitrix\Main\EventManager;

EventManager::getInstance()->addEventHandler(
	'sale',
	'onManagerCouponAdd',
	static function(Event $event): void
	{
		$discountId = (int)$event->getParameter('DISCOUNT_ID');

		Debug::writeToFile(
			['discountId' => $discountId],
			'Coupon added',
			'upload/coupon-events.log'
		);
	}
);


Была ли эта страница полезна?

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

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

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
© «Битрикс», 2001-2026, «1С-Битрикс», 2026
Наверх