Где провести границы интеграции между системами, чтобы она не стала вечным проектом

Интеграция становится вечным проектом в тот момент, когда её начинают обсуждать как абстрактную «связку систем». У двух команд появляются длинные списки полей, десятки исключений и надежда, что после подключения всё само станет единым.
Я начинаю с другого: какую конкретную работу должна сделать эта связка и где заканчивается ответственность каждой системы. Интеграция — не клей, которым надо обмазать весь IT-ландшафт. Это аккуратно выбранная дверь между двумя помещениями. У двери есть назначение, размер и правило, кто через неё проходит.
Сначала назовите событие, а не системы
Фраза «соединим CRM и учёт» ничего не объясняет. В ней нет действия. Гораздо понятнее: «после подтверждения заказа передать в учётную систему состав заказа и реквизиты клиента» или «после отгрузки вернуть в CRM факт исполнения».
Когда событие названо, разговор резко упрощается. Можно спросить: кто создаёт источник истины, какие данные нужны именно в этот момент, что делать при ошибке и нужен ли обратный поток. Без этого интеграция быстро разрастается: «раз уж подключаем, давайте передадим ещё всё остальное».
Обмен всеми полями редко делает компанию управляемее. Он просто переносит путаницу быстрее.
Одна сущность — один главный хозяин
Самое опасное состояние — когда две системы считают себя главными для одного и того же объекта. Менеджер меняет телефон клиента в CRM, бухгалтер — в учётной системе, а потом обе стороны пытаются перезаписать друг друга. В итоге никто не знает, какой адрес верный и почему он изменился.
Для каждого важного объекта стоит договориться о хозяине. Например, CRM ведёт первичный контакт и коммерческую часть, учётная система — документы и финансовый статус, складская система — остатки и движение товара. Это не жёсткая догма, а явное решение, которое помогает не строить двустороннюю бесконечную синхронизацию.
Если данные нужны второй системе, она получает копию с понятным назначением. А изменение возвращается только там, где для него есть деловая причина, а не потому что «так удобнее пользователю».
Граница видна в вопросе: что будет, если связь пропадёт?
Полезная проверка архитектуры звучит просто: если интеграция не работает два часа, что именно остановится? Если ответ «вся компания», граница выбрана слишком широко или без запаса.
Например, онлайн-магазин передаёт заказ в учётную систему. Если обмен временно недоступен, заказ можно поставить в очередь, показать сотруднику статус ожидания и не потерять данные. Работа станет медленнее, но не исчезнет. Это здоровая реакция.
Гораздо хуже, когда одна система не может сохранить действие вообще, пока не ответит другая. Тогда короткий сбой превращается в простой отдела. Я предпочитаю проектировать связку так, чтобы у каждого сервиса оставалась своя жизнь: действие фиксируется у хозяина, а передачу можно повторить и проверить.
У очереди тоже должен быть хозяин
В любой надёжной связке возникает место, где сообщение ждёт отправки или повторной обработки. Его часто воспринимают как техническую деталь: разработчики настроят и забудут. Но для бизнеса это реальная очередь работы. Если в ней копятся неотправленные заказы, проблему должен увидеть не только мониторинг, но и ответственный за процесс.
Я стараюсь заранее решить: кто получает сигнал, сколько времени допустима задержка, что он может сделать сам и когда подключается техническая команда. Не все сбои требуют срочного вмешательства. Но у каждого должен быть понятный путь, иначе ошибка обнаруживается только после звонка клиента.
Проверяйте реальность на неидеальных данных
Тестовый обмен часто проходит на аккуратных записях: в карточке заполнены все поля, сумма положительная, контакт один, товар существует везде. В жизни встречаются дубли, отмены, частичные отгрузки, старые справочники и данные, которые человек успел поправить в момент передачи.
Перед запуском я выбираю несколько таких случаев и прохожу их целиком. Что будет, если контакт отсутствует? Если заказ повторно отправился после сетевой ошибки? Если номенклатура не найдена? Важно не добиться красивого сообщения об ошибке, а сохранить возможность закончить работу без ручной археологии по логам.
Особенно полезна проверка повтора. Сотрудник не должен бояться нажать «повторить»: система обязана отличить повторную доставку от нового заказа. Это простое правило спасает от дублей в учёте и долгих разбирательств.
Документируйте решение так, чтобы его понял следующий человек
Интеграции часто знают наизусть один разработчик и один сотрудник бизнеса. Пока оба на месте, всё кажется нормальным. Потом меняется команда, и любая доработка превращается в исследование: почему передаётся именно это поле, кто может менять статус, почему обмен запускается ночью.
Не нужна многотомная документация. Достаточно одной живой страницы: цель обмена, системы и их роли, схема события, обязательные данные, действия при ошибке, контакты владельцев. Я люблю дополнять её несколькими примерами реальных сообщений без персональных данных. Тогда новый участник быстро понимает контекст и не начинает с догадок.
Граница должна переживать изменения
Бизнес поменяет процесс, появится новый канал продаж, одна из систем обновится или будет заменена. Это нормальная жизнь, а не признак плохого проекта. Вопрос в том, потребует ли каждое изменение переписать все связи или достаточно поправить один контракт.
Поэтому я избегаю передачи внутренних деталей, которые второй системе не нужны. Чем меньше она знает о чужом устройстве, тем спокойнее обе стороны развиваются. Хорошая граница не делает системы изолированными; она позволяет им сотрудничать без взаимного захвата.
С чего начать разговор с командами
Я бы не начинал его с вопроса «какой API есть». Сначала полезнее собрать людей, которые отвечают за обе стороны процесса, и вместе описать один реальный случай: от события до результата. Пусть каждый называет свои действия и данные. Обычно уже на этом разговоре видно, где ожидания расходятся.
Затем стоит убрать из обсуждения всё, что не нужно для первого результата. Не потому, что остальное неважно, а потому, что у команды появится рабочая точка проверки. Когда один поток стабилен, расширить контракт гораздо безопаснее, чем пытаться заранее договориться о каждом возможном будущем случае.
Пример без лишней магии
Допустим, менеджер подтверждает заказ в CRM. Система создаёт неизменяемый идентификатор события и передаёт его в учёт. Учёт принимает заказ либо возвращает понятную причину, почему не смог этого сделать. Если сеть подвела, CRM хранит сообщение в очереди и пробует повторить. Если заказ уже был принят, учёт сообщает это без создания дубля.
Здесь нет сложной магии и не обязательно нужны десятки сервисов. Есть событие, хозяин, контракт и проверяемая реакция на сбой. Именно такую простоту полезно сохранить, прежде чем добавлять следующий поток данных.
Финальная проверка
Перед тем как считать интеграцию готовой, я прошу команду ответить на один вопрос без технических терминов: «Как сотрудник узнает, что его действие дошло до следующего этапа, и что он делает, если не дошло?» Если ответ понятен и сотруднику, и руководителю, у связи есть шанс стать частью процесса, а не отдельным поводом для тревоги.
Не путайте синхронизацию с отчётом
Иногда данные начинают дублировать между системами только ради удобного отчёта. Это дорогой путь. Чем больше копий, тем больше поводов для расхождений и ручных «почему цифры разные».
Если задача — видеть картину для руководителя, возможно, нужен отдельный слой отчётности с понятной периодичностью обновления. Если задача — выполнить операцию, нужен обмен только теми полями, без которых операция не состоится. Это разные цели, и у них разные требования к скорости и точности.
Когда эти цели смешивают, интеграция начинает передавать всё подряд, а команда получает сложный маршрут без понятного владельца. Полезно сначала нарисовать карту будущих изменений: от чего зависит решение и сколько будет стоить его поменять через год.
Три правила, которые я фиксирую до разработки
- Источник и цель. Какое деловое событие запускает обмен, какая система создаёт запись и какая использует её дальше.
- Минимальный контракт. Какие данные обязательны, в каком формате они передаются и что нельзя менять без согласования обеих сторон.
- Поведение при сбое. Где хранится неотправленное сообщение, кто видит ошибку, как повторить передачу и как понять, что дубль не создался.
Эти правила кажутся техническими, но на самом деле они про управляемость. Руководитель может не читать спецификацию API, но должен понимать, где у заказа жизнь начинается, кто отвечает за его статус и как команда узнает о проблеме.
Начинайте с одного направления
Двусторонний обмен выглядит симметрично и поэтому кажется правильным. На практике он сразу создаёт сложные вопросы: что важнее при конфликте, как отличить новое изменение от старого, нужно ли возвращать служебные поля.
Поэтому хороший первый шаг — один поток и один результат. CRM передаёт подтверждённый заказ в учётную систему. Команда проверяет, что данные не теряются, повторы не ломают учёт, ошибка видна. И только потом решает, нужен ли обратный статус и для какой роли он действительно важен.
Такой порядок не замедляет развитие. Он делает каждое следующее соединение понятнее. Архитектура, как я писал раньше, — это не украшение схемой, а цена будущих изменений. Чем меньше лишней связности вы создадите сейчас, тем легче изменить процесс завтра.
Что проверить перед запуском
- Событие обмена описано человеческим языком и связано с конкретным результатом.
- У каждой сущности есть главный хозяин данных.
- В контракте только нужные поля, а не «на всякий случай».
- Повторная отправка не создаёт вторую операцию.
- Ошибка видна не только разработчику, но и человеку, который отвечает за процесс.
Выбор между готовым решением и собственной разработкой тоже влияет на эти границы: у систем разные возможности и ограничения. Полезно рассматривать его отдельно, а не ждать, что интеграция сама устранит разницу между продуктами.
Хорошая интеграция почти незаметна. Она не заставляет людей думать о проводах между системами: нужное действие происходит один раз, данные попадают туда, где им место, а ошибка не превращается в поисковую экспедицию. Именно для этого границы нужно задать до первой строки кода.
Обсудим?