Тут вопрос увидел
, а как раз недавно делал тоже самое, немного помучился, и не смог вспомнить как же делал, пришлось лезть в систему и смотреть как же я извращался, оказалось все просто.
В двух словах (весь код приводить не буду), есть табличка с заполнеными данными (материал, к-во, склад, завод), если необходимо новая партия, просто создаем ее и заполняем поле move_batch в табличке типа BAPI2017_GM_ITEM_CREATE
*&---------------------------------------------------------------------*
*& Form post_data
*&---------------------------------------------------------------------*
* Проводка движений
*----------------------------------------------------------------------*
FORM post_data .
DATA: npos, cntpos TYPE i.
DATA: ls_zgoodsmvt_item1 LIKE LINE OF zgoodsmvt_item1.
cntpos = 300.
CLEAR zgoodsmvt_header.
CLEAR zgoodsmvt_item1.
"REFRESH zgoodsmvt_item.
CLEAR zgoodsmvt_headret.
REFRESH bapiret.
REFRESH bapiret2.
zgoodsmvt_header-ref_doc_no = p_xblnr.
zgoodsmvt_header-pstng_date = p_budat.
zgoodsmvt_header-doc_date = p_budat.
zgoodsmvt_header-header_txt = 'Производство'.
zgoodsmvt_code = '04'.
npos = 0.
"mblnr = mblnr + 1.
LOOP AT zgoodsmvt_item INTO ls_zgoodsmvt_item1 WHERE move_type = '311' OR move_type = '309'.
npos = npos + 1.
IF npos > cntpos.
IF zgoodsmvt_item1[] IS NOT INITIAL.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = zgoodsmvt_header
goodsmvt_code = zgoodsmvt_code
IMPORTING
goodsmvt_headret = zgoodsmvt_headret
TABLES
goodsmvt_item = zgoodsmvt_item1
return = bapiret2.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
IF zgoodsmvt_headret IS NOT INITIAL.
APPEND zgoodsmvt_headret TO docheader.
ENDIF.
CLEAR zgoodsmvt_header.
CLEAR zgoodsmvt_item1.
ENDIF.
ENDIF.
IF cr_nbth EQ 'X'. " Создание новых партий для 309 ВД " <<<<<< ТУТ
PERFORM create_new_batch CHANGING ls_zgoodsmvt_item1.
ENDIF.
MOVE-CORRESPONDING ls_zgoodsmvt_item1 TO zgoodsmvt_item1.
APPEND zgoodsmvt_item1.
ENDLOOP.
IF zgoodsmvt_item1[] IS NOT INITIAL.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = zgoodsmvt_header
goodsmvt_code = zgoodsmvt_code
IMPORTING
goodsmvt_headret = zgoodsmvt_headret
TABLES
goodsmvt_item = zgoodsmvt_item1
return = bapiret2.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
IF zgoodsmvt_headret IS NOT INITIAL.
APPEND zgoodsmvt_headret TO docheader.
ENDIF.
CLEAR zgoodsmvt_header.
CLEAR zgoodsmvt_item1.
ENDIF.
IF bapiret2[] IS NOT INITIAL.
LOOP AT bapiret2 .
APPEND bapiret2 TO bapiret.
ENDLOOP.
ENDIF.
ENDFORM. " post_data
FORM create_new_batch
CHANGING rs_zgoodsmvt_item LIKE LINE OF zgoodsmvt_item1.
DATA: zclass TYPE klah-class.
DATA: zlgort TYPE mchb-lgort.
DATA: gt_mcha TYPE STANDARD TABLE OF mcha.
DATA: gt_mchb TYPE STANDARD TABLE OF mchb.
DATA: ls_mcha LIKE mcha.
DATA: xbncom TYPE bncom.
* SELECT SINGLE * INTO ls_mcha FROM mcha WHERE charg = wa_xmseg-charg AND
* matnr = wa_xmseg-matnr AND werks = wa_xmseg-werks.
IF rs_zgoodsmvt_item-move_type EQ '309'.
ls_mcha-matnr = rs_zgoodsmvt_item-move_mat.
ls_mcha-werks = rs_zgoodsmvt_item-move_plant.
ELSE.
ls_mcha-matnr = rs_zgoodsmvt_item-material.
ls_mcha-werks = rs_zgoodsmvt_item-plant.
ENDIF.
"ls_mcha-lgort = rs_zgoodsmvt_item-move_stloc.
"ls_mcha-charg = batch_num.
" ls_mcha-hsdat = p_budat. см. Описание в начале
" '*'. " Автоматичесская
" '-'. " Без партий
PERFORM check_use_batch
USING ls_mcha-matnr
CHANGING rs_zgoodsmvt_item-move_batch.
IF rs_zgoodsmvt_item-move_batch EQ '*'.
PERFORM get_class CHANGING zclass.
CALL FUNCTION 'VB_CREATE_BATCH'
EXPORTING
ymcha = ls_mcha
new_lgort = rs_zgoodsmvt_item-move_stloc
bypass_lock = space
x_bncom = xbncom
ref_matnr = space
ref_charg = space
kzcla = '1' "ls_tco43-kzcla - возможность класификации, упростил см LCOKO1F81 там выбор по транзакции и профилю производству
xkcfc = 'X' " ls_tco43-xkcfc
* class = 'BATCH'
* class = 'Z_BATCH'
class = zclass
no_change_of_bwtar = space "'X' "space "space " yx'X'
IMPORTING
ymcha = ls_mcha
TABLES
new_batch = gt_mcha
new_batch_stoloc = gt_mchb
EXCEPTIONS
no_material = 1
no_batch = 2
no_plant = 3
material_not_found = 4
plant_not_found = 5
stoloc_not_found = 6
lock_on_material = 7
lock_on_plant = 8
lock_on_batch = 9
lock_system_error = 10
no_authority = 11
batch_exist = 12
stoloc_exist = 13
illegal_batch_number = 14
no_batch_handling = 15
no_valuation_area = 16
valuation_type_not_found = 17
no_valuation_found = 18
error_automatic_batch_number = 19
cancelled = 20
wrong_status = 21
interval_not_found = 22
number_range_not_extern = 23
object_not_found = 24
error_check_batch_number = 25
no_external_number = 26
no_customer_number = 27
no_class = 28
error_in_classification = 29
inconsistency_in_key = 30
OTHERS = 31.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
rs_zgoodsmvt_item-move_batch = ls_mcha-charg.
rs_zgoodsmvt_item-move_val_type = ls_mcha-bwtar.
ELSE.
CONCATENATE 'Материал' ls_mcha-matnr 'не ведется по партиям, партия не создавалась' INTO ls_alvmessage-name SEPARATED BY space.
ls_alvmessage-type = 'S'.
APPEND ls_alvmessage TO gt_alvmessage.
ENDIF.
ENDFORM. " create_new_batch
Думаю все понятно, если чего не ясно - спрашивайте.