Публикуем перевод пятой части из серии статей (вот первая, вторая, третья и четвёртая), посвящённой информационным технологиям в авиаперевозках. Сегодня поговорим о задержанном стыковочном рейсе, об отстранённом от полётов Boeing 787-8, и о том, что сделала 60-летняя система после того, как в аэропорту Хитроу всё пошло наперекосяк.

Вылет рейса BA1361 из Манчестера задерживался.

Я наблюдал за тем, как время на табло вылета пересекло отметку в 9:40, но никаких новостей там не было. Тогда я уже открыл программу FlightRadar24. Воздушное судно с позывным SHT3R, первые сведения о GPS-координатах которого были зарегистрированы в 10:28 UTC, всё ещё не покидало Терминал №2 в аэропорту Манчестера. Самолёт начал движение в 10:35. В 10:49, с отставанием от расписания на шестьдесят девять минут, было убрано шасси.

Я, во время снижения самолёта, поразмышлял о том, сколько у меня есть времени. Посадка должна была состояться примерно в 11:40. Переход между терминалами №5 и №2 в Хитроу занимает минимум 35 минут. Сюда входит время, необходимое на поездку на межтерминальном шаттле, на проверку безопасности, на пеший переход. Отправка рейса AI112 была запланирована на 13:00. В лучшем случае у меня в запасе было около 45 минут.

Этого не хватило бы, если бы самолёт, выполнявший предыдущий рейс, уже прибыл бы с задержкой.

А этот самолёт, и правда, прибыл с задержкой.

Прибывающий самолёт: VT-AEQ, AI111

AI112 (LHR→DEL) — это обратный рейс. Самолёт, который его обслуживает, прибывает из Дели, номер его рейса обозначен как AI111. В авиации на прямых и обратных рейсах, соответствующих прямым и обратным участкам маршрута, используется один и тот же бортовой номер самолёта. Речь идёт об одном и том же самолёте, который, после прибытия в аэропорт назначения, готовят к новому полёту и отправляют в следующий рейс.

16 февраля 2026 это был самолёт VT-AEQ: Boeing 787-8 Dreamliner компании Air India. Он покинул Дели в 02:09 UTC, выполняя рейс AI111.

Я это знаю, поскольку данные ADS-B, имеющиеся на FlightRadar24, отражают сведения обо всём полёте. Вот материалы из CSV-файла:

Callsign:  AIC111
Departure: 2026-02-16T02:09:50Z (Delhi: VIDP)
Arrival:   2026-02-16T12:41:33Z (London Heathrow: EGLL)
At gate:   2026-02-16T12:52:33Z
 
Route:
 02:09Z Delhi (28.56°N, 77.08°E) takeoff
 03:07Z Gujarat coast (23.73°N, 72.17°E) FL300, 442 kts
 04:31Z Oman coast (23.30°N, 61.33°E) FL300, 442 kts
 05:50Z Persian Gulf (26.61°N, 51.23°E) FL340, 454 kts
 06:54Z Iraq (32.51°N, 45.01°E) FL340, 468 kts
 09:24Z Black Sea (42.66°N, 28.28°E) FL360, 466 kts
 10:19Z Hungary (46.44°N, 19.94°E) FL360, 450 kts
 11:52Z Netherlands coast (51.67°N, 4.52°E) FL360, 430 kts
 12:24Z Descending over Essex (51.55°N, 0.23°E) 11,900 ft
 12:41Z Wheels down, Heathrow
 12:52Z At gate, Terminal 2

Между взлётом в Дели и посадкой в Лондоне прошло 10 часов и 32 минуты. Прибытие рейса AI111 в аэропорт LHR запланировано на 12:15. Борт VT-AEQ приземлился с 26-минутным опозданием.

Окно возможностей сужается: поминутная хроника событий

Вот что происходило параллельно с приземлением борта VT-AEQ в аэропорту Хитроу:

11:40Z  BA1361 выпустил шасси, Терминал №5 в Хитроу
        Телеметрия SHT3R это подтверждает: 53.47°N, -0.49°E, LHR взлётно-посадочная полоса 27L
 
11:49Z  BA1361 у гейта, Терминал №5
        54-минутное опоздание относительно запланированного прибытия в 10:55
 
        Мне нужно добраться до Терминала №2.
 
        Варианты:
        A) Подземный поезд Heathrow Express T5→T3→T2 (~20 минут)
        B) Межтерминальный автобус (~25 минут)
 
        Запланированное время отправлений рейса AI112: 13:00Z
        Имеющийся запас времени: 71 минута
        Межтерминальный трансфер: минимум ~35 минут
        Резерв: 36 минут, если AI112 будет следовать расписанию.
 
~12:30Z Я прохожу проверку в Терминале №2. Табло вылета: AI112 ЗАДЕРЖАН.
        Облегчение. Относительное облегчение.
 
        Проверяю FlightRadar24. Рейс AIC111 находится на заключительном этапе захода на посадку.
12:41Z  Наблюдаю, как, в соответствии с телеметрией, самолёт перестал снижаться.
12:52Z  Самолёт у гейта.
 
        Новые данные на табло вылета: AI112 → 14:15

Время вылета 14:15 — это не некое произвольное значение. На наземное обслуживание широкофюзеляжного Boeing 787 обычно нужно 60-75 минут. Сюда входит высадка пассажиров, чистка салона, посадка новых пассажиров, заправка, доставка питания, погрузка багажа, буксировка. Борт VT-AEQ оказался у гейта в 12:52. Если прибавить сюда 75 минут — получится 14:07. Время отправления 14:15 представляет собой реалистичный наиболее ранний срок отправления, вычисленный системой.

У меня было ещё два часа. Я нашёл себе место в Терминале №2 и заказал кофе.

Столкновение с птицей: что случилось с самолётом?

Где-то между 12:52 и 14:57 UTC самолёт VT-AEQ столкнулся с птицей.

У меня нет отчёта об инженерном обследовании самолёта. Я знаю только то, что сообщил мне сотрудник наземной службы Air India у Терминала №2, а так же — то, на что указывает последовавшее за инцидентом переоформление билетов. А именно — самолёт был отстранён от полётов. Между задержкой рейса и отстранением борта от полётов имеется огромная разница.

Если рейс задержан — это означает, что самолёт, в итоге, вылетит из аэропорта. Продолжается его наземное обслуживание, пассажиры ждут, на табло появляются новые сведения о времени его отправления.

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

Борт VT-AEQ был отстранён от полётов. Рейс AI112 отменили.

Изменения в PNR, происходящие в реальном времени: DHB4AL в сложной ситуации

В 4:57 UTC система управления сбоями авиакомпании Air India выдала уведомление об изменении данных:

Тема: Изменение рейсов для DHB4AL
 
Хотим проинформировать вас об обновлении данных вашего бронирования с кодом DHB4AL.
Обратите внимание на то, что ваше бронирование на первоначальный рейс было отменено/изменено.
ПЕРВОНАЧАЛЬНЫЕ РЕЙСЫ:
  AI 112 LHR → DEL  14:15 → 05:10+1
  AI 415 DEL → NAG  06:20+1 → 08:05+1
 
ОБНОВЛЁННЫЕ РЕЙСЫ:
  AI 162 LHR → [DEL]  08:45+1 → 23:45+2
  AI 425 [DEL] → NAG  06:20+2 → 08:05+2

Это уведомление — результат работы автоматической системы переоформления бронирования. Это — первая попытка системы найти альтернативные рейсы. В пределах нескольких минут после принятия решения об отмене рейса модуль управления сбоями Altéa сделал следующее:

  1. Идентифицировал всех пассажиров с рейса AI112, которых ожидают дальнейшие стыковочные рейсы.

  2. Запросил данные об имеющихся местах на альтернативных маршрутах.

  3. Предварительно назначил пассажирам новые рейсы.

  4. Обновил сегменты PNR.

  5. Запустил процесс отправки уведомлений.

Эта скорость — результат масштабной автоматизации операций. Результат работы системы выглядит приемлемым. Но сотрудники наземной службы Air India в Терминале 2 понимали, что эти результаты далеки от оптимальных.

PNR как конечный автомат: четыре смены состояния за день

Моя PNR-запись с кодом DHB4AL побывала 16 февраля в четырёх различных состояниях. Каждый переход представлял собой набор изменений статусов сегментов в Amadeus Altéa:

СОСТОЯНИЕ 1: Исходное бронирование (5 декабря 2025 года):
  BA1361 MAN→LHR HK1  09:40  ← Полётный сегмент British Airways
  AI112  LHR→DEL HK1  13:00  ← подтверждено, исходное время
  AI415  DEL→NAG HK1  06:20+1  ← подтверждено
 
СОСТОЯНИЕ 2: Изменение расписания без выдачи уведомления (январь–февраль):
  BA1361 MAN→LHR HK1  09:40  ← без изменений
  AI112  LHR→DEL HK1  14:15  ← время отправления обновлено, без уведомления
  AI415  DEL→NAG HK1  06:20+1  ← без изменений
 
СОСТОЯНИЕ 3: Автоматическое переоформление бронирования после отмены рейса:
  BA1361 MAN→LHR HK1  09:40  ← выполнен ✓
  AI112  LHR→DEL XX1  14:15  ← аннулирован: статус изменён на XX
  AI415  DEL→NAG XX1  06:20+1  ← каскадное аннулирование
  AI162  LHR→DEL HK1  08:45+1  ← добавлен новый сегмент
  AI425  DEL→NAG HK1  06:20+2  ← добавлен новый сегмент
 
СОСТОЯНИЕ 4: Ручное изменение данных, выполненное агентом (Стойка у Терминала №2):
  BA1361 MAN→LHR HK1  09:40  ← выполнен✓
  AI112  LHR→DEL XX1  14:15  ← аннулирован (не изменилось в сравнении с состоянием 3)
  AI415  DEL→NAG XX1  06:20+1  ← аннулирован (не изменилось в сравнении с состоянием 3)
  AI130  LHR→BOM HK1  21:00  ← агент обнаружил более подходящий вариант
  AI2583 BOM→NAG HK1  19:55+1  ← маршрут с пересадкой в Мумбаи

В состояниях 3 и 4 PNR-код DHB4AL не поменялся. Номер билета, 098-5801178359, тоже не изменился. А изменился сам тот документ, ссылкой на который является PNR-код. Шесть символов какими были, такими и остались. А вот структура данных, с которой они связаны, была полностью перестроена.

Именно так выглядит то, что называют «концепцией согласованности в конечном счёте». И происходит это всё в системе, которая появилась за сорок лет до формулирования этой концепции.

Проблема SSR: что упустила автоматика?

Когда одни полётные сегменты PNR отменяют, а другие добавляют, запросы на специальное обслуживание (SSR, Special Service Request) оказываются ни к чему не привязанными. Так, мой запрос HNML (индуистское питание) был подтверждён на рейсе AI112. Но этого рейса в моём бронировании больше нет. Новые сегменты не наследуют SSR автоматически от старых сегментов.

В процессе автоматического переоформления бронирования (состояние 3) система управления сбоями может привязать существующие SSR к новым сегментам, а может этого и не сделать. Это зависит от конфигурации Altéa и от того, был ли сбой помечен как непреднамеренный. На практике после непреднамеренных переоформлений бронирований обработка SSR выполняется в разных авиакомпаниях по-разному. Поэтому службы поддержки клиентов авиакомпаний обычно рекомендуют повторно подтверждать запросы на питание после непреднамеренных переоформлений бронирований.

Сотруднику, который вручную переоформлял моё бронирование (состояние 4), пришлось сделать следующее:

  1. Отменить сегменты, автоматически созданные в состоянии 3.

  2. Продать новые сегменты по маршруту LHR→BOM→NAG.

  3. Повторно добавить к новым сегментам сведения о SSR.

  4. Снова выпустить посадочные талоны.

Всё это, с точки зрения пассажира, находящегося у стойки, заняло около 10 минут. А вот с точки зрения системы эти действия выражаются в 15-20 командах терминала, выполненных в интерфейсе агента Altéa. Каждая из этих команд меняет конкретный элемент конкретного PNR.

Человек в контуре управления системы

Автоматическая система переоформления бронирований сделала то, на что она была рассчитана. А именно — она нашла свободные места, выдала их пассажиру, обновила данные в PNR и уведомила пассажира. Всё это было сделано в течение нескольких минут после отмены рейса.

Сотрудница Air India в Терминале №2 взглянула на рейсы AI162 и AI425 и нашла более удобный маршрут через Мумбаи, обеспечивающий мне более подходящее время пересадки на пути домой. Она знала расписание, знала о том, на какие полёты имеются места в моём классе бронирования, знала о том, какими рейсами можно вылететь из Мумбаи в Нагпур. При этом знала она это всё лучше, чем знал алгоритм, так как она уже много раз принимала подобные решения.

Нельзя говорить о том, что автоматическая система не справилась со своей задачей, выдав неоптимальный результат. В масштабах индустрии авиаперевозок, когда одновременно могут быть отменены сотни рейсов, автоматическая система справляется с переоформлением бронирований тысяч пассажиров. И делает это она за считанные секунды. Люди на такое не способны. Алгоритм оптимизирован в расчёте на скорость работы и на использование имеющихся свободных мест в условиях жёстких временных рамок. Его не создавали в расчёте на знание особенностей расписания, которое приходит с практикой.

Во сколько всё это обошлось авиакомпании?

Изменения в бронировании DHB4AL 16 февраля были вызваны непреднамеренным изменением маршрута, ответственность за последствия которого лежала на авиакомпании. Авиационное законодательство Соединённого Королевства (Регламент UK261, основанный на EU261) даёт мне следующие права:

  • Бесплатное переоформление билетов на следующий доступный рейс до моего пункта назначения.

  • Питание и напитки во время ожидания (компания Air India предоставила ваучеры).

  • Размещение в отеле, если время ожидания захватывает ночь (меня это не коснулось, так как мой новый подходящий полёт был в тот же день, в 21:00).

  • Выплата компенсации в том случае, если задержка в пункте назначения превысила 3 часа (в моём случае так и было, задержка превысила этот порог на несколько часов).

Размер компенсации в соответствии с Регламентом UK261 для маршрута протяжённостью свыше 3500 километров при задержке прибытия в конечный пункт, превышающей 4 часа, составляет £520. В системах Air India фиксируются сведения о причине проблемы, туда вносятся сведения о переоформлении бронирования, о задержке в пункте назначения. Всё это передаётся в систему обработки компенсаций. Эта система и сама по себе представляет целую предметную область. Она определяет ответственность сторон, выполняется расчёт размеров компенсации, обрабатывает претензии. И всё это — в масштабах, соответствующих тысячам пострадавших пассажиров, с рейсами которых возникли какие-то проблемы.

Тут я не буду вдаваться в подробности об этой системе. Выплата компенсаций, как мне сказали, дело долгое.

Итоги

Проектируйте конечные автоматы в явном виде до начала моделирования основного сценария их использования. PNR с кодом DHB4AL прошёл через четыре состояния за один день. Система смогла обработать каждый из этих переходов благодаря тому, что PNR — это явный конечный автомат. Статусы сегментов (HK, XX, TK) — это объекты первого класса, они не выводятся из комбинаций булевых флагов. Когда сегмент аннулируется, система делает запись о том, что он аннулирован. Когда в PNR добавляется новый сегмент — он содержит в себе определённый статус. Такая ясность и однозначность состояний применяется ко всей структуре путешествия. Но при этом в системе может наблюдаться рассогласование вспомогательных данных, вроде моего запроса на особое питание. Придерживайтесь тех же принципов, создавая собственные модели интересующих вас предметных областей. А именно — по возможности применяйте явные состояния и явные переходы между ними. Используйте такие модели, в которых недопустимые комбинации состояний просто невозможно описать.

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

Каскадные зависимости должны быть частью предметной области, а не частью прикладного кода. Когда отменили рейс AI112 — рейс AI415 тоже был автоматически аннулирован. Пассажир, который не может добраться до Дели, не сможет сесть и на рейс из Дели в Нагпур. Система понимает эту зависимость и, без необходимости явного вмешательства человека, аннулирует полётные сегменты, зависимые от отменённого рейса. Это понимание заложено в модель данных, выраженную в виде зависимости между связанными сегментами PNR. Код приложения, реализующий каскадное аннулирование зависимостей — это конструкция, которая может легко сломаться. А вот модель предметной области, в рамках которой существуют зависимости, выраженные явным образом, это уже нечто гораздо более прочное и стабильное.

О, а приходите к нам работать? 🤗 💰

Мы в wunderfund.io занимаемся высокочастотной алготорговлей с 2014 года. Высокочастотная торговля — это непрерывное соревнование лучших программистов и математиков всего мира. Присоединившись к нам, вы станете частью этой увлекательной схватки.

Мы предлагаем интересные и сложные задачи по анализу данных и low latency разработке для увлеченных исследователей и программистов. Гибкий график и никакой бюрократии, решения быстро принимаются и воплощаются в жизнь.

Сейчас мы ищем плюсовиков, питонистов, дата-инженеров и мл-рисерчеров.

Присоединяйтесь к нашей команде