БесплатноБесплатный аудит сайта и кода на 1С-Битрикс при заказе доработки или поддержки

Управление статусами заказа: конечный автомат состояний

Конечный автомат состояний заказа в интернет-магазине на 1С-Битрикс: статусы, допустимые переходы и обработчики событий

Заказ, который из «доставлен» вдруг вернулся в «новый». Клиент, получивший письмо об отправке дважды. Оплаченный заказ, который менеджер случайно перевёл в «ожидает оплаты», запустив ненужное напоминание. Всё это симптомы одной болезни: статусами заказа никто не управляет системно. Их можно менять как угодно и откуда угодно, и рано или поздно бардак выливается в деньги и нервы.

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

Коротко

  • Бардак со статусами — это следствие отсутствия правил переходов, а не «человеческого фактора».
  • Конечный автомат описывает разрешённые переходы и запрещает всё остальное явными правилами.
  • Страж переходов в 1С-Битрикс — обработчики событий модуля продаж; там же живут побочные эффекты.
  • Модель статусов согласуют с обменом 1С и подкрепляют историей переходов с источником изменения.

Почему статусы заказа выходят из-под контроля

В живом магазине статус заказа меняют многие: клиент в личном кабинете, менеджер в админке, платёжный шлюз колбэком, обмен с 1С, фоновые скрипты и агенты. Пока список статусов есть, а правил переходов нет, каждый из этих источников может выставить любой статус в любой момент.

Дальше включается энтропия. Один переводит заказ назад по воронке, другой выставляет флаг оплаты вручную, третий шлёт уведомление на статус, который уже был. Отдельные действия выглядят безобидно, но вместе дают несогласованное состояние: заказ формально «отгружен», но не оплачен; клиенту ушло три письма; в 1С один статус, на сайте другой. Корень проблемы не в людях, а в отсутствии формальных правил.

Что такое конечный автомат состояний

Конечный автомат состояний (state machine) — простая и мощная модель. У сущности есть конечный набор состояний, в каждый момент она находится ровно в одном, а переходы между состояниями разрешены только по заранее описанным правилам.

Для заказа это значит: есть список статусов и таблица допустимых переходов. Из «нового» можно в «подтверждён» или «отменён». Из «подтверждён» — в «в сборке» или «отменён». Но нельзя из «нового» сразу в «доставлен», и нельзя из «доставлен» вернуться в «новый». Всё, что не разрешено явно, — запрещено. Эта дисциплина превращает хаотичное множество статусов в предсказуемый жизненный цикл.

Главный принцип: разрешено только то, что описано. Не «запрещаем плохие переходы» (их бесконечно много), а «разрешаем хорошие» (их немного и они понятны).
Фоновая обработка через очередь Событиезаказ, оплатаОчередьзадачи в фонеАгент / кронобработкаВнешняя система1С, CRMСтатусвозврат на сайт
Схема: тяжёлые операции не блокируют покупателя — событие кладётся в очередь, фоновый агент обрабатывает его и передаёт во внешнюю систему, а статус возвращается на сайт.

Как статусы устроены в 1С-Битрикс

В 1С-Битрикс жизненный цикл заказа складывается из нескольких измерений. Есть пользовательские статусы заказа, настраиваемые в модуле «Интернет-магазин». Есть флаги оплаты (заказ оплачен или нет) и отгрузки (собран, отгружен). В новой модели заказа оплата и доставка вынесены в отдельные сущности — Payment и Shipment — со своими состояниями.

Штатно платформа хранит статусы и позволяет их менять, но не навязывает правил переходов: почти из любого статуса заказ можно перевести в любой. То есть механизм состояний есть, а конечного автомата поверх него — нет. Наша задача — добавить эту дисциплину, не ломая штатную логику продаж. Про современную работу с сущностями заказа через ORM полезно прочитать в статье про D7 ORM в 1С-Битрикс.

Проектируем жизненный цикл заказа

Перед кодом — схема. Соберите реальные статусы вашего процесса и договоритесь, что каждый из них значит. Типовой каркас:

  1. Новый. Заказ оформлен, ждёт обработки.
  2. Подтверждён. Менеджер или система проверили заказ и наличие.
  3. Ожидает оплаты / оплачен. Состояние платежа для предоплатных схем.
  4. В сборке / отгружен. Состояние отгрузки на складе.
  5. Доставлен / завершён. Заказ выполнен.
  6. Отменён / возврат. Терминальные ветки для несостоявшихся заказов.

Важно отделить измерения: статус выполнения, состояние оплаты и состояние отгрузки часто живут параллельно. Не пытайтесь впихнуть всё в один линейный список статусов — получите комбинаторный взрыв. Лучше несколько небольших автоматов (выполнение, оплата, отгрузка), согласованных между собой.

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

Сердце модели — таблица переходов. Она отвечает на вопрос: из какого статуса в какой можно перейти. Пример для статуса выполнения:

Из статусаДопустимые переходы
НовыйПодтверждён, Отменён
ПодтверждёнВ сборке, Отменён
В сборкеОтгружен, Отменён
ОтгруженДоставлен, Возврат
ДоставленЗавершён, Возврат
Завершён / Отменён— (терминальные)

Эту матрицу выносят в конфигурацию, а не хардкодят по коду: список переходов задан в одном месте, и его легко читать, менять и проверять. Хранить матрицу можно в настройках модуля, отдельном highload-блоке или конфигурационном массиве — важно, что она одна и является единственным источником правды о переходах.

Обработчики событий как страж переходов

Матрица бесполезна, если её никто не проверяет. В 1С-Битрикс страж переходов — обработчики событий модуля продаж: событие изменения заказа и смены статуса. Логика проста:

  1. Перехватить смену. В обработчике поймать факт изменения статуса: старое значение и новое.
  2. Проверить по матрице. Есть ли переход «старый → новый» в таблице допустимых.
  3. Решить судьбу. Разрешён — пропустить; недопустим — отменить смену и залогировать.
  4. Учесть источник. Разным источникам (менеджер, клиент, обмен) могут быть доступны разные переходы.

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

Побочные эффекты на переходах

Смена статуса почти всегда тянет за собой действия: письмо клиенту, задачу менеджеру, проводку, обновление остатков. Главная ошибка — привязывать эти действия к факту «статус равен X», а не к переходу «стал X».

Разница критична. Заказ может пересохраняться в статусе «отправлен» несколько раз — обмен, правка менеджера, фоновый агент. Если письмо об отправке привязано к «статус = отправлен», клиент получит его столько раз, сколько заказ пересохранился. Если привязать к переходу «→ отправлен», письмо уйдёт один раз — в момент реального перехода.

Правило: побочные эффекты вешают на переходы, а не на состояния. Автомат даёт удобную точку срабатывания «именно сейчас произошёл переход A → B» — идеальное место для уведомлений и проводок без дублей.

Согласование с обменом 1С

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

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

История и аудит статусов

Автомат без журнала — полдела. История смены статусов отвечает на вопрос «как заказ оказался в этом состоянии» и незаменима при разборе инцидентов.

Журнал переходов — это и разбор споров с клиентами, и материал для аналитики: сколько заказы «висят» на каждом этапе, где узкие места выполнения. Без истории любая аномалия остаётся загадкой.

Реализация пошагово

  1. Опишите статусы. Соберите реальные статусы процесса и разнесите их по измерениям: выполнение, оплата, отгрузка.
  2. Составьте матрицу переходов. Задайте допустимые переходы для каждого измерения в одном конфигурационном месте.
  3. Повесьте страж. В обработчике события смены статуса проверяйте переход по матрице и отклоняйте недопустимые.
  4. Перенесите эффекты на переходы. Уведомления и проводки привяжите к переходам, а не к значениям статуса.
  5. Согласуйте обмен. Настройте маппинг с 1С и пропускайте изменения из обмена через тот же автомат.
  6. Заведите историю. Логируйте каждый переход с источником и временем, включая отклонённые.
  7. Протестируйте сценарии. Прогоните оплату, отгрузку, отмену, возврат и обмен, проверьте отсутствие дублей уведомлений.

Частые ошибки

Чек-лист внедрения

  1. Статусы описаны. Составлен список статусов по измерениям с понятным смыслом каждого.
  2. Матрица есть. Допустимые переходы заданы в одном конфигурационном источнике.
  3. Страж работает. Обработчик события отклоняет недопустимые переходы независимо от источника.
  4. Эффекты на переходах. Уведомления и проводки срабатывают один раз в момент перехода.
  5. Обмен согласован. Настроен маппинг с 1С, изменения из обмена проходят через автомат.
  6. История ведётся. Каждый переход логируется с источником, временем и результатом.
  7. Роли учтены. Разным источникам доступны разные переходы согласно процессу.
  8. Сценарии протестированы. Оплата, отгрузка, отмена, возврат и обмен проверены без дублей и конфликтов.

Вывод

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

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

Частые вопросы

Что такое конечный автомат состояний применительно к заказу?

Это модель, где заказ в каждый момент находится ровно в одном статусе, а переходы между статусами разрешены только по заранее описанным правилам. Например, из «нового» можно перейти в «подтверждён» или «отменён», но нельзя сразу в «доставлен». Такой подход убирает хаос, когда заказ произвольно скачет между статусами, и делает жизненный цикл предсказуемым и проверяемым.

Разве в 1С-Битрикс нет готовых статусов заказа?

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

Зачем ограничивать переходы, если менеджеры и так знают порядок?

Потому что люди ошибаются, а системы обмена — тем более. Менеджер случайно переведёт оплаченный заказ обратно в «новый», обмен с 1С прилетит с неожиданным статусом, скрипт выставит флаг не вовремя. Каждая такая ошибка запускает не те уведомления, ломает отчётность и деньги. Формальные правила переходов ловят эти ситуации автоматически, не полагаясь на память сотрудников.

Как это связано с обменом заказами с 1С?

Обмен CommerceML двусторонний: статусы и флаги оплаты-отгрузки ходят между сайтом и 1С. Если у сайта и учётной системы разное понимание жизненного цикла заказа, возникают конфликты: 1С возвращает статус, которого сайт не ждёт, или переводит заказ назад по воронке. Конечный автомат помогает согласовать модели: маппинг статусов и правила приёма изменений из обмена делают синхронизацию предсказуемой.

Где в 1С-Битрикс перехватывать смену статуса?

Через обработчики событий модуля продаж — событий изменения заказа и статуса. В обработчике проверяют, разрешён ли переход из текущего статуса в новый, и при недопустимом переходе отменяют его или логируют. Там же вешают побочные эффекты: уведомления, задачи, проводки. Важно держать эту логику в одном месте, а не размазывать проверки по шаблонам и скриптам.

Что делать с побочными эффектами — письмами и уведомлениями?

Привязывать их к переходам, а не к факту «статус равен X». Письмо клиенту об отправке должно уходить один раз при переходе в «отправлен», а не каждый раз, когда заказ пересохраняется в этом статусе. Автомат состояний даёт удобную точку: срабатывание на конкретном переходе. Это защищает от дублей уведомлений и повторных проводок, которые бесят клиентов и путают учёт.

Нужна ли история смены статусов?

Обязательно. История — кто, когда и на какой статус перевёл заказ — это и разбор инцидентов, и защита от споров, и материал для аналитики воронки выполнения. Без журнала вы не восстановите, почему заказ оказался в странном состоянии. Логируйте каждый переход с источником (менеджер, клиент, обмен, скрипт), чтобы любую аномалию можно было отследить до причины.

Не усложнит ли конечный автомат простой магазин?

Для совсем простого магазина с тремя статусами формализация может быть избыточной. Но как только появляются оплата, отгрузка, возвраты, обмен с 1С и несколько ролей сотрудников, неявные правила перестают держать порядок. Автомат состояний не усложняет, а наоборот — заменяет ворох разрозненных проверок и договорённостей одной понятной схемой переходов. Сложность уже есть, автомат её лишь упорядочивает.

Поделиться:

Заказы скачут по статусам, а обмен с 1С конфликтует?

Наведём порядок: спроектируем жизненный цикл заказа, внедрим конечный автомат состояний, обработчики событий и согласуем модель с обменом CommerceML. Рассчитаем работу по вашему магазину.

Игорь Воскресенский

Команда B2Bsite. С 2014 года разрабатываем интернет-магазины и порталы на 1С-Битрикс: проектируем бизнес-логику заказов, статусы и двусторонний обмен с 1С для среднего и крупного бизнеса.

← Все статьи блога