Отключение проверки полномочий в ABAP программе

Про полномочия в SAP HCM можно говорить много. Тема довольно обширная, и посвятить ей одну заметку, как мне кажется, мало. Поэтому делать этого в настоящий момент не буду.

См. Authorizations for Human Resources

Тема, про которую пойдет речь в данной заметке, относится к ситуациям, в которых необходимо отключить проверку полномочий (как структурных, так и обычных, также именуемыми general authorizations). Отключение полномочий в ABAP программах производится в тех ее местах, где происходит чтение данных из инфотипов (PA или OM), с последующим выводом на экран результатов выборки. Такая потребность может возникать в ситуациях, в которых у пользователя, например, отсутствуют полномочия на какой-то инфотип, или ему присвоен структурный профиль, в котором отсутствуют объекты, участвующие в выборке отчета. И, как это часто бывает, расширить полномочия ему по каким-то причинам невозможно, а отчет является очень нужным и полезным. Как же быть в такой ситуации?

Исходные данные

Рассмотрим простой пример. Есть пользователь DEMO_USER1 в роли которого присутствует объект полномочий P_ORGIN со следующим наполнением

Рисунок 1.

Помимо объекта полномочий P_ORGIN с доступом к инфотипу 0001 - "Organizational Assignment" в роли присутствует объект полномочий PLOG, в котором содержится несколько инфотипов для объекта O - "Organizational Unit"

Рисунок 2.

Плюс ко всему, ему присвоен структурный профиль полномочий для просмотра только объектов O - "Organizational Unit"

Рисунок 3.

Мягко говоря, полномочия не очень-то уж и "обширные".

Пример программы без отключенной проверки полномочий

Пишем простенькую программу для чтения инфотипа 0002 - "Personal Data" и чтения инфотипа 1000 - "Object" для объекта S - "Position" без отключенной проверки полномочий.


REPORT zdemo_auth.
PARAMETERS: s_pernr TYPE prelp-pernr,
            o_objid TYPE plog-objid.
 
DATA: lt_pa0002 TYPE TABLE OF p0002,
      ls_pa0002 TYPE pa0002,
      lt_1000 type TABLE OF p1000.
 
FIELD-SYMBOLS:  TYPE p0002.
 
 
CLEAR lt_pa0002[].
CALL FUNCTION 'HR_READ_INFOTYPE'
  EXPORTING
    pernr           = s_pernr
    infty           = '0002'
    begda           = '19000101' "sy-datum
    endda           = '99991231' "sy-datum
  TABLES
    infty_tab       = lt_pa0002
  EXCEPTIONS
    infty_not_found = 1
    OTHERS          = 2.
 
clear lt_1000[].
CALL FUNCTION 'RH_READ_INFTY_1000'
 EXPORTING
*   AUTHORITY              = 'DISP'
*   WITH_STRU_AUTH         = 'X'
   PLVAR                  = '01'
   OTYPE                  = 'S'
   OBJID                  = o_objid
*   ISTAT                  = ' '
*   EXTEND                 = 'X'
*   BEGDA                  = '19000101'
*   ENDDA                  = '99991231'
*   CONDITION              = '00000'
*   SORT                   = 'X'
  TABLES
    i1000 =               lt_1000
*   OBJECTS                =
 EXCEPTIONS
   NOTHING_FOUND          = 1
   WRONG_CONDITION        = 2
   WRONG_PARAMETERS       = 3
   OTHERS                 = 4
.
 
IF sy-subrc EQ 0.
 
  READ TABLE lt_pa0002 ASSIGNING  WITH KEY pernr = s_pernr.
  IF  IS ASSIGNED.
    WRITE / -pernr .
    WRITE / -vorna.
    WRITE / -nachn.
  ELSE.
    WRITE / '2nd select'.
    WRITE 'nothing to select!'.
 
  ENDIF.
ENDIF.
WRITE 'nothing to select!'.

Запускаем

При таких исходных данных, таблицы lt_pa0002 и  lt_1000 оказались пустыми, что, в общем, логично, исходя из тех полномочий, которые есть у пользователя.

Пример программы с отключенной проверкой полномочий

Теперь пишем программу, в которой проверка полномочий будет отключена. Для этих целей, в самом начале программы необходимо вызвать два функциональных модуля:



REPORT zdemo_auth.
PARAMETERS: s_pernr TYPE prelp-pernr,
            o_objid TYPE plog-objid.
 
DATA: lt_pa0002 TYPE TABLE OF p0002,
      ls_pa0002 TYPE pa0002,
      lt_1000   TYPE TABLE OF p1000.
 
FIELD-SYMBOLS:  TYPE p0002.
 
CALL FUNCTION 'RH_AUTHORITY_CHECK_OFF'.
CALL FUNCTION 'HR_READ_INFOTYPE_AUTHC_DISABLE'.
 
 
CLEAR lt_pa0002[].
CALL FUNCTION 'HR_READ_INFOTYPE'
  EXPORTING
    pernr           = s_pernr
    infty           = '0002'
    begda           = '19000101' "sy-datum
    endda           = '99991231' "sy-datum
  TABLES
    infty_tab       = lt_pa0002
  EXCEPTIONS
    infty_not_found = 1
    OTHERS          = 2.
 
CLEAR lt_1000[].
CALL FUNCTION 'RH_READ_INFTY_1000'
  EXPORTING
*   AUTHORITY        = 'DISP'
*   WITH_STRU_AUTH   = 'X'
    plvar            = '01'
    otype            = 'S'
    objid            = o_objid
*   ISTAT            = ' '
*   EXTEND           = 'X'
*   BEGDA            = '19000101'
*   ENDDA            = '99991231'
*   CONDITION        = '00000'
*   SORT             = 'X'
  TABLES
    i1000            = lt_1000
*   OBJECTS          =
  EXCEPTIONS
    nothing_found    = 1
    wrong_condition  = 2
    wrong_parameters = 3
    OTHERS           = 4.
 
IF sy-subrc EQ 0.
 
  READ TABLE lt_pa0002 ASSIGNING  WITH KEY pernr = s_pernr.
  IF  IS ASSIGNED.
    WRITE / -pernr .
    WRITE / -vorna.
    WRITE / -nachn.
  ELSE.
    WRITE / '2nd select '.
    WRITE 'nothing to select!'.
 
  ENDIF.
ENDIF.
 
CALL FUNCTION 'RH_AUTHORITY_CHECK_ON'.

N.B. После того, как вы отключили проверку структурных полномочий и получили в ходе выполнения программы необходимые данные, проверку следует включить. Для этого необходимо вызвать ФМ RH_AUTHORITY_CHECK_ON. Для чтения же инфотипов проверку включать не нужно, так как она отключается непосредственно перед самим чтением, и затем будет автоматически активирована.

Тестируем

Как видите, таблицы lt_pa0002 и lt_1000 были заполнены каким-то значениями. Хотя эти же таблицы были пустыми в первой "редакции" программы.

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


REPORT zdemo_auth.
PARAMETERS: s_pernr TYPE prelp-pernr,
            o_objid TYPE plog-objid.
 
DATA: lt_pa0002 TYPE TABLE OF p0002,
      ls_pa0002 TYPE pa0002,
      lt_1000   TYPE TABLE OF p1000.
 
FIELD-SYMBOLS:  TYPE p0002.
 
CALL FUNCTION 'RH_AUTHORITY_CHECK_OFF'.
CALL FUNCTION 'HR_READ_INFOTYPE_AUTHC_DISABLE'.
 
 
CLEAR lt_pa0002[].
CALL FUNCTION 'HR_READ_INFOTYPE'
  EXPORTING
    pernr           = s_pernr
    infty           = '0002'
    begda           = '19000101' "sy-datum
    endda           = '99991231' "sy-datum
  TABLES
    infty_tab       = lt_pa0002
  EXCEPTIONS
    infty_not_found = 1
    OTHERS          = 2.
 
CLEAR lt_1000[].
CALL FUNCTION 'RH_READ_INFTY_1000'
  EXPORTING
*   AUTHORITY        = 'DISP'
*   WITH_STRU_AUTH   = 'X'
    plvar            = '01'
    otype            = 'S'
    objid            = o_objid
*   ISTAT            = ' '
*   EXTEND           = 'X'
*   BEGDA            = '19000101'
*   ENDDA            = '99991231'
*   CONDITION        = '00000'
*   SORT             = 'X'
  TABLES
    i1000            = lt_1000
*   OBJECTS          =
  EXCEPTIONS
    nothing_found    = 1
    wrong_condition  = 2
    wrong_parameters = 3
    OTHERS           = 4.
 
IF sy-subrc EQ 0.
 
  READ TABLE lt_pa0002 ASSIGNING  WITH KEY pernr = s_pernr.
  IF  IS ASSIGNED.
*    WRITE / -pernr .
*    WRITE / -vorna.
*    WRITE / -nachn.
  ELSE.
    WRITE / '2nd select'.
    WRITE 'nothing to select!'.
 
  ENDIF.
ENDIF.
 
CALL FUNCTION 'RH_AUTHORITY_CHECK_ON'.
 
 
CLEAR lt_pa0002[].
CALL FUNCTION 'HR_READ_INFOTYPE'
  EXPORTING
    pernr           = s_pernr
    infty           = '0002'
    begda           = '19000101' "sy-datum
    endda           = '99991231' "sy-datum
  TABLES
    infty_tab       = lt_pa0002
  EXCEPTIONS
    infty_not_found = 1
    OTHERS          = 2.
 
IF lt_pa0002 is INITIAL.
  write 'nothing found!'.
ENDIF.

Обратите внимание на таблицу lt_pa0002, которая заполняется в самом начале выполнения программы, когда проверка полномочий отключена. При этом повторный вызов ФМ HR_READ_INFOTYPE возвращает таблицу lt_pa0002 пустой.

Тестируем

P.S. За качество кода, прошу не винить. Я не со зла.