Назад

Автоматизация уведомлений в Bitrix: Отслеживание нулевых остатков с помощью CCatalogProduct::GetByIDEx

Главная
Блог
Автоматизация уведомлений в Bitrix: Отслеживание нулевых остатков с помощью CCatalogProduct::GetByIDEx

Эффективное управление складскими остатками — критически важная задача для любого интернет-магазина. Одной из ключевых проблем является момент, когда популярный товар заканчивается на складе. Если менеджер не заметит это своевременно, можно упустить продажи и вызвать недовольство клиентов.

В стандартном функционале Bitrix CMS есть инструменты для работы с остатками, но они не всегда обеспечивают необходимую гибкость. В этом руководстве мы рассмотрим, как реализовать автоматическую отправку email-уведомлений, используя более мощный метод CCatalogProduct::GetByIDEx для точного отслеживания изменений и предотвращения ложных срабатываний.

Шаг 1: Подготовительные действия

Перед тем как приступить к коду, необходимо выполнить две настройки в административной панели Bitrix.

1.1. Создание почтового события

Это шаблон для нашего email-уведомления.

  1. Перейдите в НастройкиНастройки продуктаПочтовые события.

  2. Нажмите «Добавить почтовое событие».

  3. Заполните поля:

    • Код события: PRODUCT_ENDED

    • Название: Товар закончился на складе

    • Описание: Уведомление для менеджера об обнулении остатков товара.

  4. В поле «Параметры письма» добавьте две переменные, которые будут заполняться кодом:

    • #PROD_NAME# — Название товара.

    • #PROD_ART# — Артикул товара.

Создайте и активируйте шаблон письма на основе этого события, где укажите тему, например, «Товар «#PROD_NAME#» закончился на складе!», и текст письма.

1.2. Добавление пользовательского свойства в инфоблок каталога

Нам нужен способ отслеживать, какое количество товара было до его обновления. Для этого создадим специальное свойство.

  1. Перейдите в КонтентИнфоблокиВаш инфоблок каталогаСвойства.

  2. Добавьте новое свойство:

    • Код: OLD_QUANT

    • Название: Предыдущее количество

    • Тип: «Число»

  3. Это свойство будет служить нашей «памятью» для сравнения остатков.

Шаг 2: Разработка логики обработки

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

Разместите следующий код в файле /bitrix/php_interface/init.php:

<?
// Регистрируем обработчик события OnProductUpdate
AddEventHandler("catalog", "OnProductUpdate", "notifyOutOfStock");

function notifyOutOfStock($ID, $arFields) {
    
    // 1. Получаем полные данные о товаре, включая свойства
    $arProduct = CCatalogProduct::GetByIDEx($ID);
    if (!$arProduct) {
        return;
    }

    // 2. Извлекаем предыдущее количество из нашего свойства OLD_QUANT
    $oldQuantity = (int)$arProduct['PROPERTIES']['OLD_QUANT']['VALUE'];
    // Текущее количество из параметров обновления
    $currentQuantity = (int)$arFields['QUANTITY'];

    // 3. Проверяем, изменилось ли количество
    if ($currentQuantity != $oldQuantity) {
        // Если да, обновляем OLD_QUANT на новое значение
        CIBlockElement::SetPropertyValuesEx(
            $ID,
            $arProduct['IBLOCK_ID'],
            array('OLD_QUANT' => $currentQuantity)
        );
    } else {
        // Если количество не менялось, выходим из функции
        return;
    }

    // 4. Проверяем условие для отправки уведомления:
    // Товар был в наличии (старое количество > 0), а теперь закончился (новое количество = 0)
    if ($currentQuantity == 0 && $oldQuantity > 0) {
        
        // Подготавливаем данные для письма
        $arEventFields = array(
            "PROD_NAME" => $arProduct["NAME"],
            "PROD_ART"  => $arProduct["PROPERTIES"]["ARTNUMBER"]["VALUE"], // Замените "ARTNUMBER" на код вашего свойства "Артикул"
        );

        // 5. Отправляем почтовое событие
        CEvent::Send(
            "PRODUCT_ENDED", // Код нашего почтового события
            "s1",            // ID сайта
            $arEventFields
         
        );
    }
}
?>

Важное примечание: В коде выше ARTNUMBER — это пример кода свойства, в котором хранится артикул. Замените его на актуальный код свойства в вашем инфоблоке.

Шаг 3: Как это работает на практическом примере

Давайте рассмотрим сценарий, в котором система сработает идеально.

  1. Исходное состояние: Товар «Смартфон X» имеет на складе 5 единиц (QUANTITY = 5). В свойстве OLD_QUANT также хранится значение 5.

  2. Действие менеджера: Проходит продажа, и менеджер вручную изменяет количество товара в карточке товара в Bitrix с 5 на 0.

  3. Срабатывание события: Моментально запускается наш обработчик notifyOutOfStock.

    • Получение данных: С помощью CCatalogProduct::GetByIDEx система получает текущие данные о товаре, включая OLD_QUANT = 5.

    • Сравнение: Код видит, что $currentQuantity (0) не равно $oldQuantity (5).

    • Обновление «памяти»: Свойство OLD_QUANT обновляется на новое значение 0.

    • Проверка условия: Система анализирует: 0 == 0 (текущее количество) и 5 > 0 (предыдущее количество). Условие выполнено!

    • Отправка письма: Формируется и отправляется email менеджеру с текстом: «Товар "Смартфон X" (Артикул: X12345) закончился на складе».

  4. Результат: Менеджер получает мгновенное уведомление и может оперативно принять меры: заказать новую партию или временно скрыть товар из каталога.

Преимущества данного подхода

  • Точность и отсутствие ложных срабатываний: Письмо отправится только в момент перехода количества с положительного значения на ноль. Если товар изначально был нулевым или его количество уменьшилось, но не до нуля, уведомление не придет.

  • Гибкость данных: Использование CCatalogProduct::GetByIDEx дает доступ ко всем данным товара (свойствам, разделам и т.д.), что позволяет легко добавить в уведомление любую другую информацию (например, ссылку на товар, фото или ответственного менеджера).

  • Автоматизация: Процесс полностью автоматизирован и не требует ручного контроля со стороны сотрудников.

Заключение

Предложенное решение превращает Bitrix из простой системы учета в proactive-инструмент, который сам сообщает о проблемах. Это значительно повышает оперативность работы отдела продаж и закупок, помогая избежать ситуаций с «продажей отсутствующего товара» и улучшая общее качество обслуживания клиентов. Внедрите этот код, и вы забудете о проблеме несвоевременного пополнения остатков.

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи