Работа с событиями сохранения корзины в 1С-Битрикс (D7): OnSaleBasketBeforeSaved и OnSaleBasketSaved

В системе управления сайтом 1С-Битрикс (в частности, в модуле интернет-магазина) корзина может существовать в двух состояниях:

  • Привязанная к заказу (товары уже оформлены в заказ);
  • Непривязанная к заказу (просто корзина, в которую пользователь добавил товары, но еще не оформил заказ).

Работа с событиями сохранения корзины в 1С-Битрикс (D7)

В рамках D7 для корзины предусмотрены события, которые позволяют перехватывать момент ее сохранения и выполнять необходимую логику — например, проверять содержимое корзины, логировать изменения или отправлять какие-либо уведомления.

В этой статье мы рассмотрим:

  1. События, которые существуют для сохранения непривязанной корзины,
  2. Отличия привязанной и непривязанной корзины,
  3. Практические примеры создания обработчиков событий.

1. Отличия привязанной и непривязанной корзины

  • Привязанная корзина – это корзина, которая является частью уже созданного заказа. Проще говоря, после оформления заказа мы имеем перечень товаров, «привязанный» к этому заказу. В большинстве случаев такая корзина в коде уже недоступна как обычная: при ее изменении или удалении задействуются другие механизмы (например, работа с уже оформленным заказом, платёжными системами и т.д.).
  • Непривязанная корзина – это корзина, в которой пользователь хранит товары до оформления заказа. Она хранится в БД, но не связана ни с каким заказом, пока пользователь не нажмет на кнопку «Оформить заказ». Именно для непривязанной корзины доступны дополнительные события OnSaleBasketBeforeSaved и OnSaleBasketSaved.

2. События сохранения непривязанной корзины

OnSaleBasketBeforeSaved

Событие: OnSaleBasketBeforeSaved

Происходит: перед сохранением корзины в БД.

Параметры события:

  • ENTITY – объект корзины (\Bitrix\Sale\Basket).

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

Способ подписки (D7)

Обычно подписка на события D7 в 1С-Битрикс реализуется через класс \Bitrix\Main\EventManager. Например, вы можете добавить следующий код в файл /bitrix/php_interface/init.php или в свой модуль:


use Bitrix\Main\EventManager;
use Bitrix\Sale\Basket;

EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleBasketBeforeSaved',
    ['\\MyNamespace\\MyClass', 'onBeforeBasketSavedHandler']
);
    

Затем определите класс-обработчик, например, в файле lib/myclass.php вашего модуля/пространства имен:


namespace MyNamespace;

use Bitrix\Sale\Basket;
use Bitrix\Main\Event;

class MyClass
{
    public static function onBeforeBasketSavedHandler(Event $event)
    {
        /** @var Basket $basket */
        $basket = $event->getParameter('ENTITY');

        // Здесь вы можете получить информацию о корзине, элементах корзины и т.д.
        foreach ($basket as $basketItem) {
            $productId = $basketItem->getProductId();
            $quantity = $basketItem->getQuantity();

            // Например, запретим сохранение, если количество товаров превышает 10
            if ($quantity > 10) {
                // Можно выбросить исключение или прервать сохранение
                // Однако встроенных методов для отмены сохранения нет,
                // поэтому чаще поступают так: меняют количество на максимально допустимое
                $basketItem->setField('QUANTITY', 10);
            }
        }
    }
}
    

Обратите внимание: события OnSaleBasketBeforeSaved и OnSaleBasketSaved могут срабатывать многократно за время жизни сессии, поскольку корзина может перезаписываться (например, при каждой смене количества товара). Продумайте логику, чтобы она корректно обрабатывала повторные вызовы.


OnSaleBasketSaved

Событие: OnSaleBasketSaved

Происходит: после сохранения корзины в БД.

Параметры события:

  • ENTITY – объект корзины (\Bitrix\Sale\Basket).

Это событие используется, когда нужно выполнить действия после того, как корзина успешно записалась в БД. Например:

  • Сохранять информацию о составе корзины в дополнительную таблицу для аналитики,
  • Уведомлять внешний сервис о новых данных в корзине,
  • Формировать какую-то отчётность.

Пример подписки и обработчика


use Bitrix\Main\EventManager;
use Bitrix\Sale\Basket;

EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleBasketSaved',
    ['\\MyNamespace\\MyClass', 'onBasketSavedHandler']
);
    

namespace MyNamespace;

use Bitrix\Sale\Basket;
use Bitrix\Main\Event;

class MyClass
{
    public static function onBasketSavedHandler(Event $event)
    {
        /** @var Basket $basket */
        $basket = $event->getParameter('ENTITY');

        // Пример: отправим в лог информацию о сохранённой корзине
        $basketItemsData = [];
        foreach ($basket as $item) {
            $basketItemsData[] = [
                'PRODUCT_ID' => $item->getProductId(),
                'QUANTITY'   => $item->getQuantity(),
                'PRICE'      => $item->getPrice(),
            ];
        }

        // Допустим, используем для лога метод writeToLog (псевдокод)
        \MyNamespace\Logger::writeToLog('Basket saved', $basketItemsData);
    }
}
    

3. Дополнительная информация и практические советы

  1. Контроль повторных срабатываний Корзина может сохраняться многократно, даже без очевидных действий пользователя (например, в процессе обновления формы). Поэтому, если в обработчике вы выполняете тяжелые операции (запросы к внешним сервисам, сложные вычисления и т.д.), желательно предусмотреть механизм, который не позволит выполнять один и тот же код слишком часто.
  2. Обработка привязанной корзины Когда корзина уже привязана к заказу, применяются несколько иные события (например, связанные с изменением заказа, оплатой и т.д.). Логику, которая должна работать только для непривязанной корзины, проверяйте, действительно ли ENTITY не связано с заказом.
    
    // Пример логики проверки
    $orderId = $basket->getOrderId();
    if ($orderId > 0) {
        // Корзина уже привязана к заказу
    } else {
        // Корзина не привязана
    }
            
  3. Сложные проверки перед сохранением В событии OnSaleBasketBeforeSaved вы можете менять поля корзины (количество, цену и т.д.). Однако полностью отменить сохранение текущим методом не получится — вы можете только корректировать значения или выбрасывать исключения. При выбросе исключения система может вести себя непредсказуемо (это зависит от логики самого ядра). Поэтому чаще всего корректируют данные «на лету», либо помечают позицию и позже обрабатывают ее в другом месте.
  4. Где размещать код обработчиков
    • Самый простой вариант для тестовых/учебных целей — файл /bitrix/php_interface/init.php.
    • Для боевого проекта или модуля обычно создают собственный класс (например, MyNamespace\Events\BasketHandler) и подключают его в init.php или в handler.php внутри модуля, чтобы логику было проще поддерживать и версионировать.
  5. Документация и ссылки

4. Итог

События OnSaleBasketBeforeSaved и OnSaleBasketSaved — это мощные инструменты, позволяющие разработчику 1С-Битрикс гибко управлять процессом сохранения непривязанной корзины. Через них можно вносить корректировки в состав и параметры корзины непосредственно перед записью в БД или выполнять нужную логику после сохранения (логирование, интеграции, аналитика).

При разработке стоит помнить:

  • Корзина может сохраняться несколько раз в одной пользовательской сессии;
  • Для привязанной корзины (часть заказа) эти события не работают, используются другие механизмы;
  • Грамотно организуйте код обработчиков (разделяйте логику, контролируйте производительность, ведите логи).

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

Теги:  Битрикс, руководство, D7

Интернет-магазин от 120 000 руб., срок от 4 недель

Платформа для продажи товаров или услуг. Включает интерактивные формы обратной связи в каждой карточке товара, а также множество статичных и динамичных разделов.

Корпоративный сайт от 60 000 руб., срок от 3 недель

Готовый информационный ресурс, включающий лицензию на 1С-Битрикс «Стандарт», технологию «Композитный сайт».

Лендинг от 25 000 руб., срок от 2 недель

Компактный сайт, идеально подходящий для старта. На одной странице можно представить ключевые преимущества вашей компании и разместить форму для обратной связи.