SAP

S/4HANA 전환 90%가 Open Items 누락 #shorts #SAP #Finance

▶ YouTube에서 보기

S/4HANA 전환에서 Open Items가 프로젝트 성패를 가르는 이유

SAP ECC에서 S/4HANA로 넘어가는 Finance 전환 프로젝트에서 가장 많은 프로젝트가 무너지는 지점은 놀랍게도 마스터 데이터도, 조직구조도 아닌 Open Items(미결 항목)입니다. Open Items는 아직 청산(clearing)되지 않은 채권·채무·G/L 항목을 의미하며, 이 데이터가 한 건이라도 잔액과 어긋나면 재무제표 자체가 흔들립니다. 특히 S/4HANA는 Universal Journal(ACDOCA) 기반의 단일 원장 구조로 재구성되기 때문에, ECC 시절의 BSID/BSIK/BSIS 테이블 로직이 그대로 통용되지 않습니다. 이 글에서는 SAP S/4HANA 2023 On-Premise 및 Private Cloud 기준으로 Open Items를 안전하게 이관·검증·안정화하는 3단계 절차를 실전 관점으로 다룹니다.

  • Open Items의 유형별 위험도와 마이그레이션 스코프 정의 방법
  • SLT / Migration Cockpit / LSMW 기반 이관 시나리오 비교
  • Cutover 시점의 잔액 검증(Balance Reconciliation) 실전 기법
  • Go-Live 이후 FI 프로세스 검증 체크리스트

이 글을 소화하기 위해 필요한 배경 지식

본 콘텐츠는 SAP FI 컨설턴트 또는 마이그레이션 리드 수준의 실무자를 대상으로 합니다. ECC 시절의 문서 흐름(BKPF/BSEG), Open Item 관리 계정(Open Item Managed G/L)의 개념, F-32/F-44 등 Clearing 트랜잭션에 대한 이해가 필요합니다. 또한 S/4HANA의 ACDOCA 단일 원장 구조와 New Asset Accounting, New GL 마이그레이션의 차이도 알고 있어야 논의 흐름을 따라올 수 있습니다.

환경 전제와 준비 도구

이 글의 모든 예제는 다음 환경을 전제로 합니다. 실제 프로젝트에서는 릴리스에 따라 트랜잭션 코드와 Fiori 앱 ID가 미묘하게 달라질 수 있으므로 반드시 SAP Note와 Simplification Item Catalog를 교차 확인하는 것이 권장됩니다.

  • Target: SAP S/4HANA 2023 FPS01 (On-Premise) 또는 Private Cloud Edition
  • Source: SAP ERP 6.0 EHP7 이상 (Classic GL 또는 New GL)
  • Migration Tool: SAP S/4HANA Migration Cockpit(LTMC/LTMOM), SLT, Legacy System Migration Workbench(LSMW)
  • Reconciliation: FAGLB03, FBL1N/FBL3N/FBL5N, ACDOCA 조회 (transaction: SE16H, view: FAGLFLEXA)
  • 권한: FI 마이그레이션 컨설턴트 롤(SAP_BR_CONFIG_EXPERT_BUS_PROC_CONF) 및 S_TABU_DIS(FC31)
  • 사전 SAP Note: 2436748(FI Migration), 2270333(Universal Journal), 2333236(Open Items)

Migration Cockpit은 SAP가 최근 릴리스에서 가장 강력하게 지원하는 도구이지만, 대량 Open Items(수백만 건 이상) 이관 시에는 여전히 커스텀 BAPI(BAPI_ACC_DOCUMENT_POST) 래핑이 필요한 경우가 많습니다. LSMW는 공식적으로 유지보수 모드지만, 브라운필드 프로젝트에서는 여전히 실무 현장에서 사용됩니다.

Open Items의 정체와 S/4HANA에서 달라진 동작 원리

Open Item을 단순히 "미결 전표"라고만 이해하면 실패합니다. 정확히는 "청산 로직으로 상쇄되어야 할 잠재 잔액을 가진 개별 라인 아이템"입니다. ECC에서는 이를 세 개의 인덱스 테이블로 관리했습니다.

  • BSID — 고객(AR) Open Items
  • BSIK — 벤더(AP) Open Items
  • BSIS — G/L Open Item Managed 계정

S/4HANA로 오면 이 세 테이블은 ACDOCA(Universal Journal)와 BSEG_ADD의 조합으로 대체된 Compatibility View가 됩니다. 즉, 물리 테이블이 아니라 뷰(View)이며, 실제 데이터는 ACDOCA에 있고 청산 상태는 AUGBL/AUGDT 필드로 판별합니다. 마이그레이션이 실패하는 대표적인 이유는 이 구조 변화를 무시하고 ECC 방식대로 데이터를 밀어넣기 때문입니다.

비유하자면 ECC의 원장은 여러 개의 서로 다른 색깔 서류철(GL, AR, AP, Asset, CO)에 같은 거래를 여러 번 복사해두는 방식이었다면, S/4HANA는 하나의 마스터 노트(ACDOCA)에 모든 관점을 한 줄로 기록합니다. 그래서 Open Items를 이관할 때 각 관점(회사코드, 프로핏센터, 세그먼트, 펀드, 감가상각영역)의 필드가 하나라도 비어 있으면 즉시 Universal Journal 무결성 검증에서 튕겨나갑니다.

실무 팁: SAP는 SAP Note 2270333에서 "Open Items는 반드시 Migration Date 시점 기준 잔액과 100% 일치해야 한다"고 명시합니다. 0.01원 차이도 허용되지 않으며, 이 차이는 대개 반올림 규칙이나 세컨더리 통화(Global Currency) 환산에서 발생합니다.

1단계 — 준비와 클렌징: 이관 대상 확정

첫 번째 단계는 이관 스코프를 확정하는 클렌징(cleansing) 작업입니다. 이 단계에서 실무자들이 가장 자주 저지르는 실수는 "일단 다 가져가자"는 접근입니다. 오래된 3~5년치 미결 항목을 그대로 옮기면 S/4HANA에서 영구히 유지보수 부담이 됩니다.

REPORT z_fi_open_item_scoping.

TYPES: BEGIN OF ty_open_scope,
         bukrs      TYPE bukrs,
         hkont      TYPE hkont,
         kunnr      TYPE kunnr,
         belnr      TYPE belnr_d,
         gjahr      TYPE gjahr,
         wrbtr      TYPE wrbtr,
         waers      TYPE waers,
         bldat      TYPE bldat,
         age_days   TYPE i,
         scope_flag TYPE c LENGTH 1,   " M=Migrate, W=Write-off, R=Review
       END OF ty_open_scope.

DATA: lt_scope TYPE STANDARD TABLE OF ty_open_scope,
      ls_scope TYPE ty_open_scope.

SELECT bukrs, hkont, kunnr, belnr, gjahr, wrbtr, waers, bldat
  FROM bsid
  WHERE augdt = '00000000'
  INTO TABLE @DATA(lt_ar_open).

LOOP AT lt_ar_open INTO DATA(ls_ar).
  ls_scope-bukrs    = ls_ar-bukrs.
  ls_scope-hkont    = ls_ar-hkont.
  ls_scope-kunnr    = ls_ar-kunnr.
  ls_scope-belnr    = ls_ar-belnr.
  ls_scope-gjahr    = ls_ar-gjahr.
  ls_scope-wrbtr    = ls_ar-wrbtr.
  ls_scope-waers    = ls_ar-waers.
  ls_scope-age_days = sy-datum - ls_ar-bldat.

  " 730일(2년) 초과 & 소액(50,000 KRW 이하) → Write-off 후보
  IF ls_scope-age_days > 730 AND ls_scope-wrbtr <= 50000.
    ls_scope-scope_flag = 'W'.
  ELSEIF ls_scope-age_days > 1095.
    ls_scope-scope_flag = 'R'.   " 3년 초과는 재무팀 리뷰
  ELSE.
    ls_scope-scope_flag = 'M'.
  ENDIF.

  APPEND ls_scope TO lt_scope.
ENDLOOP.

cl_demo_output=>display( lt_scope ).

이 리포트를 실행해 세 갈래(Migrate / Write-off / Review)로 분류한 뒤, Write-off 대상은 ECC 상에서 F-32(AR) / F-44(AP)로 청산 처리하고, Review 대상은 재무팀 승인을 받아 정리합니다. 이 과정을 생략하면 Cutover 리허설 때 이관 시간이 2~3배 늘어나는 것을 흔히 봅니다.

2단계 — Migration Cockpit을 활용한 실제 이관

실무 시나리오에서는 SAP S/4HANA Migration Cockpit(LTMC)의 "Open Items - Customer / Vendor / GL Account" 표준 오브젝트를 사용하는 것이 권장됩니다. 다만 대량 데이터나 커스텀 필드가 많은 경우, 아래처럼 BAPI 기반 커스텀 로더를 병행합니다.

FUNCTION z_fi_migrate_open_ar_batch.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IT_OPEN_ITEMS) TYPE zttfi_open_item
*"  EXPORTING
*"     VALUE(ET_LOG) TYPE bapiret2_t
*"----------------------------------------------------------------------

  DATA: ls_header    TYPE bapiache09,
        lt_glaccount TYPE STANDARD TABLE OF bapiacgl09,
        lt_customer  TYPE STANDARD TABLE OF bapiacar09,
        lt_currency  TYPE STANDARD TABLE OF bapiaccr09,
        lt_return    TYPE STANDARD TABLE OF bapiret2,
        lv_docnum    TYPE bapiache09-obj_key.

  LOOP AT it_open_items ASSIGNING FIELD-SYMBOL()
       GROUP BY ( key = -migration_key )
       ASSIGNING FIELD-SYMBOL().

    CLEAR: ls_header, lt_glaccount, lt_customer, lt_currency, lt_return.

    ls_header-username    = sy-uname.
    ls_header-header_txt  = 'S4 Migration - AR Open Items'.
    ls_header-comp_code   = -bukrs.
    ls_header-doc_date    = -bldat.
    ls_header-pstng_date  = p_cutover_date.  " Migration cutover date
    ls_header-doc_type    = 'ZM'.            " 마이그레이션 전용 문서유형
    ls_header-ref_doc_no  = -xblnr.

    LOOP AT GROUP  ASSIGNING FIELD-SYMBOL().
      APPEND VALUE bapiacar09(
        itemno_acc   = -posnr
        customer     = -kunnr
        pmnttrms     = -zterm
        bline_date   = -zfbdt
        alloc_nmbr   = -zuonr   " 청산 매칭을 위한 할당 번호 필수
        item_text    = -sgtxt
      ) TO lt_customer.

      APPEND VALUE bapiaccr09(
        itemno_acc = -posnr
        currency   = -waers
        amt_doccur = -wrbtr
      ) TO lt_currency.
    ENDLOOP.

    CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
      EXPORTING
        documentheader = ls_header
      IMPORTING
        obj_key        = lv_docnum
      TABLES
        accountgl      = lt_glaccount
        accountreceivable = lt_customer
        currencyamount = lt_currency
        return         = lt_return.

    IF line_exists( lt_return[ type = 'E' ] ) OR
       line_exists( lt_return[ type = 'A' ] ).
      ROLLBACK WORK.
      APPEND LINES OF lt_return TO et_log.
      " 실패 건은 별도 재처리 큐로
      INSERT ztfi_mig_error FROM TABLE @( VALUE #(
        FOR ln IN lt_return ( mig_key = -migration_key
                              msg_type = ln-type
                              msg_id   = ln-id
                              msg_num  = ln-number
                              msg_text = ln-message ) ) ).
    ELSE.
      COMMIT WORK AND WAIT.
      APPEND VALUE bapiret2( type = 'S' message = |Doc { lv_docnum } posted| ) TO et_log.
    ENDIF.

  ENDLOOP.

ENDFUNCTION.

핵심 포인트는 ZUONR(할당 번호)에 원본 문서 키를 넣어두는 것입니다. Go-Live 이후 실제 청산 시점에 원본 참조를 추적해야 하기 때문입니다. 또한 문서유형 ZM을 별도로 만들어 마이그레이션 전표를 물리적으로 구분해두면, 감사 대응과 사후 롤백이 훨씬 수월합니다.

3단계 — 프로덕션 잔액 검증과 자동 재조정

이관이 끝났다면 이제 Reconciliation(잔액 검증)이 남습니다. 이 단계가 실제 Go-Live 승인의 최종 관문입니다. 다음은 회사코드·계정별로 ECC 원장과 S/4HANA ACDOCA를 자동 비교하는 검증 스크립트의 뼈대입니다.

CLASS zcl_fi_migration_validator DEFINITION PUBLIC FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    TYPES: BEGIN OF ty_recon,
             bukrs        TYPE bukrs,
             hkont        TYPE hkont,
             src_balance  TYPE dmbtr,
             tgt_balance  TYPE dmbtr,
             diff         TYPE dmbtr,
             status       TYPE string,
           END OF ty_recon.

    METHODS reconcile
      IMPORTING iv_cutover_date TYPE datum
                iv_tolerance    TYPE dmbtr DEFAULT '0.01'
      RETURNING VALUE(rt_result) TYPE STANDARD TABLE OF ty_recon.
ENDCLASS.

CLASS zcl_fi_migration_validator IMPLEMENTATION.
  METHOD reconcile.
    DATA: lt_src TYPE STANDARD TABLE OF ty_recon,
          lt_tgt TYPE STANDARD TABLE OF ty_recon.

    " 1) Source(ECC) 잔액 — 사전 추출된 스냅샷 테이블 사용
    SELECT bukrs, hkont, SUM( dmbtr ) AS src_balance
      FROM ztfi_ecc_snapshot
      WHERE budat <= @iv_cutover_date
      GROUP BY bukrs, hkont
      INTO CORRESPONDING FIELDS OF TABLE @lt_src.

    " 2) Target(S/4HANA) — ACDOCA 직접 조회
    SELECT rbukrs AS bukrs,
           racct  AS hkont,
           SUM( hsl ) AS tgt_balance
      FROM acdoca
      WHERE rldnr  = '0L'
        AND budat <= @iv_cutover_date
        AND rrcty  = '0'
      GROUP BY rbukrs, racct
      INTO CORRESPONDING FIELDS OF TABLE @lt_tgt.

    " 3) 매칭 및 편차 계산
    LOOP AT lt_src INTO DATA(ls_src).
      READ TABLE lt_tgt INTO DATA(ls_tgt)
        WITH KEY bukrs = ls_src-bukrs hkont = ls_src-hkont.

      DATA(ls_r) = VALUE ty_recon(
        bukrs       = ls_src-bukrs
        hkont       = ls_src-hkont
        src_balance = ls_src-src_balance
        tgt_balance = COND #( WHEN sy-subrc = 0 THEN ls_tgt-tgt_balance ELSE 0 )
      ).
      ls_r-diff   = ls_r-src_balance - ls_r-tgt_balance.
      ls_r-status = COND #(
        WHEN abs( ls_r-diff ) <= iv_tolerance THEN 'OK'
        WHEN abs( ls_r-diff ) < 1000          THEN 'MINOR_DIFF'
        ELSE 'CRITICAL' ).
      APPEND ls_r TO rt_result.
    ENDLOOP.

    " 4) Critical 편차는 자동 알림 (Fiori Notification / Email)
    LOOP AT rt_result INTO DATA(ls_check) WHERE status = 'CRITICAL'.
      cl_bcs_convert=>send_migration_alert(
        iv_bukrs = ls_check-bukrs
        iv_hkont = ls_check-hkont
        iv_diff  = ls_check-diff ).
    ENDLOOP.
  ENDMETHOD.
ENDCLASS.

프로덕션 검증에서는 반드시 Local Currency(HSL), Group Currency(KSL), Transaction Currency(WSL) 세 통화 모두를 개별 검증해야 합니다. 하나만 맞고 다른 하나가 틀리면 Universal Journal 재무제표에서 이상 신호가 나타납니다. 또한 검증은 Cutover 시점, D+1, 월말 결산 시점 등 최소 3회 반복 실행이 권장됩니다.

현장에서 반복되는 실패 패턴과 대응

Q1. 이관 후 F-32에서 청산이 안 됩니다. "Document contains no open items" 에러가 뜹니다.
가장 흔한 원인은 마이그레이션 전표를 만들 때 Open Item Management 플래그가 꺼져 있었거나, AUGBL이 임의 값으로 채워져 시스템이 이미 청산된 것으로 인식하는 경우입니다. FBL5N에서 라인의 BSTATAUGBL을 확인하고, 필요 시 SAP Note 2308029의 정정 리포트로 재오픈합니다.

Q2. ACDOCA 잔액은 맞는데 FBL3N 잔액이 다르게 나옵니다.
FBL3N은 여전히 Compatibility View(V_BSIS_LT 등)를 조회합니다. Compatibility View 인덱스가 완전히 재구축되지 않았거나, BSEG_ADD 확장 필드가 비어있는 경우 발생합니다. SE38에서 FAGL_ACTIVATE_OP 및 관련 인덱스 재생성 리포트를 실행해야 합니다.

Q3. 세컨더리 통화 환산 차이가 0.01~0.03원 단위로 누적됩니다.
S/4HANA는 라운딩 규칙이 ECC와 다릅니다. Migration Cockpit의 "Currency Rounding Handling" 설정에서 "Adjust to Source"를 선택하지 않으면 자동 반올림이 적용됩니다. 대안은 잔액 조정용 GL 계정을 하나 열어두고 소액 편차만 자동으로 흡수시키는 것입니다. 다만 이 계정은 감사 대상이므로 문서화가 필수입니다.

이 외에도 자주 겪는 함정으로는 (1) Special GL Indicator(다운페이먼트, 보증금)를 표준 Open Items와 함께 이관하려다 실패, (2) Withholding Tax 정보 누락으로 세무 신고 불일치, (3) 다중 지급 조건(Installment Plan) 문서의 분할 라인 손실 등이 있습니다. 각 케이스마다 별도 스코프 정의와 검증 로직이 필요합니다.

Go-Live 이후의 안정화와 확장 주제

이관과 검증이 끝났다고 프로젝트가 끝난 것은 아닙니다. Go-Live 후 첫 월말 결산까지가 진짜 시험대입니다. 다음 주제를 후속으로 학습하는 것을 권장합니다.

  • Central Finance(CFIN) — 다국적 그룹사에서 Open Items를 실시간으로 통합하는 아키텍처
  • Advanced Payment Management — S/4HANA 2022+ 에서 강화된 지급 매칭 자동화
  • SAP Document and Reporting Compliance — 이관 후 전자세금계산서/e-Invoice 연계 검증
  • Universal Parallel Accounting — 2023 신기능, 병렬 회계원장에서의 Open Items 처리
  • 월말 결산 자동화(Financial Closing Cockpit) 재설계

더 깊이 파고들 수 있는 자료

댓글 0

아직 댓글이 없습니다.