СБИС Сапёр - Вызов из программ печати
Содержание
Общая концепция
Алгоритм формирования электронного документа следующий:
- программа печати рассчитывает данные необходимые для печати.
- перед вызовом формуляра управление передается в SBIS SAPPER. SAPPER проверяет кто инициатор вызова программы печати.
- Если это не SAPPER, то он возвращает управление программе печати (все как обычно).
- Если это SAPPER, то он по настройкам маппинга из таблицы /SBIS/SETTINGS получает данные из подготовленных программой печати. На основе этих данных формирует 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 get_data.
PERFORM print_form.
ENDFORM.
Поэтому до вызова печати (PRINT_FORM) необходимо вставить код:
* TENSOR SBIS EDO
TRY.
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
is_nast = nast
IMPORTING
ev_not_print = lv_not_print.
IF lv_not_print = 'X'.
EXIT.
ENDIF.
DATA cx_root TYPE REF TO cx_root.
CATCH cx_root INTO cx_root.
* your code...
ENDTRY.
Т.о. в зависимости от флага lv_not_print мы либо печатаем, либо выходим из программы с правильным кодом возврата.
Вызов из подпрограммы или BADI
Особенности вызова из подпрограмм заключается в том, что дополнительно необходимо прервать несколько подпрограмм. Для этого признак делается глобальным и проверяется после выхода из подпрограмм непосредственно перед печатью.
Пример кода:
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.
CATCH cx_root INTO cx_root.
* your code...
ENDTRY.
ENDFORM.
Вызов из формуляра SMARTFORM
Осуществляется в особенных случаях, когда в системе нет отдельной программы печати (например, в отраслевых решениях), или когда значительная часть логики перенесена в формуляр. Особенности вызова из формуляров - в необходимости прервать работу формуляра и корректно завершить основную программу после выхода из формуляра. Вставить вызов кода необходимо в элемент смартформы "строки программы", где есть доступ к подготовленным данным печати. Например, в основной цикл по позициям или инициализацию:
Пример кода:
* 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_ISU_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 cx_root INTO cx_root.
ENDTRY.
Вызов из формуляра PDF
Осуществляется в особенных случаях, когда в системе нет отдельной программы печати (например, в отраслевых решениях), или когда значительная часть логики перенесена в формуляр. Особенности вызова из формуляров - в необходимости прервать работу формуляра и корректно завершить основную программу после выхода из формуляра.