СБИС Сапёр - Вызов из программ печати

Материал из razgovorov.ru
(перенаправлено с «Вызов SBIS SAPPER из программ печати»)
Перейти к: навигация, поиск

Общая концепция

Алгоритм формирования электронного документа следующий:

  1. SBIS SAPPER для каждого отправляемого документа SAP для формирования электронного документа вызывает программу печати указанную в настройках
  2. программа печати рассчитывает данные необходимые для печати.
  3. перед вызовом формуляра управление передается в SBIS SAPPER. SAPPER проверяет кто инициатор вызова программы печати.
    1. Если это не SAPPER, то он возвращает управление программе печати (все как обычно).
    2. Если это SAPPER, то он из подготовленных программой печати данных, выбирает нужные (по настройкам выгрузки) и формирует XML документ. По окончании возвращает флаг, сигнализирующий о необходимости прервать программу печати.

Стандартные программы печати

Сначала запускается подпрограмма ENTRY. Это оболочка для подпрограммы PROCESSING, передает код возврата, в ней изменения не понадобятся:

FORM entry USING return_code us_screen.                     "#EC CALLED
  CLEAR retcode.
  xscreen = us_screen.
  PERFORM processing USING us_screen.
  IF retcode NE 0.
    return_code = 1.
  ELSE.
    return_code = 0.
  ENDIF.
  CLEAR status.
ENDFORM.

Вызов непосредственно печати обычно находится в теле подпрограммы PROCESSING.

FORM processing USING proc_screen.
  PERFORM checks.
  PERFORM init_data.
  PERFORM get_data.
  PERFORM print.
ENDFORM.

Поэтому до вызова печати (PRINT) необходимо вставить СБИС-код формирования электронных документов. Пример кода:

DATA  gv_not_print TYPE c .        " TENSOR SBIS EDO

FORM processing USING proc_screen.

  PERFORM checks.
  PERFORM init_data.
  PERFORM get_data.
  PERFORM sbis_edi.                " TENSOR SBIS EDO
  CHECK gv_not_print IS INITIAL.   " TENSOR SBIS EDO
  PERFORM print.

ENDFORM.

FORM sbis_edi .
* TENSOR SBIS EDO
  TRY.
      DATA cx_root TYPE REF TO cx_root.
      DATA cl_mapping TYPE REF TO /sbis/cl_mapping.
      CREATE OBJECT cl_mapping.
      CALL METHOD cl_mapping->calc_doc
        EXPORTING
          is_nast      = nast
        IMPORTING
          ev_not_print = gv_not_print.

      DATA cx_core TYPE REF TO /sbis/cx_core.
      CATCH /sbis/cx_core INTO cx_core.
        DATA  lv_cur_prog  TYPE char255.
        DATA  lv_cur_form  TYPE char255.
        CALL METHOD /sbis/cl_core=>get_current_progname
          IMPORTING
            ev_prog_name = lv_cur_prog
            ev_form_name = lv_cur_form.
        " exception проходит через прогр печати без текста!
        FIELD-SYMBOLS: <fs_exc> TYPE /sbis/s_cx_core.
        ASSIGN ('(/SBIS/SAPLGF_PRINT_PROG)GS_EXC') TO <fs_exc>.
        IF  <fs_exc>    IS ASSIGNED.
          <fs_exc>-error_msg_ext    = cx_core->lv_error_msg_ext.
          <fs_exc>-error_msg_detail = cx_core->lv_error_msg_detail
                                    && ` <= ` && lv_cur_prog && `->` && lv_cur_form.
        ENDIF.
        RAISE EXCEPTION TYPE /sbis/cx_core
          EXPORTING
            textid              = cx_core->textid
            lv_error_msg_ext    = cx_core->lv_error_msg_ext
            lv_error_msg_detail = cx_core->lv_error_msg_detail
                                  && ` <= ` && lv_cur_prog && `->` && lv_cur_form.
  ENDTRY.
ENDFORM.

Т.о. в зависимости от флага gv_not_print мы либо печатаем, либо выходим из программы с правильным кодом возврата.

Вызов из BADI

Пример кода для вызова из BADI для программы печати накладной ТОРГ-12. В зависимости от флага gv_not_print мы либо печатаем, либо выходим из BADI и из программы печати.

METHOD j_3r_torg12_badi_interface~doc_details.

** I_VBDKL    TYPE VBDKL
** T_VBDPL    TYPE EHS_VBDPL_T
** EDITABLE   TYPE XFELD
** HDOC       TYPE J_3RV_HT12
** ITEMS      TYPE J_3RV_TT12

**************************************************************
*                 TENSOR SBIS EDO                            *
**************************************************************
    DATA lv_prog_and_field TYPE char255.
    TRY.
*" GET NAST
        "имя программы берем из инишки сверху
        FIELD-SYMBOLS: <lfs_prog_name> TYPE char40.
        ASSIGN ('(/SBIS/SAPLGF_PRINT_PROG)GV_PROG_NAME') TO <lfs_prog_name>.
        IF <lfs_prog_name> IS ASSIGNED.

          lv_prog_and_field = `(` && <lfs_prog_name> && `)` && 'NAST'.
          FIELD-SYMBOLS: <lfs_nast> TYPE nast.
*          ASSIGN ('(J_3RV_DELIV_PDF)NAST') TO <lfs_nast>.
          ASSIGN (lv_prog_and_field) TO <lfs_nast>.
          IF <lfs_nast> IS ASSIGNED.
*" MAPPING
            DATA cx_root TYPE REF TO cx_root.
            DATA cl_mapping TYPE REF TO /sbis/cl_mapping.
            CREATE OBJECT cl_mapping.
            CALL METHOD cl_mapping->calc_doc
              EXPORTING
                is_nast      = <lfs_nast>
              IMPORTING
                ev_not_print = gv_not_print.
          ELSE.
            "нет такой переменной - исключение!
            RAISE EXCEPTION TYPE /sbis/cx_core
              EXPORTING
                textid              = /sbis/cx_core=>/sbis/cx_core
                lv_error_msg_ext    = `Variable not assigned: '`
                                      && lv_prog_and_field && `'`
                lv_error_msg_detail = ''.
          ENDIF. " IF <lfs_nast> IS ASSIGNED.

*" EXIT FROM PRINT PROGRAM
          IF NOT gv_not_print IS INITIAL.
            lv_prog_and_field = `(` && <lfs_prog_name> && `)` && 'VBDKL'.
            FIELD-SYMBOLS: <lfs_vbdkl> TYPE vbdkl.
            "ASSIGN ('(J_3RV_DELIV_PDF)VBDKL') TO <lfs_vbdkl>.
            ASSIGN (lv_prog_and_field) TO <lfs_vbdkl>.
            IF <lfs_vbdkl> IS ASSIGNED.
              CLEAR <lfs_vbdkl>-vbeln. " хитрый способ выйти из прогр J_3RV_DELIV_PDF
            ELSE.
              "если в логике программы что-то поменялось - исключение!
              RAISE EXCEPTION TYPE /sbis/cx_core
                EXPORTING
                  textid              = /sbis/cx_core=>/sbis/cx_core
                  lv_error_msg_ext    = `Variable not assigned: '`
                                        && lv_prog_and_field && `'`
                  lv_error_msg_detail = ''.
            ENDIF. " IF <lfs_vbdkl> IS ASSIGNED.
          ENDIF.
        ENDIF. " IF <lfs_prog_name> IS ASSIGNED.

      CATCH /sbis/cx_core INTO cx_core.
        DATA  lv_cur_prog  TYPE char255.
        DATA  lv_cur_form  TYPE char255.
        CALL METHOD /sbis/cl_core=>get_current_progname
          IMPORTING
            ev_prog_name = lv_cur_prog
            ev_form_name = lv_cur_form.
        " exception проходит через прогр печати без текста!
        FIELD-SYMBOLS: <fs_exc> TYPE /sbis/s_cx_core.
        ASSIGN ('(/SBIS/SAPLGF_PRINT_PROG)GS_EXC') TO <fs_exc>.
        IF  <fs_exc>    IS ASSIGNED.
          <fs_exc>-error_msg_ext    = cx_core->lv_error_msg_ext.
          <fs_exc>-error_msg_detail = cx_core->lv_error_msg_detail
                                    && ` <= ` && lv_cur_prog && `->` && lv_cur_form.
        ENDIF.
        RAISE EXCEPTION TYPE /sbis/cx_core
          EXPORTING
            textid              = cx_core->textid
            lv_error_msg_ext    = cx_core->lv_error_msg_ext
            lv_error_msg_detail = cx_core->lv_error_msg_detail
                                && ` <= ` && lv_cur_prog && `->` && lv_cur_form.
    ENDTRY.
  ENDMETHOD.

Вызов из формуляра SMARTFORM

Осуществляется в особенных случаях, когда в системе нет отдельной программы печати (например, в отраслевых решениях), или когда значительная часть логики перенесена в формуляр. Особенности вызова из формуляров - в необходимости прервать работу формуляра и корректно завершить основную программу после выхода из формуляра. Также необходимо чтобы данные формуляра, которые передаются в Сапер, были объявлены глобально. Вставить вызов кода необходимо в элемент смартформы "строки программы", где есть доступ к подготовленным данным печати. Например, в основной цикл по позициям. В инициализацию вставлять не имеет смысла - там нет доступа через assign к глобальным переменным формуляра, а также не обеспечивается корректный выход из формуляра/ФМ с rc=0.


Редактор smartforms


Пример кода:

* TENSOR SBIS EDO
TRY.
    DATA cx_root TYPE REF TO cx_root.
    DATA lv_not_print TYPE c VALUE ''.
    DATA cl_mapping TYPE REF TO /sbis/cl_mapping.
    CREATE OBJECT cl_mapping.
    CALL METHOD cl_mapping->calc_doc_efg
      EXPORTING
        iv_ini_name  = 'ZSF_INVOICE'
      IMPORTING
        ev_not_print = lv_not_print.
    IF lv_not_print = 'X'.
      " надо выйти без печати!
      " Set error message
      CALL FUNCTION 'SSFRT_WRITE_ERROR'
        EXPORTING
          i_msgid = '00'
          i_msgno = '208'
          i_msgv1 = 'SBIS: not print'.
* Raise the excption
      user_exception user_canceled.
    ENDIF.

  CATCH /sbis/cx_core INTO cx_core.
    " надо выйти без печати!
    " SET error message
    CALL FUNCTION 'SSFRT_WRITE_ERROR'
      EXPORTING
*       I_ERRNUMBER =
        i_msgid = '00'
*       I_MSGTY = 'E'
        i_msgno = '208'
        i_msgv1 = 'SBIS: not print'.
* Raise the excption
    user_exception user_canceled.

  CATCH cx_root INTO cx_root.
    " надо выйти без печати!
    " SET error message
    CALL FUNCTION 'SSFRT_WRITE_ERROR'
      EXPORTING
*       I_ERRNUMBER =
        i_msgid = '00'
*       I_MSGTY = 'E'
        i_msgno = '208'
        i_msgv1 = 'SBIS: not print'.
* Raise the excption
    user_exception user_canceled.
ENDTRY.

Как правило, программа печати не требует изменений и сама формирует необходимый код возврата.

Вызов из формуляра PDF

Осуществляется в особенных случаях, когда в системе нет отдельной программы печати (например, в отраслевых решениях), или когда значительная часть логики перенесена в формуляр. Особенности вызова из формуляров - в необходимости прервать работу формуляра и корректно завершить основную программу после выхода из формуляра. Вставить вызов кода необходимо в интерфейсе формуляра в код инициализации или в подпрограмму, где есть доступ к подготовленным данным печати:

Редактор pdf

Пример кода:

**************************************************************
*                 TENSOR SBIS EDO                            *
**************************************************************
  TRY.
      DATA cx_root TYPE REF TO cx_root.
      DATA lv_not_print TYPE c VALUE ''.
      DATA cl_mapping TYPE REF TO /sbis/cl_mapping.
      CREATE OBJECT cl_mapping.
      CALL METHOD cl_mapping->calc_doc
        exporting
          iv_ini_name = 'DP_TOVTORGPR_1175010'  " 
        IMPORTING
          ev_not_print = lv_not_print.
      IF lv_not_print = 'X'.
        return.
        MESSAGE ID 'SU' TYPE '-' NUMBER 000 WITH 'SBIS_COMPLETE'
          RAISING usage_error.
      ENDIF.
    CATCH cx_root INTO cx_root.
  ENDTRY.

В программе печати необходимо предусмотреть корректный выход с правильным кодом возврата.

Пример кода:

      CALL FUNCTION func_module_name
        EXPORTING
          /1bcdwb/docparams  = fp_docparams
          h_item             = items
          h_header           = h_doc
        IMPORTING
          /1bcdwb/formoutput = ls_formoutput
        EXCEPTIONS
          usage_error        = 1
          system_error       = 2
          internal_error     = 3.

**************************************************************
*                 TENSOR SBIS EDO - BEGIN                    *
**************************************************************
      IF sy-subrc <> 0 AND sy-msgv1 = 'SBIS_COMPLETE'.
        sy-subrc = 0.
        CALL FUNCTION 'FPCOMP_FORM_END'
          EXCEPTIONS
            usage_error    = 1
            system_error   = 2
            internal_error = 3
            OTHERS         = 4.
      ELSEIF sy-subrc <> 0.
**************************************************************
*                 TENSOR SBIS EDO - END                      *
**************************************************************
        retcode = sy-subrc.
        PERFORM protocol_update.
        MESSAGE e073 INTO gv_dummy.
        PERFORM protocol_update.
      ENDIF.

Акты сверки дебиторов\кредиторов

В стандартном SAP для построения актов сверки дебиторов\кредиторов используются программы J_3RF_ASD\J_3RF_ASK. Логика работы программ не позволяет встроить в текущий процесс обработки прерывание и получить необходимые данные, поэтому необходимо в случае использования стандартной программы скопировать её в Z* программу и внести изменения:

  1. В параметры добавить
    p_sbis LIKE rfpdo2-f140immd DEFAULT ' '
  2. Добавить перед формированием ALV-списка прерывание:
      
    IF p_sbis = abap_true. "SBIS
       DATA: lv_timestamp(30) TYPE c,
             lv_docum_id(60)  TYPE c,
             lv_detail_id(60) TYPE c.
    
       IMPORT lv_timestamp TO lv_timestamp FROM MEMORY ID 'ZSBIS_AKT_SVERKI_D'.
    
       CONCATENATE 'ZSBIS_J_3RF_ASD_DOCUM_' lv_timestamp INTO lv_docum_id.
       CONCATENATE 'ZSBIS_J_3RF_ASD_DETAIL_' lv_timestamp INTO lv_detail_id.
    
       EXPORT t_docum TO MEMORY ID lv_docum_id.
       EXPORT gt_detail TO MEMORY ID lv_detail_id.
       LEAVE PROGRAM.
    ENDIF.

Акты сверки. Прерывание перед формированием списка

Для собственной Z* программы следует внести вышеописанные изменения.

После внесения изменений требуется создать транзакцию для программы и создать программу вызова, пример ниже:

REPORT zprc_zsbis_act_sverki.

*проверить типы данных используемых структур

TYPES: BEGIN OF ty_doc,
*         box      TYPE c,
         lineno   TYPE i,
         kunnr    LIKE bsid-kunnr,
         bukrs    LIKE bsid-bukrs,
         gjahr    LIKE bsid-gjahr,
         monat    LIKE bsid-monat,
         bukad    LIKE bsid-bukrs,
         bstat(2),
         belnr    LIKE bsid-belnr,
         budat    LIKE bsid-budat,
         bldat    LIKE bsik-bldat,
         bktxt    LIKE bkpf-bktxt,
         buzei    LIKE bsid-buzei,
         gsber    LIKE bsid-gsber,
         rebzg    LIKE bsid-rebzg,
         rebzj    LIKE bsid-rebzj,
         rebzz    LIKE bsid-rebzz,
         augbl    LIKE bsid-augbl,
         augdt    LIKE bsid-augdt,
         xblnr    LIKE bsid-xblnr,           "Mutual calm stat.,orig.number
         vbeln    LIKE bsid-vbeln,           "SD-Invoice
         xref3    LIKE bsid-xref3,
         vertn    LIKE bsid-vertn,
         koart    LIKE bseg-koart,
         zuonr    LIKE bsid-zuonr,
         xzahl    LIKE bsid-xzahl,
         shkzg    LIKE bsid-shkzg,
         bschl    LIKE bsid-bschl,
         blart    LIKE bsid-blart,
         umskz    LIKE bsid-umskz,
         dmbtr    LIKE bsid-dmbtr,
         d_dmbtr  LIKE bsid-dmbtr,
         c_dmbtr  LIKE bsid-dmbtr,
         bwaer    LIKE bsid-waers,
         bisoc    LIKE tcurc-isocd,
         kursf    LIKE bkpf-kursf,
         wrbtr    LIKE bsid-wrbtr,
         d_wrbtr  LIKE bsid-wrbtr,
         c_wrbtr  LIKE bsid-wrbtr,
         waers    LIKE bsid-waers,
         isocd    LIKE tcurc-isocd,
         dweks    LIKE bsid-dmbtr,
         d_dweks  LIKE bsid-dmbtr,
         c_dweks  LIKE bsid-dmbtr,
         wweks    LIKE bsid-wrbtr,
         d_wweks  LIKE bsid-wrbtr,
         c_wweks  LIKE bsid-wrbtr,
         wwaer    LIKE bsid-waers,
         wpay     LIKE bseg-wrbtr,
         dpay     LIKE bseg-dmbtr,
         rebzt    LIKE bsid-rebzt,
         stneg    LIKE t041c-xnegp,
         intcnum  TYPE j_3rfcnt-intcnum,
         extcnum  TYPE j_3rfcnt-extcnum,
         cntdate  TYPE j_3rfcnt-cntdate,
       END OF ty_doc,

       BEGIN OF ty_detail,
         box     TYPE c,
         lineno  TYPE i,
         kunnr   LIKE bsid-kunnr,
         bukrs   LIKE bsid-bukrs,
         intcnum TYPE j_3rfcnt-intcnum,
         extcnum TYPE j_3rfcnt-extcnum,
         cntdate TYPE j_3rfcnt-cntdate,
         waers   LIKE bsik-waers,
         gjahr   LIKE bsid-gjahr,
         monat   LIKE bsid-monat,
         insal   LIKE glt0-tsl01,
         debet   LIKE glt0-tsl01,
         kredt   LIKE glt0-tsl01,
         ousal   LIKE glt0-tsl01,
       END OF ty_detail,

       BEGIN OF ty_items,
         line_type   TYPE char255,
         number      TYPE char255,
         name        TYPE char255,
         text        TYPE char255,
         section     TYPE char255,
         type        TYPE char255,
         date        TYPE budat,
         kredit      TYPE sumha,
         debet       TYPE sumha,
         link_number TYPE char255,
         link_name   TYPE char255,
         link_date   TYPE budat,
         link_type   TYPE char255,
         link_kredit TYPE sumha,
         link_debet  TYPE sumha,
       END OF ty_items.

DATA: lt_docum           TYPE STANDARD TABLE OF ty_doc WITH KEY kunnr bukrs gjahr belnr WITH HEADER LINE, "документы
      ls_docum           LIKE LINE OF lt_docum,

      lt_detail          TYPE STANDARD TABLE OF ty_detail, "сальдо, оборотка
      ls_detail          LIKE LINE OF lt_detail,

      gt_items2          TYPE STANDARD TABLE OF ty_items,
      gs_items2          LIKE LINE OF gt_items2,

      ls_api2_attachment TYPE /sbis/s_api2_attachment,

      lt_bukrs_re        TYPE /sbis/t_rng_bukrs,
      lt_bldat_re        TYPE /sbis/t_rng_bldat,

      lv_mode            TYPE c VALUE 'P',
      lv_program         TYPE sy-repid,
      lv_number          TYPE string,
      lv_bukrs_low       TYPE bukrs,
      lv_bukrs_high      TYPE bukrs,
      lv_kunnr_low       TYPE kunnr,
      lv_kunnr_high      TYPE kunnr,
      lv_first_date      TYPE sy-datum,
      lv_last_date       TYPE sy-datum,
      lv_tmstp           TYPE timestampl,
      lv_timestamp(30)   TYPE c,
      lv_docum_id(60)    TYPE c,
      lv_detail_id(60)   TYPE c.

DATA: bdc_tab     TYPE STANDARD TABLE OF bdcdata,
      bdc_line    LIKE LINE OF bdc_tab,
      message_tab TYPE STANDARD TABLE OF bapiret2.

FIELD-SYMBOLS: <fs_bdc_line>   LIKE LINE OF bdc_tab,
               <fs_docum>      LIKE LINE OF lt_docum,
               <fs_detail>     LIKE LINE OF lt_detail,
               <fs_items>      LIKE LINE OF gt_items2,

               <fs_bldat_re>,
               <fs_kunnr_re>,
               <fs_bukrs_re>,

               <fs_bldat_re_s> TYPE /sbis/s_rng_bldat,
               <fs_kunnr_re_s> TYPE /sbis/s_rng_kunnr2,
               <fs_bukrs_re_s> TYPE /sbis/s_rng_bukrs2.

FORM entry USING is_api2_attachment return_code us_screen.
  CLEAR: lv_program, lv_bukrs_low, lv_bukrs_high, lv_kunnr_low, lv_kunnr_high, lv_first_date, lv_last_date, lv_tmstp, lv_timestamp, lv_docum_id, lv_detail_id, lv_number, ls_api2_attachment.
  REFRESH: lt_docum, lt_detail, gt_items2, bdc_tab, lt_bukrs_re, lt_bldat_re.

  ls_api2_attachment = is_api2_attachment.

  ASSIGN ('(/SBIS/SAPPER)CL_TREE_ACCORDION->GS_CONTENT_FILTER-BLDAT_RE[]') TO <fs_bldat_re>.
  ASSIGN ('(/SBIS/SAPPER)CL_TREE_ACCORDION->GS_CONTENT_FILTER-BUKRS_RE[]') TO <fs_bukrs_re>.

  CHECK <fs_bldat_re> IS ASSIGNED.
  CHECK <fs_bukrs_re> IS ASSIGNED.

  IF <fs_bldat_re> IS INITIAL.
    return_code = 0.
    MESSAGE 'Введите даты в фильтре, чтобы отобразить корректный акт сверки!' TYPE 'I' DISPLAY LIKE 'E'.
    EXIT.
  ELSE.
    lt_bldat_re = <fs_bldat_re>.
  ENDIF.
  IF <fs_bukrs_re> IS INITIAL.
    return_code = 0.
    MESSAGE 'Введите организационный юнит в фильтре, чтобы отобразить корректный акт сверки!' TYPE 'I' DISPLAY LIKE 'E'.
    EXIT.
  ELSE.
    lt_bukrs_re = <fs_bukrs_re>.
  ENDIF.

***********************************************************************get user settings************************************************************************
  lv_kunnr_low = ls_api2_attachment-belnr. "KUNNR

  READ TABLE lt_bukrs_re ASSIGNING <fs_bukrs_re_s> INDEX 1.
  IF sy-subrc = 0.
    lv_bukrs_high = <fs_bukrs_re_s>-high.
  ENDIF.

  READ TABLE lt_bukrs_re ASSIGNING <fs_bukrs_re_s> INDEX 1.
  IF sy-subrc = 0.
    lv_bukrs_low = <fs_bukrs_re_s>-low.
  ENDIF.

  READ TABLE lt_bldat_re ASSIGNING <fs_bldat_re_s> INDEX 1.
  IF sy-subrc = 0.
    CONCATENATE <fs_bldat_re_s>-high+6(2) <fs_bldat_re_s>-high+4(2) <fs_bldat_re_s>-high(4) INTO lv_last_date.
  ENDIF.

  READ TABLE lt_bldat_re ASSIGNING <fs_bldat_re_s> INDEX 1.
  IF sy-subrc = 0.
    CONCATENATE <fs_bldat_re_s>-low+6(2) <fs_bldat_re_s>-low+4(2) <fs_bldat_re_s>-low(4) INTO lv_first_date.
  ENDIF.

  CONCATENATE lv_first_date lv_kunnr_low lv_last_date INTO lv_number. "номер акта сверки дата_начала+вендор+дата_конца

  lv_program = 'ZPRC_ZJ_3RF_ASD'.
****************************************************************************************************************************************************************

  ASSIGN bdc_line TO <fs_bdc_line>.

  <fs_bdc_line>-program = lv_program.
  <fs_bdc_line>-dynpro = '1000'.
  <fs_bdc_line>-dynbegin = 'X'.
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: <fs_bdc_line>.
  <fs_bdc_line>-fnam = 'DD_KUNNR-LOW'.
  <fs_bdc_line>-fval = lv_kunnr_low.
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: <fs_bdc_line>.
  <fs_bdc_line>-fnam = 'DD_KUNNR-HIGH'.
  <fs_bdc_line>-fval = lv_kunnr_high.
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: <fs_bdc_line>.
  <fs_bdc_line>-fnam = 'DD_BUKRS-LOW'.
  <fs_bdc_line>-fval = lv_bukrs_low.
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: <fs_bdc_line>.
  <fs_bdc_line>-fnam = 'DD_BUKRS-HIGH'.
  <fs_bdc_line>-fval = lv_bukrs_high.
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: <fs_bdc_line>.
  <fs_bdc_line>-fnam = 'D_PERIOD-LOW'.
  <fs_bdc_line>-fval = lv_first_date. "дата начала
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: <fs_bdc_line>.
  <fs_bdc_line>-fnam = 'D_PERIOD-HIGH'.
  <fs_bdc_line>-fval = lv_last_date. "дата конца
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: <fs_bdc_line>.
  <fs_bdc_line>-fnam = 'PRINTER'.
  <fs_bdc_line>-fval = '*'.
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: <fs_bdc_line>.
  <fs_bdc_line>-fnam = 'P_SBIS'.
  <fs_bdc_line>-fval = 'X'.
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: <fs_bdc_line>.
  <fs_bdc_line>-fnam = 'BDC_OKCODE'.
  <fs_bdc_line>-fval = '=ONLI'.
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: <fs_bdc_line>.
  <fs_bdc_line>-program = 'SAPMSSY0'.
  <fs_bdc_line>-dynpro = '0120'.
  <fs_bdc_line>-dynbegin = 'X'.
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: <fs_bdc_line>.
  <fs_bdc_line>-fnam = 'BDC_OKCODE'.
  <fs_bdc_line>-fval = '=&ALL'.
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: <fs_bdc_line>.
  <fs_bdc_line>-program = 'SAPMSSY0'.
  <fs_bdc_line>-dynpro = '0120'.
  <fs_bdc_line>-dynbegin = 'X'.
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: <fs_bdc_line>.
  <fs_bdc_line>-fnam = 'BDC_OKCODE'.
  <fs_bdc_line>-fval = '=&ETA'.
  APPEND <fs_bdc_line> TO bdc_tab.

  CLEAR: lv_tmstp, lv_timestamp.
  GET TIME STAMP FIELD lv_tmstp.
  lv_timestamp = lv_tmstp.
  REPLACE ALL OCCURENCES OF '.' IN lv_timestamp WITH ''.
  CONDENSE lv_timestamp NO-GAPS.

  EXPORT lv_timestamp TO MEMORY ID sy-repid.

  CALL TRANSACTION 'ZZTRJ_3RF_ASD_SBIS' USING bdc_tab MODE lv_mode MESSAGES INTO message_tab.

  CONCATENATE 'ZSBIS_J_3RF_ASD_DOCUM_' lv_timestamp INTO lv_docum_id.
  CONCATENATE 'ZSBIS_J_3RF_ASD_DETAIL_' lv_timestamp INTO lv_detail_id.

  IMPORT t_docum TO lt_docum FROM MEMORY ID lv_docum_id.
  IMPORT gt_detail TO lt_detail FROM MEMORY ID lv_detail_id.

  IF lt_docum IS INITIAL AND lt_detail IS INITIAL.
    return_code = 0.
    MESSAGE 'Актов сверки для выбранного дебитора не найдено!' TYPE 'I' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  ASSIGN ls_detail TO <fs_detail>.
  ASSIGN gs_items2 TO <fs_items>.

  LOOP AT lt_docum INTO ls_docum.
    CASE ls_docum-bstat.
      WHEN '3W'.
        <fs_items>-link_name = 'Взаимозачеты'.
      WHEN '1I'.
        <fs_items>-link_name = 'Счета-фактуры полученные'.
      WHEN '1O'.
        <fs_items>-link_name = 'Счета-фактуры выданные'.
      WHEN '2P'.
        <fs_items>-link_name = 'Платежи от дебитора'.
      WHEN '1A'.
        <fs_items>-link_name = 'Снижение задолж-ти дебитора'.
      WHEN '5K'.
        <fs_items>-link_name = 'КурсРазницы, ПерерасчАвансов'.
      WHEN '6*'.
        <fs_items>-link_name = 'Прочие'.
      WHEN '2R'.
        <fs_items>-link_name = 'Платежи дебитору'.
      WHEN '1Q'.
        <fs_items>-link_name = 'Кредитовое авизо'.
      WHEN '2V'.
        <fs_items>-link_name = 'Платежи кредитору'.
      WHEN '2C'.
        <fs_items>-link_name = 'Платежи от кредитора'.
      WHEN '3X'.
        <fs_items>-link_name = 'Переуступка права требования'.
      WHEN '1Z'.
        CONCATENATE 'Сторно' 'счетов-фактур' INTO <fs_items>-link_name SEPARATED BY space.
      WHEN '2Z'.
        CONCATENATE 'Сторно' 'платежей' INTO <fs_items>-link_name SEPARATED BY space.
      WHEN '3Z'.
        CONCATENATE 'Сторно' 'взаимозачетов' INTO <fs_items>-link_name SEPARATED BY space.
      WHEN '4Z'.
        CONCATENATE 'Сторно' 'векселей' INTO <fs_items>-link_name SEPARATED BY space.
      WHEN '5Z'.
        CONCATENATE 'Сторно' 'курсовых разниц, повт. подсчет' INTO <fs_items>-link_name SEPARATED BY space.
      WHEN '3Y'.
        CONCATENATE 'Сторно' 'переуступки права требования' INTO <fs_items>-link_name SEPARATED BY space.
      WHEN OTHERS.
        DELETE lt_docum.
        CONTINUE.
    ENDCASE.

    <fs_items>-line_type = 'СтрТабл'.
    <fs_items>-number = ls_docum-xblnr.
    <fs_items>-name  = ls_docum-xblnr.
    <fs_items>-text  = ls_docum-bktxt.
    <fs_items>-section = 'Получатель'.
    <fs_items>-date = ls_docum-budat.
    <fs_items>-debet = ls_docum-wrbtr.
    <fs_items>-link_number = ls_docum-bstat.
    <fs_items>-link_date = ls_docum-budat.
    <fs_items>-link_type = ls_docum-bstat.
    APPEND <fs_items> TO gt_items2.
  ENDLOOP.

  <fs_items>-line_type = 'ИтогТабл'.
  <fs_items>-section = 'Получатель'.
  <fs_items>-type = 'Сальдо начальное'.
  READ TABLE lt_detail INDEX 1 ASSIGNING <fs_detail>.
  <fs_items>-date  = lv_first_date.
  <fs_items>-debet = <fs_detail>-insal.

  APPEND <fs_items> TO gt_items2.
  CLEAR <fs_items>.

  DATA: lv_lines TYPE i.
  CLEAR: lv_lines.
  DESCRIBE TABLE lt_detail LINES lv_lines.
  <fs_items>-line_type = 'ИтогТабл'.
  <fs_items>-section = 'Получатель'.
  <fs_items>-type = 'Сальдо конечное'.
  READ TABLE lt_detail INDEX lv_lines ASSIGNING <fs_detail>.
  <fs_items>-date  = lv_last_date.
  <fs_items>-debet = <fs_detail>-ousal.

  APPEND <fs_items> TO gt_items2.
  CLEAR <fs_items>.

  <fs_items>-line_type = 'ИтогТабл'.
  <fs_items>-section = 'Получатель'.
  <fs_items>-type = 'Обороты'.
  LOOP AT lt_detail ASSIGNING <fs_detail>.
    <fs_items>-kredit =  <fs_items>-kredit + <fs_detail>-kredt.
    <fs_items>-debet = <fs_items>-debet + <fs_detail>-debet.
    <fs_items>-link_debet = <fs_items>-link_debet + <fs_detail>-debet.
    <fs_items>-link_kredit = <fs_items>-link_kredit + <fs_detail>-kredt.
  ENDLOOP.

  APPEND <fs_items> TO gt_items2.
  CLEAR <fs_items>.

***************************************************************
**                 TENSOR SBIS EDO                            *
***************************************************************
  TRY.
      DATA: cx_root      TYPE REF TO cx_root,
            lv_not_print TYPE c VALUE '',
            cl_mapping2  TYPE REF TO /sbis/cl_mapping.

      CREATE OBJECT cl_mapping2.

      CALL METHOD cl_mapping2->calc_doc
        EXPORTING
          iv_ini_name  = ls_api2_attachment-ini_name
        IMPORTING
          ev_not_print = lv_not_print.

      return_code = 0.

    CATCH cx_root INTO cx_root.
      CLEAR gt_items2.
      return_code = 1.
      EXIT.
  ENDTRY.
***************************************************************
**                 TENSOR SBIS EDO                            *
***************************************************************
ENDFORM.

На что следует обратить внимание:

  1. Структуры типов данных ty_doc, ty_detail, ty_items должны совпадать в программе вызова и программе формирования актов сверки.
  2. Метки памяти должны совпадать в программе вызова и программе формирования актов сверки.
  3. BDC должны содержать правильное имя вызываемой программы формирования актов и транзакции.
  4. Имя метки памяти ограничено 60 символами.
  5. В качестве номера акта сверки используется строка полученная конкатенацией даты начала построения списка, номером кредитора\дебитора, даты конца построения списка. Можно использовать отдельную нумерация, для этого требуется создать в транзакции SNUM свой объект нумерации и использовать в программе вызова для получения свободного номера стандартный ФМ NUMBER_GET_NEXT, полученный номер следует присвоить переменной lv_number.