Перед нами стояла следующая задача:
1. Создать ЕО;
2. Упаковать в нее материалы и другие ЕО;
3. ЕО и неупакованные материалы поместить в заказ на перемещение (MO) аналогично работе тр. VL10B и VL10HU;
4. На основе MO создать исходящую поставку (OD) таким образом, чтобы в нее попали материалы и ЕО из MO.
1. Создание ЕО реализовано с помощью BAPI.
Code:
  LS_HUHEADER-PACK_MAT = U_VHILM.
  LS_HUHEADER-EXT_ID_HU_2 = U_EXIDV2.
  call function 'BAPI_HU_CREATE'
    exporting
      HEADERPROPOSAL = LS_HUHEADER
    importing
      HUHEADER       = LS_HUHEADER_E
      HUKEY          = C_EXIDV
    tables
      RETURN         = LT_RETURN.
  call function 'BAPI_TRANSACTION_COMMIT'
    exporting
      WAIT   = 'X'
    importing
      RETURN = LS_RETURN.
2.1 Упаковка материалов в ЕО. Не забыдь вызвать 'BAPI_TRANSACTION_COMMIT'.
Code:
form HU_PACK_MATERIAL using U_EXIDV   type EXIDV
                            US_HUITEM type TYPE_HUITEM.
  data
    :
      LS_HUITEM type BAPIHUITMPROPOSAL
    , LT_RETURN type table of BAPIRET2
    , LS_RETURN type BAPIRET2
    .
  LS_HUITEM-MATERIAL      = US_HUITEM-MATNR. " Номер материала
  LS_HUITEM-BATCH         = US_HUITEM-CHARG. " Номер партии
  LS_HUITEM-PACK_QTY      = US_HUITEM-MENGE. " Упакованное базисное количество в позиции ЕО
  LS_HUITEM-BASE_UNIT_QTY = US_HUITEM-MEINS.
  LS_HUITEM-PLANT         = US_HUITEM-WERKS. " Завод
  LS_HUITEM-STGE_LOC      = US_HUITEM-LGORT. " Склад
  LS_HUITEM-SPEC_STOCK    = US_HUITEM-SOBKZ. " Код особого запаса
  LS_HUITEM-SP_STCK_NO    = US_HUITEM-SONUM. " Номер особого запаса
  LS_HUITEM-HU_ITEM_TYPE  = '1'.
  clear: LT_RETURN, LS_RETURN.
  call function 'BAPI_HU_PACK'
    exporting
      HUKEY               = U_EXIDV
      ITEMPROPOSAL        = LS_HUITEM
    tables
      RETURN              = LT_RETURN
            .
endform.                    " HU_PACK_MATERIAL
2.2. Упаковка ЕО в ЕО. Не забыдь вызвать 'BAPI_TRANSACTION_COMMIT'.
Code:
form HU_PACK_HU using U_EXIDV type EXIDV
                      US_HUITEM type TYPE_HUITEM.
  data
    :
      LS_HUITEM type BAPIHUITMPROPOSAL
    , LT_RETURN type table of BAPIRET2
    , LS_RETURN type BAPIRET2
    .
  LS_HUITEM-LOWER_LEVEL_EXID = US_HUITEM-EXIDV. " Внешний ид. единицы обработки
  LS_HUITEM-HU_ITEM_TYPE = '3'.
  clear: LT_RETURN, LS_RETURN.
  call function 'BAPI_HU_PACK'
    exporting
      HUKEY               = U_EXIDV
      ITEMPROPOSAL        = LS_HUITEM
    tables
      RETURN              = LT_RETURN.
endform.                    " HU_PACK_HU
3. Создание заказа к делу не относится, поэтому здесь описывать не буду. Если будет необходимо, спрашивайте, отвечу.
4.1. Создание OD. В нашем случае выбор позиций из MO, поэтому SELECT по EKPO.
Code:
  clear : LT_STITEM, LT_HU, LT_HUS.
  select * into LS_EKPO from EKPO where EBELN = PA_EBELN and LOEKZ = ''.
    " Данные позиций для создания поставки
    LS_STITEM-REF_DOC    = LS_EKPO-EBELN.
    LS_STITEM-REF_ITEM   = LS_EKPO-EBELP.
    LS_STITEM-DLV_QTY    = LS_EKPO-MENGE.
    LS_STITEM-SALES_UNIT = LS_EKPO-MEINS.
    append LS_STITEM to LT_STITEM.
    " Данные ЕО для соединения с позициями поставки
    clear LS_HU.
    select HURES~VENUM HURES~VEPOS VEKP~EXIDV VEKP~CHARG 
      into (LS_HU-VENUM, LS_HU-VEPOS, LS_HU-TOP_HU_EXTERNAL, LS_HU-CHARG)
      from HURES join VEKP on HURES~VENUM = VEKP~VENUM
      where HURES~OBJECT = 'PO'
        and HURES~OBJKEY = LS_EKPO-EBELN
        and HURES~OBJITM = LS_EKPO-EBELP.
      LS_HU-TOP_HU_INTERNAL = LS_HU-VENUM.
      LS_HU-RFBEL = LS_EKPO-EBELN.
      LS_HU-RFPOS = LS_EKPO-EBELP.
      append LS_HU to LT_HU.
      LS_HUS-EXIDV = LS_HU-TOP_HU_EXTERNAL.
      append LS_HUS to LT_HUS.
    endselect.
  endselect.
  clear: LS_RETURN, LT_RETURN.
  set update task local.
  " создаем исходящую поставку
  call function 'BAPI_OUTB_DELIVERY_CREATE_STO'
    importing
      DELIVERY                = LV_DELIVERY
    tables
      STOCK_TRANS_ITEMS       = LT_STITEM
      RETURN                  = LT_RETURN.
  .
  if LV_DELIVERY is initial.
    exit.
  endif.
  call function 'BAPI_TRANSACTION_COMMIT'
    exporting
      WAIT          = 'X'.
4.2. Включение ЕО в OD.
Code:
  data: LS_VBKOK type VBKOK,
        LT_PROT  type table of PROTT.
  data: LV_ERRCODE type SY-SUBRC,
        LT_HUS_O    type VSEP_T_EXIDV.
  data: LS_LIKP type LIKP.
  constants: LC_HUOBJ01 type HU_OBJECT value '01'. " исходящая поставка (см. диапазон значений домена HU_OBJECT)
  constants: LC_KOMUE1  type KOMUE value '01'. " Копирование комплектуемого количества из интерфейса
  " считываем в память таблицы, относящиеся к поставке (ls_object)
  clear LS_OBJECT.
  LS_OBJECT-OBJECT = LC_HUOBJ01. " исходящая поставка (см. диапазон значений домена HU_OBJECT)
  LS_OBJECT-OBJKEY = LV_DELIVERY.
  call function 'V51P_GET_TABLES'
    exporting
      IS_OBJECT   = LS_OBJECT
    exceptions
      HUS_LOCKED  = 1
      NO_HU_FOUND = 2
      FATAL_ERROR = 3
      others      = 4.
  if SY-SUBRC <> 0.
  endif.
  " добавляем ЕО к поставке
  call function 'V51P_ADD_HU_TO_OBJEKT'
    exporting
      IT_HUS        = LT_HUS
    importing
      EF_RCODE      = LV_ERRCODE
      ET_HUS        = LT_HUS_O
      ET_MESSAGES   = LT_MESSAGES
    exceptions
      HUS_LOCKED    = 1
      NOT_POSSIBLE  = 2
      NOTHING_FOUND = 3
      FATAL_ERROR   = 4
      others        = 5.
  if SY-SUBRC <> 0.
  endif.
  call function 'HU_PACKING_UPDATE'
    exporting
      IF_SYNCHRON = 'X'.
  " обновляем данные поставки (с учетом упакованного материала)
  select single *
    into LS_LIKP
    from LIKP
    where VBELN = LV_DELIVERY.
  clear LS_VBKOK.
  LS_VBKOK-VBELN = LS_VBKOK-VBELN_VL = LV_DELIVERY.
  LS_VBKOK-VBTYP_VL = LS_LIKP-VBTYP.
  LS_VBKOK-KOMUE = LC_KOMUE1.
  LS_VBKOK-PACKING_REFRESH = 'X'.
  LS_VBKOK-PACKING_FINAL = 'X'.
  call function 'WS_DELIVERY_UPDATE'
    exporting
      VBKOK_WA       = LS_VBKOK
      SYNCHRON       = 'X'
      COMMIT         = 'X'
      DELIVERY       = LV_DELIVERY
      UPDATE_PICKING = 'X'
      NICHT_SPERREN  = ' '
    tables
      PROT           = LT_PROT.
  if SY-SUBRC <> 0.
    rollback work.
  else.
    commit work and wait.
  endif.