Устав от простыней в стиле:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43  | 
						  LOOP AT SCREEN.     IF screen-name = 'ZSS-PERID'.       screen-input = 0.     ENDIF.     IF zss-pernr IS NOT INITIAL.       IF screen-name = 'ZSS-PERNR' OR          screen-name = 'ZSS-LNAME' OR          screen-name = 'ZSS-FNAME'.         screen-input = 0.       ENDIF.     ENDIF.     IF screen-name = 'ZSS-STELL'.       screen-input = 0.     ENDIF. ...     IF screen-name = 'ZSS-TAXNM'.       IF ... .         screen-required = 0.        ELSE.         screen-required = 1.        ENDIF.     ENDIF.     MODIFY SCREEN.   ENDLOOP. ...   LOOP AT SCREEN.     IF screen-group1 = 'M1'.       IF ...         screen-input = 0.       ELSE.         screen-input = 1.       ENDIF.       MODIFY SCREEN.     ENDIF.   ENDLOOP. ...  | 
					
я решил обкатать новый подход.
Первым делом декларативное определение, например:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23  | 
						    mt_profile_readonly = VALUE #(        ( mask = '*'              action = zcl_screen=>readonly )     ).     mt_profile_employee = VALUE #(        ( mask = '*'              action = zcl_screen=>readonly )        ( mask = '*QKTGR*'        action = zcl_screen=>obligatory )        ( mask = '*POSID*'        action = zcl_screen=>input )     ).     mt_profile_contractor = VALUE #(         ( mask = '*'             action = zcl_screen=>readonly )         ( mask = '*QKTGR*'       action = zcl_screen=>input )         ( mask = '*TAXNM*'       action = zcl_screen=>obligatory )         ( mask = '*TDATE*'       action = zcl_screen=>input )     ).     mt_profile_visitor = VALUE #(         ( mask = '*'             action = zcl_screen=>input )         ( mask = '*PERID*'       action = zcl_screen=>invisible )         ( mask = '*PERNR*'       action = zcl_screen=>invisible )         ( mask = '*STELL*'       action = zcl_screen=>invisible )     ).  | 
					
Применение на практике сводится к следующему:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23  | 
						  MODULE screen_3000 OUTPUT.     go_person_controller->process_screen( ).   ENDMODULE. ...   METHOD process_screen.     IF m_mode = mc_display.       zcl_screen=>apply_profile( mt_profile_readonly ).     ELSE.       IF m_data-pernr IS NOT INITIAL.         IF is_employee( EXPORTING iv_pernr = m_data-perid ).           zcl_screen=>apply_profile( mt_profile_employee ).         ELSE.           zcl_screen=>apply_profile( mt_profile_contractor ).         ENDIF.       ELSE.         zcl_screen=>apply_profile( mt_profile_visitor ).       ENDIF.     ENDIF.   ENDMETHOD.  | 
					
Пробую пока покатать-проверить, насколько такой подход применим в условиях, приближенным к боевым. Нужно больше мест применения, чтобы определить какой подход даст лучшую читаемость, компактность и проверяемость. И потихотньку можно добавить мяса.








