Filling a New Type of IDoc by Running an ABAP Program
I’d like to share a short note on how to create and populate a new type of IDoc by executing an ABAP program.
0. Objective
Create a new IDoc type and an ABAP program, which, when executed, will populate the IDoc with data from a custom table.
1. Creating the Table
Create a table whose values will be included in a segment of your IDoc.
See the note: Creating a Custom Table and Its Maintenance View in SAP
In my example, I’ll use a table with the technical name ZTBL_IDOC1.

2. Creating a New IDoc Segment
See: Defining Segments
Create a new segment for your IDoc using transaction WE31. In my case, the structure of the new segment will resemble the structure of the table whose values I plan to transfer to this segment.

Once the new segment is created, unlock it by selecting Edit -> Set release from the menu.

3. Creating a New IDoc Type
See: Defining New IDoc Types
See: Defining and Using a Basic Type
Using transaction WE30, create a new IDoc type and include the previously created segment in it.

Also, unlock the new IDoc type by selecting Edit -> Set release from the menu.

4. Creating a New Message Type and Assigning It to the IDoc Type
See: Assigning Basic Types to Message Types
Create a new message type and assign it to the newly created IDoc type. Perform these steps in transactions WE81 and WE82.

5. Adding the New Message Type to the Receiving System
See: Partner Profiles in the Standard Dialog
In transaction WE20, add the new message type for the system where the new IDoc is intended to be sent.

6. Setting Up the Distribution Model
See: Modelling Distribution
See: Setting Up Communication
Configure the distribution model using transaction BD64, adding the new message type.

See: SAP IDocs. Подготовка HR мастер-данных для переноса в другую HR систему. Часть 1
See: SAP IDocs. Подготовка HR мастер-данных для переноса в другую HR систему. Часть 2
7. Creating the ABAP Program to Populate the IDoc
The source code was taken from here and slightly adapted.
REPORT zdemo_idoc.
TABLES: ztbl_idoc1.
DATA : s_ctrl_rec LIKE edidc, "Idoc Control Record
s_zsegment LIKE zdm_sgmt. "CUSTOMER Header Data
DATA : t_tbl_idoc1 LIKE ztbl_idoc1 OCCURS 0 WITH HEADER LINE.
DATA : t_edidd LIKE edidd OCCURS 0 WITH HEADER LINE. "Data Records
DATA : lt_comm_idoc LIKE edidc OCCURS 0 WITH HEADER LINE. "Generated Communication IDOc
CONSTANTS: c_idoctp LIKE edidc-idoctp VALUE 'ZBASIC_IT'. "
CONSTANTS :c_segnam LIKE edidd-segnam VALUE 'ZDM_SGMT'. "
SELECT-OPTIONS: s_pernr FOR ztbl_idoc1-pernr OBLIGATORY.
PARAMETERS: c_mestyp LIKE edidc-mestyp DEFAULT 'ZDEMO_MESSTYPE', "Message type
c_rcvprt LIKE edidc-rcvprt DEFAULT 'LS', "System type
c_logsys LIKE edidc-rcvprn DEFAULT 'ERPCLNT810'. "Reciever
START-OF-SELECTION.
PERFORM generate_data_records.
PERFORM generate_control_record.
PERFORM send_idoc.
FORM generate_data_records .
SELECT * FROM ztbl_idoc1
INTO TABLE t_tbl_idoc1
WHERE pernr IN s_pernr.
IF sy-subrc <> 0.
ENDIF.
PERFORM arrange_data_records.
ENDFORM.
FORM generate_control_record .
s_ctrl_rec-mestyp = c_mestyp. "Message type
s_ctrl_rec-idoctp = c_idoctp. "Basic IDOC type
s_ctrl_rec-rcvprt = c_rcvprt. "Partner type of receiver
s_ctrl_rec-rcvprn = c_logsys. "Partner number of receiver
ENDFORM.
FORM send_idoc .
CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
EXPORTING
master_idoc_control = s_ctrl_rec
* OBJ_TYPE = ''
* CHNUM = ''
TABLES
communication_idoc_control = lt_comm_idoc
master_idoc_data = t_edidd
EXCEPTIONS
error_in_idoc_control = 1
error_writing_idoc_status = 2
error_in_idoc_data = 3
sending_logical_system_unknown = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
COMMIT WORK.
LOOP AT lt_comm_idoc.
WRITE:/ 'IDoc Number - ', lt_comm_idoc-docnum.
ENDLOOP.
ENDIF.
ENDFORM.
FORM arrange_data_records .
SORT t_tbl_idoc1 BY pernr.
LOOP AT t_tbl_idoc1.
s_zsegment-pernr = t_tbl_idoc1-pernr.
s_zsegment-begda = t_tbl_idoc1-begda.
s_zsegment-endda = t_tbl_idoc1-endda.
s_zsegment-zfield1 = t_tbl_idoc1-zfield1.
s_zsegment-zfield2 = t_tbl_idoc1-zfield2.
s_zsegment-zfield3 = t_tbl_idoc1-zfield3.
t_edidd-segnam = c_segnam.
t_edidd-sdata = s_zsegment.
APPEND t_edidd.
CLEAR t_edidd.
ENDLOOP.
ENDFORM.
8. Testing
The following video demonstrates the sequence of actions:
- Data is collected from the custom table and used to populate segments of the new IDoc via the ABAP program;
- The same program calls the function module
MASTER_IDOC_DISTRIBUTEto create the IDoc and add it to the outbound queue;
See: Call of MASTER_IDOC_DISTRIBUTE
As a result, three IDocs were created with three entries in their segments, matching the records in the Z* table. After processing with program RSEOUT00, the IDoc status changed from "30 - IDoc ready for dispatch (ALE service)" to "03 - Data passed to port OK".

Thank you for your attention!