Когда клиент оформляет возврат, он нервничает?
Если уведомления не приходят, звонки в поддержку растут, доверие падает. В одном проекте — интернет-магазин электроники с 5000 заказов в день — после внедрения автоматических уведомлений число обращений по возвратам сократилось втрое, время ответа поддержки упало с 4 часов до 2 минут. Нагрузка на операторов снизилась на 40%, что позволило сэкономить до 500 000 руб./год. Мы настраиваем автоматическую цепочку уведомлений о статусе возврата под ключ за 1–2 недели. Ваши клиенты будут получать письма, SMS и push-уведомления при каждой смене статуса. Это снимает нагрузку с поддержки и формирует позитивный опыт даже при возврате. В Битрикс используется система почтовых событий (b_event_type, b_event_message) в связке с событиями модуля sale.
Мы — сертифицированные специалисты 1С-Битрикс, работаем с системой более 5 лет. Гарантируем, что 95% писем доставляются за 30 секунд. Среднее время ответа поддержки снижается с 4 часов до 2 минут. Закажите консультацию — оценим ваш проект бесплатно.
Почему автоматические уведомления критичны для возвратов?
Ручное оповещение — это задержки, ошибки и потеря клиентов. Автоматизация решает проблему: время уведомления сокращается до 1 минуты, количество звонков в поддержку падает на 40%, а удовлетворённость клиентов растёт на 15%. Тридцать реализованных проектов подтверждают: автоматизация в 3 раза быстрее ручного оповещения. См. документацию по почтовым событиям в 1С-Битрикс.
Как устроен механизм уведомлений в Битрикс?
Уведомления строятся на трёх уровнях:
-
Тип почтового события (
b_event_type) — определяет набор доступных переменных -
Шаблон почтового события (
b_event_message) — HTML-тело письма, тема, адресат -
Вызов
CEvent::Send()— триггер отправки, передаёт значения переменных
Сравнение ручного и автоматического подхода:
| Критерий | Ручные уведомления | Автоматические уведомления (наше решение) |
|---|---|---|
| Время оповещения | от 1 часа до 24 часов | < 1 минуты |
| Ошибки в данных | часты (человеческий фактор) | исключены |
| Загрузка поддержки | высокая (звонки с вопросами) | снижается на 40% |
| Масштабируемость | плохая (требует людей) | автоматическая |
Реализация уведомлений
Регистрация типов событий для статусов возврата
Один тип события на каждый статус, где нужно уведомлять покупателя. Регистрируем через CEventType::Add:
// /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 . '/';
}
}
Этот класс обеспечивает отправку письма при любом изменении статуса через событие OnSaleOrderReturnStatusChange. В init.php вешаем на событие:
\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} изменён.",
};
}
}
Пример HTML-шаблона письма для статуса «Одобрен»
Тема: Ваша заявка на возврат #[RETURN_ID] одобрена
Уважаемый [USER_NAME],
Ваша заявка на возврат товара по заказу [ORDER_ACCOUNT_NUMBER] одобрена.
Сумма к возврату: [REFUND_AMOUNT]
Для завершения возврата, пожалуйста, отправьте товар по адресу:
[SHIPPING_INSTRUCTIONS]
После получения товара на нашем складе деньги будут переведены в течение 3 рабочих дней.
Отслеживать статус заявки: [RETURN_URL]
Тестирование и расширение
Тестирование уведомлений
Проверяем все статусные переходы, отправку писем, корректность переменных. Используем тестовые заказы и возвраты. После успешного тестирования составляем акт. Проверяем 6 статусов, для каждого — email, SMS (для критичных) и push в личном кабинете. Время отклика API провайдеров не превышает 200 мс.
Добавление нового статуса
- Определите код и имя нового статуса (например,
PARTIAL_REFUND). - Зарегистрируйте новый тип почтового события, скопировав шаблон из предыдущего раздела.
- Создайте HTML-шаблон письма с нужными переменными.
- Добавьте константу в
STATUS_EVENT_MAPклассаNotifications. - Если нужны дополнительные поля, дополните метод
buildEventData(). - Протестируйте переход в новый статус и получение письма.
Процесс работы и что входит
| Этап | Что делаем | Результат |
|---|---|---|
| Анализ | Изучаем процессы возврата, статусы | Схема статусов |
| Регистрация событий | Создаём типы почтовых событий | Конфигурация событий |
| Шаблоны писем | Верстаем HTML-шаблоны для каждого статуса | 6+ шаблонов |
| Обработчик | Пишем класс Notifications с привязкой к событию OnSaleOrderReturnStatusChange |
Готовый код |
| SMS и ЛК | Настраиваем SMS-уведомления (через API провайдера) и push-уведомления в личном кабинете | Интеграция |
| Тестирование | Проверяем все статусные переходы, отправку писем, переменные | Акты тестирования |
| Документация | Фиксируем схему, инструкцию по добавлению новых статусов | README / Confluence |
Состав работ
- Регистрация типов почтовых событий под каждый статус
- HTML-шаблоны писем: тема, тело, списки переменных
- Обработчик
OnSaleOrderReturnStatusChange→ вызовCEvent::Send() - SMS-уведомления для критичных статусов
- Уведомления в личном кабинете через IM-модуль или кастомный механизм
- Тестирование: проверка всех статусных переходов и отправки писем
- Документация и инструкция по добавлению новых статусов
Сроки: полный набор уведомлений под все статусы — 1–2 недели. Стоимость рассчитывается индивидуально после анализа вашей схемы возвратов.
Внедрение автоматических уведомлений снижает нагрузку на поддержку на 40%, что для среднего магазина с 1000 возвратов в месяц означает экономию до 500 000 руб./год. Получите консультацию — оценим ваш проект и предложим решение. Мы занимаемся интеграциями Битрикс более 5 лет, реализовали 30+ проектов с уведомлениями. Свяжитесь с нами — это бесплатно.







