Настройка уведомления о готовности заказа к выдаче 1С-Битрикс
Заказ с самовывозом собран на складе, но покупатель об этом не знает. Он приходит слишком рано — товар ещё не готов. Или слишком поздно — менеджер уже успел снять резерв. Уведомление «Ваш заказ готов к выдаче» должно уходить ровно в тот момент, когда сотрудник склада изменяет статус заказа на соответствующий, — через SMS, Telegram или email.
Статус заказа как триггер
В Битрикс нет выделенного статуса «Готов к выдаче» из коробки. Создаём кастомный статус:
Магазин → Настройки → Статусы заказов → Добавить:
- Символьный код:
RC(Ready for Collect) - Название: «Готов к выдаче»
- Цвет: зелёный
После создания статуса — обработчик на его смену:
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleOrderStatusChange',
function (\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
$newStatus = $order->getField('STATUS_ID');
if ($newStatus !== 'RC') {
return; // Нас интересует только статус "Готов к выдаче"
}
// Получаем точку самовывоза из свойства заказа
$pickupStoreProp = $order->getPropertyCollection()
->getItemByOrderPropertyCode('PICKUP_STORE_ID');
$storeId = $pickupStoreProp ? $pickupStoreProp->getValue() : null;
$storeInfo = null;
if ($storeId) {
$storeInfo = \Bitrix\Catalog\StoreTable::getById($storeId)->fetch();
}
// Формируем и отправляем уведомление
\Local\Notifications\ReadyForPickupNotifier::notify($order, $storeInfo);
}
);
Класс уведомления о готовности
// /local/lib/Notifications/ReadyForPickupNotifier.php
namespace Local\Notifications;
use Bitrix\Sale\Order;
class ReadyForPickupNotifier
{
public static function notify(Order $order, ?array $storeInfo): void
{
$userId = $order->getUserId();
$user = \Bitrix\Main\UserTable::getById($userId)->fetch();
$storeName = $storeInfo['TITLE'] ?? 'магазине';
$storeAddress = $storeInfo['ADDRESS'] ?? '';
$orderId = $order->getId();
// Время хранения — из настроек (по умолчанию 5 дней)
$holdDays = (int)\Bitrix\Main\Config\Option::get(
'local.pickup', 'hold_days', 5
);
$holdUntil = date('d.m.Y', strtotime("+{$holdDays} days"));
$message = "Заказ #{$orderId} готов к выдаче в {$storeName}.\n";
if ($storeAddress) {
$message .= "Адрес: {$storeAddress}\n";
}
$message .= "Срок хранения: до {$holdUntil}.";
// Telegram
if (!empty($user['UF_TELEGRAM_CHAT_ID'])) {
\Local\Telegram\BotService::sendMessage(
$user['UF_TELEGRAM_CHAT_ID'],
$message
);
}
// SMS через сервис
$phone = $order->getPropertyCollection()
->getPhone()
?->getValue();
if ($phone) {
\Local\Sms\SmsService::send($phone, $message);
}
// Email — стандартный механизм Битрикс
// Создаём событие для шаблона письма
\CEvent::Send('ORDER_READY_FOR_PICKUP', SITE_ID, [
'ORDER_ID' => $orderId,
'STORE_NAME' => $storeName,
'STORE_ADDRESS' => $storeAddress,
'HOLD_UNTIL' => $holdUntil,
'USER_EMAIL' => $user['EMAIL'],
'USER_NAME' => $user['NAME'],
]);
}
}
Шаблон email-уведомления создаётся в Настройки → Почтовые события → Шаблоны → Добавить с типом события ORDER_READY_FOR_PICKUP.
Автоматический переход при поступлении товара
Если Click & Collect с резервированием — при поступлении отсутствующего товара на склад точки самовывоза заказ должен автоматически переходить в статус «Готов к выдаче»:
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'catalog',
'OnProductUpdate',
function (\Bitrix\Main\Event $event) {
$productId = $event->getParameter('ID');
$fields = $event->getParameter('FIELDS');
if (!isset($fields['QUANTITY']) || $fields['QUANTITY'] <= 0) {
return;
}
// Ищем ожидающие заказы на этот товар с самовывозом
$waitingOrders = \Local\Orders\PickupOrderFinder::getWaiting($productId);
foreach ($waitingOrders as $waitingOrderId) {
$order = \Bitrix\Sale\Order::load($waitingOrderId);
if ($order && $order->getField('STATUS_ID') === 'N') {
$order->setField('STATUS_ID', 'RC');
$order->save();
}
}
}
);
Сроки настройки
Кастомный статус «Готов к выдаче», обработчик события, мультиканальное уведомление (Telegram + SMS + email шаблон) — 4–8 часов. Плюс автоматический переход при поступлении товара — ещё 4–6 часов.







