Налаштування сповіщення про готовність замовлення до видачі 1С-Бітрікс
Замовлення з самовивозом зібрано на складі, але покупець про це не знає. Він приходить надто рано — товар ще не готовий. Або надто пізно — менеджер вже встиг зняти резерв. Сповіщення «Ваше замовлення готове до видачі» має надходити саме в той момент, коли співробітник складу змінює статус замовлення на відповідний, — через SMS, Telegram або email.
Статус замовлення як тригер
У 1С-Бітрікс немає виділеного статусу «Готово до видачі» з коробки. Створюємо кастомний статус:
Магазин → Налаштування → Статуси замовлень → Додати:
- Символьний код:
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 — стандартний механізм 1С-Бітрікс
// Створюємо подію для шаблону листа
\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 годин.







