Уявіть: менеджер переводить замовлення в «доставляється», хоча товар ще не зібрали. Або скасовує вже оплачене замовлення, змушуючи бухгалтерію оформлювати повернення через 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-тести на кожен обробник. Це скорочує час на налагодження та виключає простої.
Що входить в роботу?
| Результат | Опис |
|---|---|
| Технічне завдання | Фіксуємо матрицю переходів, ролі, інтеграції |
| Код обробників | Подійні класи з валідацією та реакціями |
| Інтеграції | 1С (CommerceML), служби доставки (СДЕК, Пошта Росії), 54-ФЗ |
| Документація | Опис логіки та інструкція для менеджерів |
| Навчання | 1 година консультації для команди |
| Підтримка | 1 місяць безкоштовного супроводу після деплою |
Скільки часу займає розробка?
| Етап | Тривалість | Результат |
|---|---|---|
| Аналіз | 0.5 дня | ТЗ, схема статусів |
| Розробка ядра | 1–2 дні | Обробники, валідація, реакції |
| Тестування | 0.5–1 день | Протокол тестування, виправлення |
| Деплой на бой | 0.5 дня | Робоча система, документація |
Базова матриця з валідацією та реакціями на 3–5 статусів — 1–2 дні. Повноцінна система з журналом, інтерфейсом коментарів, інтеграцією зі складом та службою доставки — 3–5 днів. Вартість розраховується індивідуально — зв'яжіться з нами, оцінимо ваш проєкт за 1 день.
Працюємо офіційно, надаємо гарантію 12 місяців на всі доробки. Обговоримо ваш бізнес-процес і запропонуємо рішення. Отримайте консультацію прямо зараз.







