Работа с событиями сохранения корзины в 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

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Модули и компоненты для «1С-Битрикс»

оценка производится на основе предоставленного Технического Задания

от 20 000 рублей
Разработка дополнительных модулей для 1С-Битрикс, расширение функционала, внедрение любых решений, требующихся для выполнения ваших бизнес-задач.

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

Техническая поддержка

выполняется с сайтами на основе любых CMS

от 5 000 рублей
Оптимизация производительности действующих интернет-проектов, наполнение и сопровождение, полная техническая поддержка и продвижение в поисковых сетях.

* стоимость зависит от объема и сложности выполняемых работ, используемой CMS.

Аутсорсинг

готов помочь, если нет времени

договорная

Могу взять на себя работы по full-stack на основе готовой верстки

* если нет верстки, то возможность верстать с Figma в режиме редактора