А не могли бы вы рассказать что такое BADI ?
Ну если опять же пойти в историю, то SAP это не 1С и прежде всего не потому, что у него функций больше или меньше, а потому что SAP держит систему целостной в отличии от 1С и именно это преимущество дает возможность миграции с версии на версию, без написания каких-то загрузчиков данных из версии ХХХ в версию ZZZ. Ну да в общем это как бы лирика, а жизнь показала, что система кроме того что должна быть настраиваемая, так же должна быть и дописываемая пользователями, но тут сразу же есть противоречие, дать дописывать - потерять контроль на кодом бизнес-приложений системы, поэтому первое что придумали в SAP, не знаю когда я систему только с 3.0 видел, но это то что называется - пользовательское расширение (UswerExits) реализовано это было следующим образом в коде системы, в контрольных точках (по мнению разработчика кода) вставлялся код вида "call customer-function "001"", т.е. в этом месте происходил вызов пользовательского расширения, по факту разработчик передавал что-то в эту функцию, а на выходе ждал от вас например краткий текст документа, при этом вся эта кухня активировалась через специальные транзакции SMOD/CMOD, т.е. ведение так называемых проектов расширений.
Время шло, SAP переехал местами на объектный SAP, а имеющиеся расширения давно перестали удовлетворять многих, по простой причине, если расширение нужно было двум или трем разработчикам, то тут начинали возникать определенные проблемы, особенно при долгой жизни системы, т.е. код в экзите рос, писали его люди разные и часто как все понимают, чужая душа потемки, так и чужой код еще большие проблемы, да и не очень все читабельно я скажу вам выходило. Поэтому появились BADI - бизнес расширение, фактически тот же самый экзит, но реализованный через технику ООП, т.е пишется интерфейс, а уж его реализация это дело пользователя. В коде это все выглядит где-то так:
IF lref_badi_search IS INITIAL.
* Returns a reference to a generated exit class
CALL METHOD cl_exithandler=>get_instance
EXPORTING
exit_name = lv_exit_name
null_instance_accepted = true
CHANGING
instance = lref_badi_search.
ENDIF.
* call the BADI method.
CALL METHOD lref_badi_search->access_rap_asg
EXPORTING
IS_RAP_ASG = ls_pv
IV_DIRECTION = lc_direction
IMPORTING
EV_PERC = lv_threshold_percent.
т.е. первый вызов получает имя класса реализующего расширение и далее идет вызов самого расширения. С точки зрения работы, ну другая транзакция SE18/SE19, ну другая технология, но в целом, те же самые экзиты, только вид с боку, но одно большое преимущество, происходящее от использования классов, а именно фактически система давала вам возможность писать наследуемый интерфейс, каждому разработчику свой и далее вызывала их последовательно, при этом отключение одной реализации не затрагивало коды реализаций других разработчиков, что несомненный плюс.
А дальше, дальше появилась головная боль профессиональных разработчиков, технология энхансментов и... понеслось. Это уже дальнейшее развитие технологии:
Экзит -> BADI -> Энхансмент инструмент мощный, но... как говорит народная пословица, револьвер в руках в руках дикаря - гибель всему племени. Так и энхансмент в руках, не очень скажем, так опытного разработчика - полный белый писец все системе.