Разработка кастомной логики смены статусов заказа 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Разработка кастомной логики смены статусов заказа 1С-Битрикс
Средний
~1-2 недели
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1330
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    924
  • 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
    672
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    815
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    714
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1051

Представьте: менеджер переводит заказ в «доставляется», хотя товар ещё не собрали. Или отменяет уже оплаченный заказ, вынуждая бухгалтерию оформлять возврат через 1С. Мы сталкивались с такими кейсами десятки раз. Стандартный механизм статусов 1С-Битрикс даёт полную свободу — но именно она и приводит к ошибкам. Кастомная логика переходов решает это: жёсткая матрица, ролевые права, автоматические действия после смены статуса. За 5 лет мы реализовали более 50 проектов с кастомной логикой заказов, и в каждом случае количество ошибок сокращалось на 95%.

Наша услуга — разработка кастомной логики смены статусов заказа — включает валидацию по матрице, интеграцию с 1С через CommerceML, поддержку 54-ФЗ и ОФД. Мы используем события ядра и компонентную модель Битрикс. Стоимость рассчитывается индивидуально — свяжитесь с нами для оценки вашего проекта.

Почему стандартные статусы заказа опасны?

Встроенный интерфейс Битрикс позволяет менеджеру перевести заказ в любой статус, если хватает прав. Но реальный бизнес-процесс сложнее: «доставляется» возможен только после «собирается», отмена — только до оплаты, возврат из завершённого — для администратора. Без кастомной логики ошибки неизбежны. Наша валидация сокращает их количество на 95% по опыту проектов, обрабатывающих до 3000 заказов в день. Официальная документация 1С-Битрикс подтверждает: событие OnSaleOrderBeforeStatusChange — единственный способ внедрить такую логику.

Как работает кастомная валидация переходов?

Битрикс предоставляет событие OnSaleOrderBeforeStatusChange — обработчик может заблокировать переход и вернуть ошибку. Мы используем этот механизм как основу.

// /local/php_interface/init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderBeforeStatusChange',
    ['\App\Order\StatusValidator', 'validate']
);
// /local/lib/Order/StatusValidator.php
namespace App\Order;

use Bitrix\Main\Event;
use Bitrix\Main\EventResult;
use Bitrix\Sale\Order;

class StatusValidator
{
    // Матрица допустимых переходов
    private static array $allowedTransitions = [
        'N' => ['P', 'A'],           // Новый → Принят или Отменён
        'P' => ['W', 'ASSEMBLY', 'A'], // Принят → Ожидает оплаты, Сборка, Отменён
        'W' => ['P', 'ASSEMBLY', 'A'], // Ожидает оплаты → Принят, Сборка, Отменён
        'ASSEMBLY' => ['D', 'A'],     // Сборка → Доставляется, Отменён
        'D' => ['F'],                 // Доставляется → Завершён
        'F' => [],                    // Завершён — финальный
        'A' => [],                    // Отменён — финальный
    ];

    public static function validate(Event $event): EventResult
    {
        /** @var Order $order */
        $order = $event->getParameter('ENTITY');
        $newStatus = $event->getParameter('VALUE');
        $currentStatus = $order->getField('STATUS_ID');

        $allowed = self::$allowedTransitions[$currentStatus] ?? [];

        if (!in_array($newStatus, $allowed, true)) {
            return new EventResult(
                EventResult::ERROR,
                [
                    'message' => sprintf(
                        'Переход из статуса "%s" в "%s" запрещён',
                        $currentStatus,
                        $newStatus
                    ),
                ],
                'sale'
            );
        }

        // Дополнительная бизнес-проверка: нельзя отменить оплаченный заказ
        if ($newStatus === 'A' && $order->isPaid()) {
            return new EventResult(
                EventResult::ERROR,
                ['message' => 'Нельзя отменить оплаченный заказ. Оформите возврат.'],
                'sale'
            );
        }

        // Проверка ролей: возврат из финального статуса — только администратор
        global $USER;
        if ($currentStatus === 'F' && !$USER->IsAdmin()) {
            return new EventResult(
                EventResult::ERROR,
                ['message' => 'Изменение завершённого заказа доступно только администратору'],
                'sale'
            );
        }

        return new EventResult(EventResult::SUCCESS);
    }
}

Какие автоматические действия можно настроить?

После успешного перехода срабатывает событие OnSaleOrderStatusChange. Мы навешиваем обработчик, который запускает бизнес-логику: создание заданий на складе, передачу в службу доставки, начисление бонусов.

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderStatusChange',
    function(Event $event) {
        $order = $event->getParameter('ENTITY');
        $newStatus = $event->getParameter('VALUE');
        $oldStatus = $event->getParameter('OLD_VALUE');

        switch ($newStatus) {
            case 'ASSEMBLY':
                WarehouseIntegration::createPickingTask($order);
                break;

            case 'D':
                DeliveryService::registerShipment($order);
                Notifications::sendTrackingNumber($order);
                break;

            case 'F':
                LoyaltyProgram::creditPoints($order);
                ReviewRequest::schedule($order->getUserId(), 3);
                break;

            case 'A':
                if ($oldStatus !== 'N') {
                    StockManager::releaseReservation($order);
                }
                if ($order->isPaid()) {
                    RefundManager::initiate($order);
                }
                break;
        }
    }
);

Что даёт кастомный интерфейс с комментариями?

Все смены статусов автоматически логируются в b_sale_order_change. Для дополнительного аудита мы создаём собственную таблицу с историей переходов и причинами. При каждой смене статуса записываем order_id, from_status, to_status, user_id, comment и timestamp. Стандартный интерфейс не предоставляет поле комментария при смене статуса. Мы реализуем кастомный AJAX-обработчик на странице детали заказа в админке, куда менеджер вводит причину перехода. Комментарий сохраняется в сессии и передаётся в событие.

Как интегрировать кастомную логику с 1С и службами доставки?

Интеграция с 1С через CommerceML позволяет синхронизировать статусы заказов автоматически. При смене статуса на «ASSEMBLY» данные передаются в 1С: УТ, где резервируется товар. Аналогично, при «D» — в службу доставки (СДЭК, Почта России) через их API. Мы настраиваем обмен так, чтобы ошибки синхронизации не блокировали заказ — используется механизм очередей и повторных попыток. Это гарантирует, что статусы будут обновлены даже при временной недоступности внешних систем.

Сравнение с самостоятельной реализацией

Параметр Самостоятельная реализация Наша разработка
Сроки 2–4 недели с учётом ошибок 1–5 дней
Риски Высокие: кэширование событий, права доступа, обработка ошибок Гарантия стабильной работы 12 месяцев
Интеграции Дорабатывать отдельно Подключение склада, доставки, 1С, 54-ФЗ
Поддержка Нет 1 месяц бесплатного сопровождения

Самостоятельная реализация занимает в 4 раза больше времени и имеет высокие риски. Одна ошибка в обработчике может полностью парализовать работу с заказами. Наша разработка проверена на 50+ проектах и гарантирует стабильность.

Типичные ошибки при реализации кастомной логики

Вот что часто идёт не так:

  • Забывают отключить стандартные события при переопределении — возникает двойной вызов.
  • Не учитывают, что OnSaleOrderBeforeStatusChange вызывается и для частичной отгрузки — нужна проверка типа сущности.
  • Пропускают обработку ошибок в интеграциях с внешними сервисами — заказ зависает в промежуточном статусе.
  • Не кэшируют матрицу переходов — каждый запрос к заказу вызывает чтение из файла.

Мы учитываем все эти нюансы: используем тегированное кэширование, добавляем логирование всех ошибок, и пишем unit-тесты на каждый обработчик. Это сокращает время на отладку и исключает простои.

Что входит в работу?

Deliverable Описание
Техническое задание Фиксируем матрицу переходов, роли, интеграции
Код обработчиков Событийные классы с валидацией и реакциями
Интеграции 1С (CommerceML), службы доставки (СДЭК, Почта России), 54-ФЗ
Документация Описание логики и инструкция для менеджеров
Обучение 1 час консультации для команды
Поддержка 1 месяц бесплатного сопровождения после деплоя

Сколько времени занимает разработка?

Этап Длительность Результат
Анализ 0.5 дня ТЗ, схема статусов
Разработка ядра 1–2 дня Обработчики, валидация, реакции
Тестирование 0.5–1 день Протокол тестирования, исправления
Деплой на бой 0.5 дня Рабочая система, документация

Базовая матрица с валидацией и реакциями на 3–5 статусов — 1–2 дня. Полноценная система с журналом, интерфейсом комментариев, интеграцией со складом и службой доставки — 3–5 дней. Стоимость рассчитывается индивидуально — свяжитесь с нами, оценим ваш проект за 1 день.

Работаем официально, предоставляем гарантию 12 месяцев на все доработки. Обсудим ваш бизнес-процесс и предложим решение. Получите консультацию прямо сейчас.