Сделка меняет стадию — заказ едет следом: как заменили ручную рутину модулем
На портале Битрикс24 с включённым интернет-магазином стадия сделки и статус заказа расходились, и менеджеры сводили их руками. Мы сделали односторонний синхронизатор сделка → заказ. Рассказываем про главные грабли платформы — почему нельзя просто «отменить заказ» — и как прошёл бэкфилл на 974 заказа с нулём расхождений.
Задача
Коробочный Битрикс24 с модулем «Интернет-магазин»: у сделки своя стадия, у привязанного заказа — свой статус, оплаты и отгрузки. На практике они постоянно расходились, и менеджеры приводили заказ в соответствие вручную. Нужно было: при смене стадии сделки автоматически подтягивать заказ к семантике этой стадии (успех / провал / в работе), строго в одну сторону — сделка управляет заказом, не наоборот.
Главные грабли
Наивное «поменяли стадию — отменили или закрыли заказ» на Битриксе не работает: платформа не даёт отменить заказ, пока по нему есть оплаченные или отгружённые сущности. Значит нужен строгий порядок операций (сначала снять оплату/отгрузку, потом статус) и идемпотентность — иначе события начинают гонять друг друга по кругу, а «кривой» заказ роняет весь прогон.
Что сделали
Написали локальный модуль-синхронизатор: чистое ядро (расчёт целевого состояния, диф заказа, защита от повторного входа) плюс тонкие адаптеры к Битриксу. Реакция — на событие OnAfterCrmDealUpdate, и только когда в обновлении реально менялась стадия. Режим сознательно ограничили: склад (DEDUCTED) не трогаем, оплату отражаем флагом. Идемпотентность исключает петлю событий.
При выкатке вылезло и было закрыто шесть проблем — от NOT NULL в колонке журнала до порядка снятия отмены перед оплатами, изоляции «битого» заказа, чтобы он не ронял пакет, и бэкфилла, который упирался в memory_limit (запустили CLI с -d memory_limit=2048M).
Результат
Живой режим — с конца июня. Бэкфилл привёл в соответствие 974 заказа, а финальный «сухой прогон» показал 0 расхождений. Ручная сверка стадий и статусов ушла из рутины менеджеров. Это не «инцидент», а инженерная работа: заменить хрупкий ручной процесс предсказуемым модулем — с идемпотентностью и уважением к тому, чего платформа делать не даёт.
Имя клиента не раскрываем по NDA. Цифры и подход — реальные.