Настройка уведомлений о статусе возврата 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка уведомлений о статусе возврата 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1175
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка уведомлений о статусе возврата 1С-Битрикс

Уведомления при смене статуса возврата — одна из точек, где магазин либо вызывает доверие, либо теряет клиента. Покупатель, ожидающий решения по возврату, беспокоится. Своевременное письмо со статусом снимает звонки в поддержку и формирует положительный опыт даже в ситуации возврата. В Битрикс для этого используется система почтовых шаблонов (b_event_type, b_event_message) в связке с событиями модуля sale.

Механизм уведомлений в Битрикс

Уведомления строятся на трёх уровнях:

  1. Тип почтового события (b_event_type) — определяет набор доступных переменных
  2. Шаблон почтового события (b_event_message) — HTML-тело письма, тема, адресат
  3. Вызов CEvent::Send() — триггер отправки, передаёт значения переменных

Регистрация типов событий для статусов возврата

Один тип события на каждый статус, где нужно уведомлять покупателя:

// /local/install/register_return_events.php
$returnEventTypes = [
    [
        'EVENT_NAME'  => 'RETURN_STATUS_REVIEW',
        'NAME'        => 'Возврат: принят на рассмотрение',
        'DESCRIPTION' => "RETURN_ID, ORDER_ID, ORDER_ACCOUNT_NUMBER, USER_NAME, USER_EMAIL, STATUS_NAME",
        'SORT'        => 100,
    ],
    [
        'EVENT_NAME'  => 'RETURN_STATUS_NEED_DOCS',
        'NAME'        => 'Возврат: требуются документы',
        'DESCRIPTION' => "RETURN_ID, ORDER_ID, ORDER_ACCOUNT_NUMBER, USER_NAME, USER_EMAIL, STATUS_NAME, MANAGER_COMMENT",
        'SORT'        => 110,
    ],
    [
        'EVENT_NAME'  => 'RETURN_STATUS_APPROVED',
        'NAME'        => 'Возврат: одобрен',
        'DESCRIPTION' => "RETURN_ID, ORDER_ID, REFUND_AMOUNT, SHIPPING_INSTRUCTIONS",
        'SORT'        => 120,
    ],
    [
        'EVENT_NAME'  => 'RETURN_STATUS_RECEIVED',
        'NAME'        => 'Возврат: товар получен на склад',
        'DESCRIPTION' => "RETURN_ID, ORDER_ID, REFUND_AMOUNT",
        'SORT'        => 130,
    ],
    [
        'EVENT_NAME'  => 'RETURN_STATUS_REFUND',
        'NAME'        => 'Возврат: деньги возвращены',
        'DESCRIPTION' => "RETURN_ID, ORDER_ID, REFUND_AMOUNT, REFUND_DATE, PAYMENT_METHOD",
        'SORT'        => 140,
    ],
    [
        'EVENT_NAME'  => 'RETURN_STATUS_REJECTED',
        'NAME'        => 'Возврат: отклонён',
        'DESCRIPTION' => "RETURN_ID, ORDER_ID, MANAGER_COMMENT, APPEAL_INSTRUCTIONS",
        'SORT'        => 150,
    ],
];

$eventType = new \CEventType();

foreach ($returnEventTypes as $type) {
    $existing = \CEventType::GetList(['EVENT_NAME' => $type['EVENT_NAME']])->Fetch();
    if (!$existing) {
        $eventType->Add(array_merge($type, ['LID' => LANGUAGE_ID]));
    }
}

Отправка уведомления при смене статуса

namespace Local\Returns;

class Notifications
{
    private const STATUS_EVENT_MAP = [
        'REVIEW'    => 'RETURN_STATUS_REVIEW',
        'NEED_DOCS' => 'RETURN_STATUS_NEED_DOCS',
        'APPROVED'  => 'RETURN_STATUS_APPROVED',
        'RECEIVED'  => 'RETURN_STATUS_RECEIVED',
        'REFUND'    => 'RETURN_STATUS_REFUND',
        'REJECTED'  => 'RETURN_STATUS_REJECTED',
    ];

    public static function sendStatusChange(int $returnId, string $newStatus): void
    {
        $eventName = self::STATUS_EVENT_MAP[$newStatus] ?? null;
        if (!$eventName) return;

        $data = self::buildEventData($returnId, $newStatus);
        if (!$data) return;

        \CEvent::Send($eventName, SITE_ID, $data);
    }

    private static function buildEventData(int $returnId, string $status): ?array
    {
        $return = \Bitrix\Sale\OrderReturnTable::getList([
            'filter' => ['ID' => $returnId],
            'select' => ['ID', 'ORDER_ID', 'REFUND_AMOUNT', 'STATUS_ID', 'MANAGER_COMMENT'],
        ])->fetch();

        if (!$return) return null;

        $order = \Bitrix\Sale\Order::load($return['ORDER_ID']);
        if (!$order) return null;

        $user = \CUser::GetByID($order->getUserId())->Fetch();

        $data = [
            'RETURN_ID'           => $returnId,
            'ORDER_ID'            => $return['ORDER_ID'],
            'ORDER_ACCOUNT_NUMBER'=> $order->getField('ACCOUNT_NUMBER'),
            'USER_NAME'           => trim(($user['NAME'] ?? '') . ' ' . ($user['LAST_NAME'] ?? '')),
            'USER_EMAIL'          => $user['EMAIL'] ?? '',
            'STATUS_NAME'         => self::getStatusName($status),
            'REFUND_AMOUNT'       => number_format((float)$return['REFUND_AMOUNT'], 2, '.', ' ') . ' руб.',
            'MANAGER_COMMENT'     => $return['MANAGER_COMMENT'] ?? '',
            'RETURN_URL'          => self::getReturnUrl($returnId),
        ];

        // Специфичные данные для статусов
        if ($status === 'APPROVED') {
            $data['SHIPPING_INSTRUCTIONS'] = self::getShippingInstructions();
        }

        if ($status === 'REFUND') {
            $data['REFUND_DATE']    = (new \Bitrix\Main\Type\DateTime())->format('d.m.Y');
            $data['PAYMENT_METHOD'] = self::getPaymentMethodName($order);
        }

        if ($status === 'REJECTED') {
            $data['APPEAL_INSTRUCTIONS'] = 'Вы можете связаться с нами по телефону +7 (800) 555-35-35';
        }

        return $data;
    }

    private static function getStatusName(string $statusId): string
    {
        $result = \CSaleOrderReturnStatus::GetByID($statusId);
        return $result['NAME'] ?? $statusId;
    }

    private static function getReturnUrl(int $returnId): string
    {
        return 'https://' . SITE_SERVER_NAME . '/personal/returns/' . $returnId . '/';
    }
}

Интеграция с обработчиком смены статуса

// В init.php — вешаем уведомления на события модуля sale
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderReturnStatusChange',
    function (\Bitrix\Main\Event $event) {
        $returnId  = $event->getParameter('RETURN_ID');
        $newStatus = $event->getParameter('NEW_STATUS_ID');

        \Local\Returns\Notifications::sendStatusChange($returnId, $newStatus);
    }
);

SMS-уведомления

Для критичных статусов (деньги возвращены, одобрен) добавляем SMS через SMSC, SMS.ru или другого провайдера:

class SmsNotifier
{
    private const SMS_STATUSES = ['APPROVED', 'REFUND', 'REJECTED'];

    public static function maybeSend(int $returnId, string $status): void
    {
        if (!in_array($status, self::SMS_STATUSES, true)) return;

        $phone = self::getCustomerPhone($returnId);
        if (!$phone) return;

        $text = self::buildSmsText($returnId, $status);

        $client = new \Local\Sms\SmsClient();
        $client->send($phone, $text);
    }

    private static function buildSmsText(int $returnId, string $status): string
    {
        return match ($status) {
            'APPROVED' => "Возврат #{$returnId} одобрен. Отправьте товар по адресу: ...",
            'REFUND'   => "Возврат #{$returnId}: деньги отправлены. Поступят на карту в течение 3-5 дней.",
            'REJECTED' => "Возврат #{$returnId} отклонён. Причина в письме на вашу почту.",
            default    => "Статус заявки на возврат #{$returnId} изменён.",
        };
    }
}

Push-уведомления в личном кабинете

Кроме email и SMS — уведомления в браузере через Web Push или через механизм уведомлений личного кабинета:

// Добавляем уведомление в ЛК Битрикс (если есть модуль im или кастомный)
class LkNotifier
{
    public static function notify(int $userId, int $returnId, string $status): void
    {
        // Через модуль im (корпоративный портал)
        if (\Bitrix\Main\Loader::includeModule('im')) {
            \CIMNotify::Add([
                'FROM_USER_ID' => 0, // от системы
                'TO_USER_ID'   => $userId,
                'NOTIFY_TYPE'  => IM_NOTIFY_SYSTEM,
                'NOTIFY_MODULE'=> 'local.returns',
                'NOTIFY_TAG'   => 'RETURN_' . $returnId,
                'NOTIFY_MESSAGE' => "Статус заявки на возврат #{$returnId} изменён на «" .
                    \Local\Returns\Notifications::getStatusName($status) . "»",
                'NOTIFY_MESSAGE_OUT' => 'Статус заявки изменён',
            ]);
        }
    }
}

Шаблон письма: статус «Одобрен»

Пример HTML-шаблона для события RETURN_STATUS_APPROVED:

Тема: Ваша заявка на возврат #[RETURN_ID] одобрена

Уважаемый [USER_NAME],

Ваша заявка на возврат товара по заказу [ORDER_ACCOUNT_NUMBER] одобрена.

Сумма к возврату: [REFUND_AMOUNT]

Для завершения возврата, пожалуйста, отправьте товар по адресу:
[SHIPPING_INSTRUCTIONS]

После получения товара на нашем складе деньги будут переведены в течение 3 рабочих дней.

Отслеживать статус заявки: [RETURN_URL]

Состав работ

  • Регистрация типов почтовых событий под каждый статус
  • HTML-шаблоны писем: тема, тело, списки переменных
  • Обработчик OnSaleOrderReturnStatusChange → вызов CEvent::Send()
  • SMS-уведомления для критичных статусов
  • Уведомления в личном кабинете через IM-модуль или кастомный механизм
  • Тестирование: проверка всех статусных переходов и отправки писем

Сроки: полный набор уведомлений под все статусы — 1–2 недели.