Эффективное управление складскими остатками — критически важная задача для любого интернет-магазина. Одной из ключевых проблем является момент, когда популярный товар заканчивается на складе. Если менеджер не заметит это своевременно, можно упустить продажи и вызвать недовольство клиентов.
В стандартном функционале Bitrix CMS есть инструменты для работы с остатками, но они не всегда обеспечивают необходимую гибкость. В этом руководстве мы рассмотрим, как реализовать автоматическую отправку email-уведомлений, используя более мощный метод CCatalogProduct::GetByIDEx для точного отслеживания изменений и предотвращения ложных срабатываний.
Шаг 1: Подготовительные действия
Перед тем как приступить к коду, необходимо выполнить две настройки в административной панели Bitrix.
1.1. Создание почтового события
Это шаблон для нашего email-уведомления.
-
Перейдите в
Настройки→Настройки продукта→Почтовые события. -
Нажмите «Добавить почтовое событие».
-
Заполните поля:
-
Код события:
PRODUCT_ENDED -
Название:
Товар закончился на складе -
Описание:
Уведомление для менеджера об обнулении остатков товара.
-
-
В поле «Параметры письма» добавьте две переменные, которые будут заполняться кодом:
-
#PROD_NAME#— Название товара. -
#PROD_ART#— Артикул товара.
-
Создайте и активируйте шаблон письма на основе этого события, где укажите тему, например, «Товар «#PROD_NAME#» закончился на складе!», и текст письма.
1.2. Добавление пользовательского свойства в инфоблок каталога
Нам нужен способ отслеживать, какое количество товара было до его обновления. Для этого создадим специальное свойство.
-
Перейдите в
Контент→Инфоблоки→Ваш инфоблок каталога→Свойства. -
Добавьте новое свойство:
-
Код:
OLD_QUANT -
Название:
Предыдущее количество -
Тип: «Число»
-
-
Это свойство будет служить нашей «памятью» для сравнения остатков.
Шаг 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: Как это работает на практическом примере
Давайте рассмотрим сценарий, в котором система сработает идеально.
-
Исходное состояние: Товар «Смартфон X» имеет на складе 5 единиц (
QUANTITY = 5). В свойствеOLD_QUANTтакже хранится значение5. -
Действие менеджера: Проходит продажа, и менеджер вручную изменяет количество товара в карточке товара в Bitrix с
5на0. -
Срабатывание события: Моментально запускается наш обработчик
notifyOutOfStock.-
Получение данных: С помощью
CCatalogProduct::GetByIDExсистема получает текущие данные о товаре, включаяOLD_QUANT = 5. -
Сравнение: Код видит, что
$currentQuantity (0)не равно$oldQuantity (5). -
Обновление «памяти»: Свойство
OLD_QUANTобновляется на новое значение0. -
Проверка условия: Система анализирует:
0 == 0(текущее количество) и5 > 0(предыдущее количество). Условие выполнено! -
Отправка письма: Формируется и отправляется email менеджеру с текстом: «Товар "Смартфон X" (Артикул: X12345) закончился на складе».
-
-
Результат: Менеджер получает мгновенное уведомление и может оперативно принять меры: заказать новую партию или временно скрыть товар из каталога.
Преимущества данного подхода
-
Точность и отсутствие ложных срабатываний: Письмо отправится только в момент перехода количества с положительного значения на ноль. Если товар изначально был нулевым или его количество уменьшилось, но не до нуля, уведомление не придет.
-
Гибкость данных: Использование
CCatalogProduct::GetByIDExдает доступ ко всем данным товара (свойствам, разделам и т.д.), что позволяет легко добавить в уведомление любую другую информацию (например, ссылку на товар, фото или ответственного менеджера). -
Автоматизация: Процесс полностью автоматизирован и не требует ручного контроля со стороны сотрудников.
Заключение
Предложенное решение превращает Bitrix из простой системы учета в proactive-инструмент, который сам сообщает о проблемах. Это значительно повышает оперативность работы отдела продаж и закупок, помогая избежать ситуаций с «продажей отсутствующего товара» и улучшая общее качество обслуживания клиентов. Внедрите этот код, и вы забудете о проблеме несвоевременного пополнения остатков.