Почему дубль — это не просто лишний документ
Один заказ сайта превращается в два документа в 1С, а вслед за этим появляются лишние резервы, повторные звонки, уведомления и неверная аналитика.
Надёжный обмен допускает повтор одного события без повторного бизнес-действия. Сеть может оборваться после записи документа, но до ответа сайту. Сайт повторит запрос, и система должна вернуть существующий результат.
Семь причин дублей
- Повтор после тайм-аута. Документ записан, ответ потерян, повтор создаёт новый.
- Нет стабильного внешнего ключа. Поиск ведётся по телефону, номеру или времени.
- Два параллельных обработчика. Оба одновременно видят, что документа ещё нет.
- Ручной и автоматический импорт. Заказ приходит двумя независимыми маршрутами.
- Оплата считается новым заказом. Событие статуса создаёт документ вместо обновления.
- Ключ меняется при редактировании. Изменённый заказ перестаёт узнаваться.
- Очередь повторяет частично выполненное сообщение. Действие выполнено, но результат не зафиксирован.
Два похожих заказа клиента могут быть реальными. Дубль подтверждается одним внешним ID, payment ID, message ID или correlation ID.
Как найти точку повторного создания
- Зафиксируйте пример
Запишите ID заказа, время и IDs документов 1С.
- Соберите попытки
Найдите запросы, сообщения, файлы и ручные действия с этим ID.
- Постройте временную линию
Расположите приём, запись, ответ и повторы по времени.
- Проверьте ключ
Убедитесь, что поиск идёт по неизменяемому ID и источнику.
- Проверьте параллельность
Выясните, могли ли два процесса создать документы одновременно.
- Воспроизведите безопасно
На тестовой копии повторите запрос, потерю ответа и параллельную отправку.
Полезный журнал связывает внешний заказ со всеми попытками: когда событие принято, какой обработчик работал, найден или создан документ, какой ответ отправлен.
| Поле | Зачем |
|---|---|
| external_order_id | Связать документ с источником |
| request/message ID | Различить попытки доставки |
| correlation ID | Собрать цепочку систем |
| время и обработчик | Увидеть параллельность |
| ID документа 1С | Вернуть прежний результат при повторе |
Как защитить обмен
Неизменяемый ID источника хранится в 1С и проверяется до создания.
Два процесса не могут одновременно пройти «проверить и создать».
Повтор получает ID уже созданного документа.
Создание, оплата, изменение и отмена имеют отдельные правила.
Один клиент может оформить несколько заказов. Идентификатор должен приходить из системы-источника и не зависеть от редактируемых полей.
Какими тестами проверить исправление
Приёмочные сценарии
- Один запрос создаёт один документ.
- Повтор того же запроса не создаёт новый.
- Два одинаковых запроса приходят одновременно — документ один.
- Ответ теряется после записи — повтор возвращает существующий ID.
- Оплата обновляет заказ.
- Неизвестный товар не создаёт половину документа.
- После исчерпания повторов приходит уведомление с correlation ID.
Что делать с существующими дублями
Сначала остановите источник повторов, затем найдите кандидатов по внешнему ID и проверьте резервы, оплаты, отгрузки и уведомления. Простое удаление второго документа может нарушить учёт, если по нему уже были движения.
Для каждого дубля определяют основной экземпляр, корректно отменяют или переносят связанные операции и фиксируют результат разбора. После очистки полезен автоматический отчёт по повторяющимся ключам.
Сначала исправляется причина, потом данные. Иначе ручная очистка освобождает место для новых дублей.
Частые вопросы
Можно ли искать дубли по телефону и сумме?
Так можно искать кандидатов, но не защищать обмен. Надёжнее неизменяемый внешний ID заказа.
Что такое идемпотентность?
Повтор одной команды не повторяет бизнес-действие. Уже созданный заказ возвращает существующий результат.
Почему дубль появляется не всегда?
Это часто зависит от тайм-аута, гонки процессов или редкого повтора, поэтому без журнала ошибку трудно воспроизвести.
Что если заказ приходит из разных сайтов?
Используют составной ключ: источник плюс ID заказа в источнике.
Поможет ли очередь?
Она управляет доставкой, но сообщение всё равно может прийти повторно. Обработчик обязан быть идемпотентным.
Заказы уже дублируются?
Пришлите схему обмена, пример внешнего ID и обезличенный фрагмент журнала. Я помогу локализовать точку повтора.
Разобрать проблему →