Представьте: менеджер переводит заказ в «доставляется», хотя товар ещё не собрали. Или отменяет уже оплаченный заказ, вынуждая бухгалтерию оформлять возврат через 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 месяцев на все доработки. Обсудим ваш бизнес-процесс и предложим решение. Получите консультацию прямо сейчас.







