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

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка статусов возврата на 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1173
  • 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С Предприятие для компании МИРСАНБЕЛ
    745
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

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

Статусы возврата в Битрикс — это не просто метки в базе данных. От того, как они настроены, зависит весь бизнес-процесс: что видит покупатель, какие действия доступны менеджеру на каждом этапе, когда автоматически срабатывают уведомления и интеграции с внешними системами. Стандартный набор из коробки минимален и не покрывает реальные сценарии.

Управление статусами: где это живёт

Статусы возврата хранятся в таблице b_sale_order_return_status и управляются через класс \CSaleOrderReturnStatus. Административный интерфейс: Интернет-магазин → Статусы возвратов.

Поля статуса:

  • ID — строковый идентификатор (WAIT, REVIEW, APPROVED и т.д.)
  • NAME — название для отображения
  • DESCRIPTION — описание для внутреннего использования
  • SORT — порядок отображения
  • COLOR — цвет метки в интерфейсе (hex)
  • NOTIFY — флаг: отправлять ли уведомление покупателю при переходе в этот статус
  • TEMPLATE — шаблон email-уведомления

Создание кастомного набора статусов

// /local/install/return_statuses.php — скрипт установки статусов
$statuses = [
    [
        'ID'          => 'WAIT',
        'NAME'        => 'Ожидает рассмотрения',
        'DESCRIPTION' => 'Заявка поступила, не обработана',
        'SORT'        => 100,
        'COLOR'       => '#f0ad4e',
        'NOTIFY'      => 'N',
    ],
    [
        'ID'          => 'REVIEW',
        'NAME'        => 'На рассмотрении',
        'DESCRIPTION' => 'Менеджер проверяет заявку',
        'SORT'        => 200,
        'COLOR'       => '#5bc0de',
        'NOTIFY'      => 'Y',
        'TEMPLATE'    => 'RETURN_STATUS_REVIEW',
    ],
    [
        'ID'          => 'NEED_DOCS',
        'NAME'        => 'Нужны документы',
        'DESCRIPTION' => 'Запрошены дополнительные документы или фото',
        'SORT'        => 250,
        'COLOR'       => '#d9534f',
        'NOTIFY'      => 'Y',
        'TEMPLATE'    => 'RETURN_STATUS_NEED_DOCS',
    ],
    [
        'ID'          => 'APPROVED',
        'NAME'        => 'Одобрен',
        'DESCRIPTION' => 'Возврат одобрен, ожидаем отправку товара',
        'SORT'        => 300,
        'COLOR'       => '#5cb85c',
        'NOTIFY'      => 'Y',
        'TEMPLATE'    => 'RETURN_STATUS_APPROVED',
    ],
    [
        'ID'          => 'RECEIVED',
        'NAME'        => 'Товар получен',
        'DESCRIPTION' => 'Склад принял возвращённый товар',
        'SORT'        => 400,
        'COLOR'       => '#337ab7',
        'NOTIFY'      => 'Y',
        'TEMPLATE'    => 'RETURN_STATUS_RECEIVED',
    ],
    [
        'ID'          => 'REFUND',
        'NAME'        => 'Деньги возвращены',
        'DESCRIPTION' => 'Платёж проведён',
        'SORT'        => 500,
        'COLOR'       => '#3c763d',
        'NOTIFY'      => 'Y',
        'TEMPLATE'    => 'RETURN_STATUS_REFUND',
    ],
    [
        'ID'          => 'EXCHANGE',
        'NAME'        => 'Обмен',
        'DESCRIPTION' => 'Вместо возврата денег произведён обмен',
        'SORT'        => 450,
        'COLOR'       => '#8a6d3b',
        'NOTIFY'      => 'Y',
        'TEMPLATE'    => 'RETURN_STATUS_EXCHANGE',
    ],
    [
        'ID'          => 'REJECTED',
        'NAME'        => 'Отклонён',
        'DESCRIPTION' => 'Возврат отклонён',
        'SORT'        => 600,
        'COLOR'       => '#a94442',
        'NOTIFY'      => 'Y',
        'TEMPLATE'    => 'RETURN_STATUS_REJECTED',
    ],
];

foreach ($statuses as $statusData) {
    // Проверяем, не существует ли уже
    $existing = \CSaleOrderReturnStatus::GetByID($statusData['ID']);
    if ($existing) {
        \CSaleOrderReturnStatus::Update($statusData['ID'], $statusData);
    } else {
        \CSaleOrderReturnStatus::Add($statusData);
    }
}

Матрица переходов между статусами

Не все переходы должны быть доступны. Например, нельзя перейти из «Деньги возвращены» обратно в «Ожидает рассмотрения». Реализуем матрицу разрешённых переходов:

namespace Local\Returns;

class StatusTransitionMatrix
{
    // [текущий статус] => [разрешённые следующие статусы]
    private const ALLOWED_TRANSITIONS = [
        'WAIT'      => ['REVIEW', 'REJECTED'],
        'REVIEW'    => ['NEED_DOCS', 'APPROVED', 'REJECTED'],
        'NEED_DOCS' => ['REVIEW', 'REJECTED'],
        'APPROVED'  => ['RECEIVED', 'EXCHANGE'],
        'RECEIVED'  => ['REFUND', 'EXCHANGE'],
        'REFUND'    => [],       // терминальный статус
        'EXCHANGE'  => [],       // терминальный статус
        'REJECTED'  => ['WAIT'], // можно пересмотреть решение
    ];

    // Переходы, доступные только администратору
    private const ADMIN_ONLY = [
        'REJECTED' => ['WAIT'],
    ];

    public function canTransition(string $from, string $to, bool $isAdmin = false): bool
    {
        $allowed = self::ALLOWED_TRANSITIONS[$from] ?? [];

        if (!in_array($to, $allowed, true)) {
            return false;
        }

        // Проверяем ограничения по роли
        if (isset(self::ADMIN_ONLY[$from]) && in_array($to, self::ADMIN_ONLY[$from], true)) {
            return $isAdmin;
        }

        return true;
    }

    public function getAvailableTransitions(string $from, bool $isAdmin = false): array
    {
        $transitions = self::ALLOWED_TRANSITIONS[$from] ?? [];

        if (!$isAdmin) {
            $adminOnly = self::ADMIN_ONLY[$from] ?? [];
            $transitions = array_diff($transitions, $adminOnly);
        }

        return $transitions;
    }
}

Валидация перехода при смене статуса

// Перехватываем попытку сменить статус
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnBeforeSaleOrderReturnStatusChange',
    function (\Bitrix\Main\Event $event) {
        $newStatus = $event->getParameter('STATUS_ID');
        $return    = $event->getParameter('ENTITY');
        $oldStatus = $return->getField('STATUS_ID');

        $isAdmin = \CUser::IsAdmin();
        $matrix  = new \Local\Returns\StatusTransitionMatrix();

        if (!$matrix->canTransition($oldStatus, $newStatus, $isAdmin)) {
            $result = new \Bitrix\Main\EventResult(
                \Bitrix\Main\EventResult::ERROR,
                "Переход из '{$oldStatus}' в '{$newStatus}' недопустим"
            );
            return $result;
        }

        // Валидация данных для конкретных статусов
        if ($newStatus === 'APPROVED') {
            if (!$return->getField('REFUND_AMOUNT')) {
                return new \Bitrix\Main\EventResult(
                    \Bitrix\Main\EventResult::ERROR,
                    "Укажите сумму к возврату перед одобрением"
                );
            }
        }

        if ($newStatus === 'REJECTED') {
            if (!$return->getField('MANAGER_COMMENT')) {
                return new \Bitrix\Main\EventResult(
                    \Bitrix\Main\EventResult::ERROR,
                    "При отклонении необходимо указать причину"
                );
            }
        }
    }
);

Локализация: названия статусов на нескольких языках

Для мультиязычных сайтов название статуса для покупателя берётся из языкового файла:

// /local/lang/ru/lib/returns/status_labels.php
$MESS['RETURN_STATUS_WAIT']      = 'Ожидает рассмотрения';
$MESS['RETURN_STATUS_REVIEW']    = 'На рассмотрении';
$MESS['RETURN_STATUS_NEED_DOCS'] = 'Требуются документы';
$MESS['RETURN_STATUS_APPROVED']  = 'Одобрен';
$MESS['RETURN_STATUS_RECEIVED']  = 'Товар получен';
$MESS['RETURN_STATUS_REFUND']    = 'Деньги возвращены';
$MESS['RETURN_STATUS_EXCHANGE']  = 'Обмен';
$MESS['RETURN_STATUS_REJECTED']  = 'Отклонён';

// /local/lang/en/lib/returns/status_labels.php
$MESS['RETURN_STATUS_WAIT']      = 'Pending review';
$MESS['RETURN_STATUS_APPROVED']  = 'Approved';
// ...

В шаблоне личного кабинета:

$statusLabel = \Bitrix\Main\Localization\Loc::getMessage(
    'RETURN_STATUS_' . $returnStatusId
) ?: $returnStatusId;

Состав работ

  • Проектирование набора статусов под конкретный бизнес-процесс
  • Установочный скрипт создания/обновления статусов
  • Матрица допустимых переходов с ролевыми ограничениями
  • Валидатор перехода через событие OnBeforeSaleOrderReturnStatusChange
  • Шаблоны email-уведомлений для каждого «публичного» статуса
  • Локализация меток для личного кабинета

Сроки: настройка статусов и матрицы переходов — 3–7 рабочих дней.