И так немного лирики:
Любимая тема наших финансистов это, нам один контрольный счет кредитора не катит, хотим выбирать счет по собственному желанию. Иногда кажется что пора гнезду включать это дело в стандарт типа отраслевое решение для exUSSR, а то для какой-то Бразилии, где много диких обезьян есть решение, а для нас нет... можно подумать наши обезьяны хуже бразильских.
В общем делая это в... некоторый раз и опять мучительно вспоминая, а как же это было сделано ранее... решил сделать кратенькую справочку с картинками. Реализация идет для ECC 6.0, но в принципе с 4.6 должно работать без проблем, единственное что настройка самого замещения в 4.6 и 4.7 находится кажется немного по другому пути, но код транзакции остался старый, так что можно будет вызвать по коду, минуя настройку.
1. Для работы будет использоваться как расширение пользователя при вводе счетов логистики, транзакция MIRO, так и замещение FI. В отличии от схемы предложенной когда-то на sapforum.ru в теме "Альтернативные счета" (кому надо найдут), выбранный счет замещения у меня не передается ни через IMPORT/EXPORT ни через какие-то поля документа. Использую немного другой метод, как мне кажется более простой, читаю напрямую данные из собственного экрана 0400, который вставлен в экран счета логистики, ну да об этом ниже.
2. Для начала надо объяснить SAP-у, что можно выполнять замещение счета в FI. Стандартно система это не позволяет делать. Для этого можно или через отладчик выполнить редактирование записи в транзакции SE11, пример отредактированной записи на рисунке GB01.png, т.е. поле BEXCLUDE должно быть равно space. Или второй вариант воспользоваться ниже приведенной программкой, так как не факт, что у вас есть в продуктиве права на редактор

*&---------------------------------------------------------------------*
*& Report YXXX_UPDATE_MIROGB01
*&
*&---------------------------------------------------------------------*
*& Программка для установки метки возможности замещения счета в докумен
*& тах FI (поле HKONT)
*&---------------------------------------------------------------------*
REPORT yxxx_update_mirogb01.
UPDATE gb01 SET bexclude = space
WHERE boolclass = '009' AND
classtype = 'S' AND
bcltab = 'BSEG' AND
bclfield = 'HKONT'.
IF sy-subrc = 0.
WRITE: / 'Обновление успешно выполнено!'.
COMMIT WORK.
ELSE.
WRITE: / 'Ошибка обновления! =', sy-subrc.
ENDIF.
3. Далее создадим свою программу замещения, путем копирования уже существующей стандартной программы в свою. Перед этим правда желательно убедиться, что это не сделал кто-то другой. Для этого идем в настройку:
SPRO: Финансы - Специальные регистры - Основные параметры настройки - Программы пользователя - Ведение пользовательских программ, зависящих от манданта.
Пример на рисунке GBLS.png и там смотрим что за программа задана для записи GBLS. Если это
RGGBS000, тогда значит никто до вас замещения не рисовал и вы первый. А если там стоит что-то типа как в примере на рисунке, значит вы должны будете вставить текст замещения в уже кем-то созданную Z-программку. Предполагаем, что там стоит стандартная программа
RGGBS000, идем в редактор SE38, вводим имя этой программы и выбираем копирование Ctrl+F5, опции копирования рисунок RGGBS000.png. Как по мне то копировать ничего кроме основного текста не нужно и тем-более не нужно копировать INCLUDES, мало ли чего SAP решит сам потом добавить в эти инклуды. А так получим нормальное решение. После копирования возвращаемся в настройку и вставляем туда имя своей программы для строки с ключем GBLS.
Примечание: Если программа содержит ошибку, то вы не сможете ее указать в настройке и сохранить запись. Будет выдано сообщение об ошибке. Поэтому после копирования сразу же вставляем имя новой программы. А уже потом идем в добавление своего замещения.Пример моей программы ниже. Это базовая версия программы в которую вставлено только замещение для контрольного счета. В любых других случаях нужно будет вставить свой придуманный номер и его реализацию по аналогии с примером замещения U777.
PROGRAM yxxx_rggbs000 .
*&**********************************************************************
*& Comments : Замещения для FI, копия программы RGGBS000, затем в
*& SPRO - Настройка - Финансы - Специальные регистры -
*& Основные параметры настройки - Пользовательские прог-
*& раммы, зависимые от манданта, и для прикладной облсти
*& GBLS заменили программу RGGBS000 на YXXX_RGGBS000
*& GBLS - YXXX_RGGBS000 - Прв/Змщ: ПользПрогр замещения
*& Platform : SAP R/3 ver ECC 6.00
*& Autor : Uukrul
*& Date create : 28.09.2007
*& Date change : 28.09.2007
*&**********************************************************************
*& Date change : 28.09.2007 - U777 - Общая разработка замещения
*&**********************************************************************
*---------------------------------------------------------------------*
* Corrections/ repair
* wms092357 070703 Note 638886: template routines to be used for
* workaround to substitute bseg-bewar from bseg-xref1/2
*---------------------------------------------------------------------*
* *
* Substitutions: EXIT-Formpool for Uxxx-Exits *
* *
* This formpool is used by SAP for testing purposes only. *
* *
* Note: If you define a new user exit, you have to enter your *
* user exit in the form routine GET_EXIT_TITLES. *
* *
*---------------------------------------------------------------------*
INCLUDE fgbbgd00. "Standard data types
*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*
* PLEASE INCLUDE THE FOLLOWING "TYPE-POOL" AND "TABLES" COMMANDS *
* IF THE ACCOUNTING MODULE IS INSTALLED IN YOUR SYSTEM *
TYPE-POOLS: gb002. " TO BE INCLUDED IN "wms092357
TABLES: bkpf, " ANY SYSTEM THAT "wms092357
bseg, " HAS 'FI' INSTALLED "wms092357
cobl, "wms092357
csks, "wms092357
anlz, "wms092357
glu1. "wms092357
*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*
*----------------------------------------------------------------------*
* FORM GET_EXIT_TITLES *
*----------------------------------------------------------------------*
* returns name and title of all available standard-exits *
* every exit in this formpool has to be added to this form. *
* You have to specify a parameter type in order to enable the *
* code generation program to determine correctly how to *
* generate the user exit call, i.e. how many and what kind of *
* parameter(s) are used in the user exit. *
* The following parameter types exist: *
* *
* TYPE Description Usage *
* ------------------------------------------------------------ *
* C_EXIT_PARAM_NONE Use no parameter Subst. and Valid. *
* except B_RESULT *
* C_EXIT_PARAM_FIELD Use one field as param. Only Substitution *
* C_EXIT_PARAM_CLASS Use a type as parameter Subst. and Valid *
* *
*----------------------------------------------------------------------*
* --> EXIT_TAB table with exit-name and exit-titles *
* structure: NAME(5), PARAM(1), TITEL(60)
*----------------------------------------------------------------------*
FORM get_exit_titles TABLES etab.
DATA: BEGIN OF exits OCCURS 50,
name(5) TYPE c,
param LIKE c_exit_param_none,
title(60) TYPE c,
END OF exits.
exits-name = 'U100'.
exits-param = c_exit_param_none.
exits-title = text-100. "Cost center from CSKS
APPEND exits.
exits-name = 'U101'.
exits-param = c_exit_param_field.
exits-title = text-101. "Cost center from CSKS
APPEND exits.
* begin of insertion "wms092357
exits-name = 'U200'.
exits-param = c_exit_param_field.
exits-title = text-200. "Cons. transaction type
APPEND exits. "from xref1/2
* end of insertion "wms092357
*&**********************************************************************
*& Comments : Описание замещения контрольного счета кредитора при
*& проводке счетов из ММ (Счет логистики)
*& Platform : SAP R/3 ver ECC 6.00
*& Autor : Uukrul
*& Date create : 28.09.2007
*& Date change : 28.09.2007
*&**********************************************************************
*& Date change : 28.09.2007 - Общая разработка программы замещения U777
*&**********************************************************************
exits-name = 'U777'.
exits-param = c_exit_param_none.
exits-title = text-777.
APPEND exits.
*&**********************************************************************
*& Конец замещения U777 - Контрольный счет кредитора для счетов ММ
*&**********************************************************************
*& Comment: Текстовый элемент TEXT-777 = Контрольный счет кредитора
*&**********************************************************************
************************************************************************
* PLEASE DELETE THE FIRST '*' FORM THE BEGINING OF THE FOLLOWING LINES *
* IF THE ACCOUNTING MODULE IS INSTALLED IN YOUR SYSTEM: *
* EXITS-NAME = 'U102'.
* EXITS-PARAM = C_EXIT_PARAM_CLASS.
* EXITS-TITLE = TEXT-102. "Sum is used for the reference.
* APPEND EXITS.
***********************************************************************
** EXIT EXAMPLES FROM PUBLIC SECTOR INDUSTRY SOLUTION
**
** PLEASE DELETE THE FIRST '*' FORM THE BEGINING OF THE FOLLOWING LINE
** TO ENABLE PUBLIC SECTOR EXAMPLE SUBSTITUTION EXITS
***********************************************************************
INCLUDE rggbs_ps_titles.
REFRESH etab.
LOOP AT exits.
etab = exits.
APPEND etab.
ENDLOOP.
ENDFORM. "GET_EXIT_TITLES
*&**********************************************************************
*& Comments : Замещение контрольного счета кредитора при проводке
*& счетов из ММ (Счет логистики)
*& Platform : SAP R/3 ver ECC 6.00
*& Autor : Uukrul
*& Date create : 28.09.2007
*& Date change : 28.09.2007
*&**********************************************************************
*& Date change : 28.09.2007 - Общая разработка программы замещения U777
*&**********************************************************************
* eject
*&---------------------------------------------------------------------*
*& MACRO for u177
*&---------------------------------------------------------------------*
* Макросы
*----------------------------------------------------------------------*
DEFINE ext_to_int.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = &1
importing
output = &2.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& Form u177
*&---------------------------------------------------------------------*
* Замещение контрольного счета кредитора, для операций из счтеов ММ
* Операция вызвается только если ссылочная операция BKPF-AWTYP = 'RMRP'
*----------------------------------------------------------------------*
FORM u777.
DATA: l_hkont LIKE bseg-hkont.
* Обработка только позиции контрольного счета кредитора
IF bseg-koart = 'K'.
CASE bseg-shkzg.
WHEN 'H'.
IF bseg-rebzg <> space.
* Операция сторно документа авизо
SELECT SINGLE hkont INTO (l_hkont)
FROM bseg WHERE bukrs = bseg-bukrs AND
belnr = bseg-rebzg AND
gjahr = bseg-rebzj AND
buzei = bseg-rebzz.
IF sy-subrc = 0. bseg-hkont = l_hkont. ENDIF.
ELSE.
* Проводка из MIRO, счет замещения введен на экране
PERFORM read_hkont_from_screen CHANGING l_hkont.
IF l_hkont <> space. bseg-hkont = l_hkont. ENDIF.
ENDIF.
WHEN 'S'.
IF bseg-rebzg <> space.
* Операция сторно документа кредиторской
SELECT SINGLE hkont INTO (l_hkont)
FROM bseg WHERE bukrs = bseg-bukrs AND
belnr = bseg-rebzg AND
gjahr = bseg-rebzj AND
buzei = bseg-rebzz.
IF sy-subrc = 0. bseg-hkont = l_hkont. ENDIF.
ELSE.
* Похоже диалоговое кредитование кредитора, счет на экране
PERFORM read_hkont_from_screen CHANGING l_hkont.
IF l_hkont <> space. bseg-hkont = l_hkont. ENDIF.
ENDIF.
ENDCASE.
ENDIF.
ENDFORM. "u777
*&---------------------------------------------------------------------*
*& Form read_hkont_from_screen
*&---------------------------------------------------------------------*
* Программа чтения номера счета с экрана при диалоговой проводке
*----------------------------------------------------------------------*
* <--> P_HKONT - Номер счета из поля GF_HKONT или space, если ничего нет
*----------------------------------------------------------------------*
FORM read_hkont_from_screen CHANGING p_hkont.
DATA: lt_dynpfields LIKE dynpread OCCURS 1 WITH HEADER LINE.
CLEAR: p_hkont.
* Проводка из MIRO, счет замещения введен на экране
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = 'SAPLXM08'
dynumb = '0400'
request = 'A'
TABLES
dynpfields = lt_dynpfields
EXCEPTIONS
invalid_abapworkarea = 1
invalid_dynprofield = 2
invalid_dynproname = 3
invalid_dynpronummer = 4
invalid_request = 5
no_fielddescription = 6
invalid_parameter = 7
undefind_error = 8
double_conversion = 9
stepl_not_found = 10
OTHERS = 11.
IF sy-subrc = 0.
READ TABLE lt_dynpfields WITH KEY fieldname = 'GF_HKONT'.
IF sy-subrc = 0 AND lt_dynpfields-fieldvalue <> space.
ext_to_int: lt_dynpfields-fieldvalue p_hkont.
ENDIF.
ENDIF.
ENDFORM. "read_hkont_from_screen
*&**********************************************************************
*& Конец замещения U777 - Контрольный счет кредитора для счетов ММ
*&**********************************************************************
* eject
*---------------------------------------------------------------------*
* FORM U100 *
*---------------------------------------------------------------------*
* Reads the cost-center from the CSKS table . *
*---------------------------------------------------------------------*
FORM u100.
*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* PLEASE DELETE THE FIRST '*' FORM THE BEGINING OF THE FOLLOWING LINES *
* IF THE ACCOUNTING MODULE IS INSTALLED IN YOUR SYSTEM: *
* SELECT * FROM CSKS
* WHERE KOSTL EQ COBL-KOSTL
* AND KOKRS EQ COBL-KOKRS.
* IF CSKS-DATBI >= SY-DATUM AND
* CSKS-DATAB <= SY-DATUM.
*
* MOVE CSKS-ABTEI TO COBL-KOSTL.
*
* ENDIF.
* ENDSELECT.
ENDFORM. "U100
* eject
*---------------------------------------------------------------------*
* FORM U101 *
*---------------------------------------------------------------------*
* Reads the cost-center from the CSKS table for accounting *
* area '0001'. *
* This exit uses a parameter for the cost_center so it can *
* be used irrespective of the table used in the callup point. *
*---------------------------------------------------------------------*
FORM u101 USING cost_center.
*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* PLEASE DELETE THE FIRST '*' FORM THE BEGINING OF THE FOLLOWING LINES *
* IF THE ACCOUNTING MODULE IS INSTALLED IN YOUR SYSTEM: *
* SELECT * FROM CSKS
* WHERE KOSTL EQ COST_CENTER
* AND KOKRS EQ '0001'.
* IF CSKS-DATBI >= SY-DATUM AND
* CSKS-DATAB <= SY-DATUM.
*
* MOVE CSKS-ABTEI TO COST_CENTER .
*
* ENDIF.
* ENDSELECT.
ENDFORM. "U101
* eject
*---------------------------------------------------------------------*
* FORM U102 *
*---------------------------------------------------------------------*
* Inserts the sum of the posting into the reference field. *
* This exit can be used in FI for the complete document. *
* The complete data is passed in one parameter. *
*---------------------------------------------------------------------*
*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* PLEASE DELETE THE FIRST '*' FORM THE BEGINING OF THE FOLLOWING LINES *
* IF THE ACCOUNTING MODULE IS INSTALLED IN YOUR SYSTEM: *
*FORM u102 USING bool_data TYPE gb002_015.
*DATA: SUM(10) TYPE C.
*
* LOOP AT BOOL_DATA-BSEG INTO BSEG
* WHERE SHKZG = 'S'.
* BSEG-ZUONR = 'Test'.
* MODIFY BOOL_DATA-BSEG FROM BSEG.
* ADD BSEG-DMBTR TO SUM.
* ENDLOOP.
*
* BKPF-XBLNR = TEXT-001.
* REPLACE '&' WITH SUM INTO BKPF-XBLNR.
*
*ENDFORM.
***********************************************************************
** EXIT EXAMPLES FROM PUBLIC SECTOR INDUSTRY SOLUTION
**
** PLEASE DELETE THE FIRST '*' FORM THE BEGINING OF THE FOLLOWING LINE
** TO ENABLE PUBLIC SECTOR EXAMPLE SUBSTITUTION EXITS
***********************************************************************
*INCLUDE rggbs_ps_forms.
*eject
* begin of insertion "wms092357
*&---------------------------------------------------------------------*
*& Form u200
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM u200 USING e_rmvct TYPE bseg-bewar.
PERFORM xref_to_rmvct USING bkpf bseg 1 CHANGING e_rmvct.
ENDFORM. "u200
*&---------------------------------------------------------------------*
*& Form xref_to_rmvct
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM xref_to_rmvct
USING is_bkpf TYPE bkpf
is_bseg TYPE bseg
i_xref_field TYPE i
CHANGING c_rmvct TYPE rmvct.
DATA l_msgv TYPE symsgv.
STATICS st_rmvct TYPE HASHED TABLE OF rmvct WITH UNIQUE DEFAULT KEY.
* either bseg-xref1 or bseg-xref2 must be used as source...
IF i_xref_field <> 1 AND i_xref_field <> 2.
MESSAGE x000(gk) WITH 'UNEXPECTED VALUE I_XREF_FIELD ='
i_xref_field '(MUST BE = 1 OR = 2)' ''.
ENDIF.
IF st_rmvct IS INITIAL.
SELECT trtyp FROM t856 INTO TABLE st_rmvct.
ENDIF.
IF i_xref_field = 1.
c_rmvct = is_bseg-xref1.
ELSE.
c_rmvct = is_bseg-xref2.
ENDIF.
IF c_rmvct IS INITIAL.
WRITE i_xref_field TO l_msgv LEFT-JUSTIFIED.
CONCATENATE text-m00 l_msgv INTO l_msgv SEPARATED BY space.
* cons. transaction type is not specified => send an error message...
MESSAGE e123(g3) WITH l_msgv.
* Bitte geben Sie im Feld &1 eine Konsolidierungsbewegungsart an
ENDIF.
* c_rmvct <> initial...
READ TABLE st_rmvct TRANSPORTING NO FIELDS FROM c_rmvct.
CHECK NOT sy-subrc IS INITIAL.
* cons. transaction type does not exist => send error message...
WRITE i_xref_field TO l_msgv LEFT-JUSTIFIED.
CONCATENATE text-m00 l_msgv INTO l_msgv SEPARATED BY space.
MESSAGE e124(g3) WITH c_rmvct l_msgv.
* KonsBewegungsart &1 ist ungültig (bitte Eingabe im Feld &2 korrigieren
ENDFORM. "xref_to_rmvct
* end of insertion "wms092357
4. Затем идем в настройку замещения:
SPRO: Финансы - Бухгалтерия дебиторов и кредиторов - Бизнес-операции - Проводка по альтернативному контрольному счету - Прочие операции особой главной книги - Выполнение и проверка настройки для документа - Замещение в бухгалтерских документах, ну или прямой вызов транзакции
OBBH (так как для версий младше 6.0 путь кажется немного другой).
Там или уже есть запись для вашей балансовой единицы с моментом времени 2 или нет, тогда надо вставить запись по аналогии с рисунком OBBH.png (Имя замещения может быть любым, не обязательно BLOCK).
После этого или сразу попадаем, если мы вставили запись или по двойному клику мышью, если запись есть, в настройку замещения. Создаем для нашего замещения BLOCK (из примера) свой шаг (при этом если там уже есть какие-то шаги, то не трогаем их, не вы их туда ставили, не вам их трогать). Ну в общем после вставки своего шага, должна быть картинка как на рисунке STEP-1.png, т.е. если вид операции BKPF-AWTYP = 'RMRP' (проводка счета/документа логистики) вызвать нашу подпрограмму U177. Если голова есть, то как получить такую картинку думаю дойдет, если нет... считайте что это тест, который вы провалили и дальше можно не читать

это не ваша тема...
5. Теперь переходим к добавлению своего поля на подэкран сета логистики. Делается это достаточно просто, используя расширение LMR1M001, которое добавляем с свой проект через транзакцию
CMOD, рисунок LMR1M001.png. В этом расширении создаем подэкран 0400, пример на рисунке 0400.png, обратите внимание на позиции элементов и имя поля ввода альтернативного счета, ну если хотите получить рабочий пример путем copy+paste. Ниже тексты программ по реализации логики и объявления переменных.
Глобальные переменные для экзита:
*----------------------------------------------------------------------*
***INCLUDE ZXM08TOP .
*----------------------------------------------------------------------*
*&**********************************************************************
*& Comments : Замещение контрольного счета кредитора при проводке
*& счетов из ММ (Счет логистики). Общие данные
*& Platform : SAP R/3 ver ECC 6.00
*& Autor : Uukrul
*& Date create : 28.09.2007
*& Date change : 28.09.2007
*&**********************************************************************
*& Date change : 28.09.2007 - Общая разработка программы замещения
*&**********************************************************************
data: gf_hkont like bseg-hkont. "Счет ГК
field-symbols: <fs_aktiv> type any.
Логика экрана 0400:
*&**********************************************************************
*& Comments : Замещение контрольного счета кредитора при проводке
*& счетов из ММ (Счет логистики) экран 0400
*& Platform : SAP R/3 ver ECC 6.00
*& Autor : uukrul
*& Date create : 28.09.2007
*& Date change : 28.09.2007
*&**********************************************************************
*& Date change : 28.09.2007 - Общая разработка
*&**********************************************************************
process before output.
module status_0400.
*
process after input.
module user_command_0400.
*
process on value-request.
field gf_hkont module help_hkont.
Текст модуля STATUS_0400:
*----------------------------------------------------------------------*
***INCLUDE ZXM08O01_PBO .
*----------------------------------------------------------------------*
*&**********************************************************************
*& Comments : Замещение контрольного счета кредитора при проводке
*& счетов из ММ (Счет логистики).
*& PBO - логика экранов
*& Platform : SAP R/3 ver ECC 6.00
*& Autor : Uukrul
*& Date create : 28.09.2007
*& Date change : 28.09.2007
*&**********************************************************************
*& Date change : 28.09.2007 - Общая разработка программы замещения
*&**********************************************************************
*&---------------------------------------------------------------------*
*& Module STATUS_0400 OUTPUT
*&---------------------------------------------------------------------*
* Обработка для экрана 0400
*----------------------------------------------------------------------*
module status_0400 output.
assign ('(SAPLMR1M)AKT_TYP') to <fs_aktiv>.
check sy-subrc = 0.
loop at screen.
case <fs_aktiv>.
* Режим просмотра документа, поле не доступно для редактирвоания
when 'A'.
if screen-name = 'GF_HKONT'.
screen-input = 0.
modify screen.
endif.
endcase.
endloop.
unassign <fs_aktiv>.
endmodule. " STATUS_0400 OUTPUT
Текст модуля user_command_0400 (ну тут пусто, так что так задел на будущее):
*----------------------------------------------------------------------*
***INCLUDE ZXM08I01_PAI .
*----------------------------------------------------------------------*
*&**********************************************************************
*& Comments : Замещение контрольного счета кредитора при проводке
*& счетов из ММ (Счет логистики).
*& PAI - логика экранов
*& Platform : SAP R/3 ver ECC 6.00
*& Autor : Uukrul
*& Date create : 28.09.2007
*& Date change : 28.09.2007
*&**********************************************************************
*& Date change : 28.09.2007 - Общая разработка программы замещения
*&**********************************************************************
*&---------------------------------------------------------------------*
*& Module user_command_0400 INPUT
*&---------------------------------------------------------------------*
* Обработка для экрана 0400
*----------------------------------------------------------------------*
module user_command_0400 input.
endmodule. " user_command_0400 INPUT
Текст модуля help_hkont (Справка по значению ввода), в принципе тут сделано по простому, для выбора предлагаются только контрольные счета кредиторов. Но если у вас есть своя логика обработки, то можете вставить ее сюда и предлагать счета кредитров по своим правилам:
*----------------------------------------------------------------------*
***INCLUDE ZXM08I01_HVR .
*----------------------------------------------------------------------*
*&**********************************************************************
*& Comments : Замещение контрольного счета кредитора при проводке
*& счетов из ММ (Счет логистики).
*& Вызовы справки к собственным полям экрана
*& Platform : SAP R/3 ver ECC 6.00
*& Autor : Uukrul
*& Date create : 28.09.2007
*& Date change : 28.09.2007
*&**********************************************************************
*& Date change : 28.09.2007 - Общая разработка программы замещения
*&**********************************************************************
*&---------------------------------------------------------------------*
*& Module help_hkont INPUT
*&---------------------------------------------------------------------*
* Справка по выбору контрольного счета кредитора для экрана 0400
*----------------------------------------------------------------------*
module help_hkont input.
data: l_bukrs like bkpf-bukrs,
l_fieldname(30) type c value '(SAPLMR1M)RBKPV-BUKRS'.
field-symbols: <fs>.
assign: (l_fieldname) to <fs>.
l_bukrs = <fs>.
call function 'FI_F4_AKONT'
exporting
i_bukrs = l_bukrs
i_mitkz = 'K'
i_akont = gf_hkont
importing
e_akont = gf_hkont
exceptions
invalid_call = 1
nothing_found = 2
internal_error = 3
others = 4.
if sy-subrc <> 0.
endif.
unassign <fs>.
endmodule. " help_hkont INPUT
Ну и текст самого экзита LFDCB001, ФМ:EXIT_SAPLFDCB_001, Include: ZXM08U31
*&---------------------------------------------------------------------*
*& Include ZXM08U31
*&---------------------------------------------------------------------*
*&**********************************************************************
*& Comments : Замещение контрольного счета кредитора при проводке
*& счетов из ММ (Счет логистики). Общие данные
*& Platform : SAP R/3 ver ECC 6.00
*& Autor : Uukrul
*& Date create : 28.09.2007
*& Date change : 28.09.2007
*&**********************************************************************
*& Date change : 28.09.2007 - Общая разработка программы замещения
*&**********************************************************************
data: lt_documents like acc_doc occurs 1 with header line.
data: l_belnr like bkpf-belnr,
l_awref type acchd-awref,
l_aworg type acchd-aworg,
l_hkont like bseg-hkont,
l_akont like lfb1-akont.
* Режим обработки документа
assign ('(SAPLMR1M)AKT_TYP') to <fs_aktiv>.
check sy-subrc = 0.
case <fs_aktiv>.
* Просмотр документа
when 'A'.
move: i_invfo-belnr to l_awref,
i_invfo-gjahr to l_aworg.
refresh: lt_documents.
call function 'AC_DOCUMENT_RECORD'
exporting
i_awtyp = 'RMRP'
i_awref = l_awref
i_aworg = l_aworg
i_awtyp_incl = 'BKPF'
i_bukrs = i_invfo-bukrs
x_dialog = space
tables
t_documents = lt_documents
exceptions
no_reference = 1
no_document = 2
others = 3.
read table lt_documents with key bukrs = i_invfo-bukrs.
if sy-subrc = 0.
l_belnr = lt_documents-docnr.
select single hkont into l_hkont
from bseg where bukrs = lt_documents-bukrs and
belnr = l_belnr and
gjahr = lt_documents-ac_gjahr and
koart = i_invfo-koart.
* Если документ не найден, значит была предварительная регистрация
if sy-subrc <> 0.
select single hkont into l_hkont
from vbsegk where ausbk = i_invfo-bukrs and
belnr = l_belnr and
gjahr = i_invfo-gjahr and
lifnr = i_invfo-lifnr.
endif.
* Счет кредитора из основной записи кредиторов
select single akont into (l_akont)
from lfb1 where lifnr = i_invfo-lifnr and
bukrs = i_invfo-bukrs.
* Если счета не совпадают, то было замещение
if l_akont <> l_hkont. gf_hkont = l_hkont. endif.
endif.
endcase.
unassign <fs_aktiv>.
В общем система простая, если счет замещения пустой, тогда работа по счету из основной записи кредитора, если заполнено, тогда работа по новому контролному счету. Операции сторно, авизо и допдебетование/кредитование вроде как ловятся в замещении корректно.
Если кто обнаружил грабли, пишите будем править, согласно открывшимся обстоятельствам.