А в итоге проблема решилась следующим образом:
1. В юзерэкзите
FORM USEREXIT_NEWROLE_XVBPAK_AVBPAK.
прописываем следующую строчку
Code:
DELETE XVBPAK WHERE PARVW = 'WE'.
(вычищаем партнера ShipTo на уровне заголовка)
2. а в эзерэкзите
USEREXIT_NEWROLE_XVBPAP_AVBPAK.
прописываем на уровне итемов атрибуты партнера ShipTo. Решение выглядит на первый взгляд жутковато, но почему-то работает:
Code:
DATA : BEGIN OF LOC_KNVP.
INCLUDE STRUCTURE KNVP.
DATA : END OF LOC_KNVP.
DATA : LOC_RC LIKE SY-SUBRC.
DATA : LOC_ROLE_FOUND(1) TYPE C.
CLEAR LOC_ROLE_FOUND.
LOOP AT AVBPAK WHERE PARVW EQ 'WE'.
PERFORM KNVP_READ USING VBRK-VKORG VBRK-VTWEG VBRK-SPART
AVBPAK-KUNNR 'WE'
CHANGING LOC_KNVP LOC_RC.
ENDLOOP.
IF LOC_RC EQ 0 AND
NOT LOC_KNVP-PARNR IS INITIAL OR
NOT LOC_KNVP-KUNN2 IS INITIAL OR
NOT LOC_KNVP-LIFNR IS INITIAL OR
NOT LOC_KNVP-PERNR IS INITIAL.
LOOP AT XVBPAP WHERE PARVW EQ 'WE'.
LOC_ROLE_FOUND = 'X'.
XVBPAP-KUNNR = LOC_KNVP-KUNN2.
XVBPAP-PARNR = LOC_KNVP-PARNR.
XVBPAP-LIFNR = LOC_KNVP-LIFNR.
XVBPAP-PERNR = LOC_KNVP-PERNR.
CLEAR XVBPAP-ADRNR.
PERFORM KUPAV_READ CHANGING XVBPAP.
MODIFY XVBPAP.
XVBPA = XVBPAP.
PERFORM KUNDENVIEWS_FUELLEN USING LOC_RC.
ENDLOOP.
IF LOC_ROLE_FOUND NE 'X'.
XVBPAP-PARVW = 'WE'.
XVBPAP-PARNR = LOC_KNVP-PARNR.
XVBPAP-KUNNR = LOC_KNVP-KUNN2.
XVBPAP-LIFNR = LOC_KNVP-LIFNR.
XVBPAP-PERNR = LOC_KNVP-PERNR.
CLEAR XVBPAP-ADRNR.
PERFORM KUPAV_READ CHANGING XVBPAP.
APPEND XVBPAP.
XVBPA = XVBPAP.
PERFORM KUNDENVIEWS_FUELLEN USING LOC_RC.
SORT XVBPAP BY PARVW.
ENDIF.
ENDIF.
После переноса юзерэкзитов из песочницы в тестовую систему рекоммендуется активировать путем запуска программы RV80HGEN, она должна выдать "All routines have been successfully activated".
Вопрос к почтенным гуру - есть ли какие-то подводные камни при таком решении проблемы?