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

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

Метод Описание С версии
OnSaleCheckPrepareData Событие позволяет поменять какие-либо данные в чеке: поменять название товара, убрать товары с 0 стоимостью и т.д. На вход передается 2 параметра:
  • массив с данными по чеку;

    Нажмите на [+], чтобы раскрыть детальное описание массива

  • тип чека (например, credit, advancepayment и т.д.).
// удаление доставки с 0 стоимостью
AddEventHandler("sale", "OnSaleCheckPrepareData", "CheckProductPrint");
function CheckProductPrint($a, $type)
{
	if ($a['DELIVERY']['SUM'] == 0)
		unset($a['DELIVERY']);
	return $a;
}
OnGetCustomCashboxHandlers Событие срабатывает на момент формирования списка обработчиков касс. Позволяет добавить свой обработчик кассы.
// добавление своего обработчика кассы
AddEventHandler("sale", "OnGetCustomCashboxHandlers", "GetCustomCashboxHandlers");
function GetCustomCashboxHandlers()
{
	$data = array('\Bitrix\Sale\Cashbox\cashboxnew' => '/bitrix/php_interface/include/cashboxnew.php');
	$event = new Bitrix\Main\EventResult(Bitrix\Main\EventResult::SUCCESS, $data);
	
	return $event;
}
OnGetCustomCheckList Событие срабатывает на момент формирования списка поддерживаемых чеков. Позволяет добавить свой тип чека.
// добавление своего типа чека
AddEventHandler("sale", "OnGetCustomCheckList", "GetCustomCheckList");
function GetCustomCheckList()
{
	$data = array('\Bitrix\Sale\Cashbox\SellExCheck' => '/bitrix/php_interface/include/sellexcheck.php');
	$event = new Bitrix\Main\EventResult(Bitrix\Main\EventResult::SUCCESS, $data);
	
	return $event;
}
OnPrintableCheckSend Событие позволяет переопределить стандартный механизм отправки уведомления о печати чека. На вход передается 2 параметра: объект оплаты, по которой печатается чек и объект чека, который будет напечатан.
// переопределение стандартного механизма печати чека
AddEventHandler("sale", "OnPrintableCheckSend", "PrintableCheckSend");
function PrintableCheckSend()
{
	/*
		Отправка чека по СМС
	*/
	
	$event = new Bitrix\Main\EventResult(Bitrix\Main\EventResult::SUCCESS);
	
	return $event;
}
onSaleCashboxRestrictionsClassNamesBuildList Событие позволяет добавлять свои ограничения в кассы.
onSaleCashboxRestrictionsClassNamesBuildList
// добавление своего типа чека
AddEventHandler("sale", "onSaleCashboxRestrictionsClassNamesBuildList", 
"GetSaleCashboxRestrictionsClassNamesBuildList");
function GetSaleCashboxRestrictionsClassNamesBuildList()
{
	$data = array(
		'\Bitrix\Sale\Cashbox\Restrictions\Site' => '/bitrix/php_interface/include/site.php'
	);
	$event = new Bitrix\Main\EventResult(Bitrix\Main\EventResult::SUCCESS, $data);
	
	return $event;
}
OnCheckCollateDocuments Событие предназначено для реализации собственной логики генерации чеков в автоматическом режиме.

Пример 1. Формирование чеков для предоплаты и полной оплаты

Если сумма заказа превышает 10 000, покупатель вносит предоплату. После проверки заказа менеджером покупатель оплачивает оставшуюся сумму. Для первой оплаты обработчик формирует чек аванса, для второй — чек полной оплаты с учетом аванса. В упрощенном виде код выглядит так:

AddEventHandler("sale", "OnCheckCollateDocuments", "OnCheckCollateDocuments");
function OnCheckCollateDocuments($entities)
{
	foreach ($entities as $entity)
	{
		if ($entity instanceof \Bitrix\Sale\Payment)
		{
			$order = $entity->getCollection()->getOrder();
			if ($order->isPaid())
			{
				$related = [];
				foreach ($entity->getCollection() as $payment)
				{
					if ($payment->getId() != $entity->getId())
					{
						$related[\Bitrix\Sale\Cashbox\Check::PAYMENT_TYPE_ADVANCE][] = $payment;
					}
				}
			
				foreach ($order->getShipmentCollection() as $shipment)
				{
					if (!$shipment->isSystem())
					{
						$related[\Bitrix\Sale\Cashbox\Check::SHIPMENT_TYPE_NONE][] = $shipment;
					}
				}
				return new \Bitrix\Main\EventResult(
					\Bitrix\Main\EventResult::SUCCESS, 
					[
						[
							'TYPE' => 'sell',
							'ENTITIES' => [$entity],
							'RELATED_ENTITIES' => $related
						]
					]
				);
			}
			else
			{
				if ($entity->isPaid() && !$order->isPaid())
				{
					return new \Bitrix\Main\EventResult(
						\Bitrix\Main\EventResult::SUCCESS, 
						[
							[
								'TYPE' => 'advancepayment',
								'ENTITIES' => [$entity],
								'RELATED_ENTITIES' => []
							]
						]
					);
				}
			}
		}
	}
}

Пример2. Формирование чека с товарными позициями

Чтобы добавить в чек товарные позиции, передайте отгрузки заказа в RELATED_ENTITIES. Класс чека получит товары из коллекций элементов этих отгрузок.

<?php
use Bitrix\Main\Event;
use Bitrix\Main\EventManager;
use Bitrix\Main\EventResult;
use Bitrix\Main\Loader;
use Bitrix\Sale\Cashbox\Check;
use Bitrix\Sale\Payment;

if (!Loader::includeModule('sale'))
{
	throw new RuntimeException('Модуль sale не установлен');
}

EventManager::getInstance()->addEventHandler(
	'sale',
	'OnCheckCollateDocuments',
	'onCheckCollateDocumentsWithProducts'
);

function onCheckCollateDocumentsWithProducts(Event $event): EventResult
{
	$entities = $event->getParameter('ENTITIES');

	foreach ($entities as $entity)
	{
		if (!($entity instanceof Payment) || !$entity->isPaid())
		{
			continue;
		}

		$order = $entity->getCollection()->getOrder();
		$relatedEntities = [];

		foreach ($order->getShipmentCollection() as $shipment)
		{
			if (!$shipment->isSystem())
			{
				$relatedEntities[Check::SHIPMENT_TYPE_NONE][] = $shipment;
			}
		}

		if (!$relatedEntities)
		{
			continue;
		}

		return new EventResult(
			EventResult::SUCCESS,
			[
				[
					'TYPE' => 'sell',
					'ENTITIES' => [$entity],
					'RELATED_ENTITIES' => $relatedEntities,
				],
			]
		);
	}

	return new EventResult(EventResult::UNDEFINED);
}
Была ли эта страница полезна?

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

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

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
5
Александр Карпов
В PAYMENTS может не быть объекта оплаты, например вместо
Код
'PAYMENTS' => [   // массив оплат
        [
            'ENTITY' => {Bitrix\Sale\Payment}, // объект оплаты
            'IS_CASH' => "N", // тип документа оплаты: наличные/безналичные (оставлен для совместимости).
                              // Правильнее опираться на поле с ключом TYPE
            'TYPE' => "cashless", // тип документа оплаты: принимает одно из значений: cash (наличные),
                                     //cashless (безналичные), advance (аванс), credit (кредит)
            'SUM' => 1400, // сумма документа оплаты
        ]
    ],
Вы можете получить
Код
'PAYMENTS'=>[
  [
    'TYPE' => 'credit',
    'SUM' => 1042
  ]
]

"Удачной отладки"!
© «Битрикс», 2001-2026, «1С-Битрикс», 2026
Наверх