SAP 전표 출력 — 회계전표를 결재 양식 그대로 뽑아내기
전표 한 건을 결재로 올리려면 종이가 필요합니다. 헤더와 라인, 결재란, 원천세와 지급계좌까지 한 장에 담아 미리 보고 그대로 인쇄하는 화면입니다.
전표를 전기하는 일과 그 전표를 결재로 올리는 일은 다릅니다. 전기는 시스템 안에서 끝나지만, 결재는 대개 종이 한 장에서 시작합니다. 담당이 내용을 확인하고, 검토가 계정과 금액을 보고, 승인이 서명합니다.
그 한 장에는 전표번호와 금액만 있어서는 안 됩니다. 이 금액이 누구에 대한 것인지가 라인마다 보여야 하고, 원천세가 걸린 전표라면 세액 근거가, 지급 전표라면 어느 계좌로 나가는지가 함께 있어야 합니다. SAP 표준 전표 데이터 구조를 그대로 이어받아 이 양식을 화면에서 미리 보고 그대로 인쇄하도록 OpenUI5 화면으로 확장한 것이 ZLFIA0060입니다. 실제 구동 화면 5종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 전표 원천 — 헤더(
BKPF)와 라인(FAGLFLEXA) 구조를 그대로 사용 - 지정 대상 마스터 — 거래처(
LFA1) · 고객(KNA1) · 자산(ANLA) · 오더(AUFK) · WBS(PRPS) - 부가 정보 — 원천세(
WITH_ITEM) · 하우스뱅크(T012K·T012T) · 환산율(TCURF) - 텍스트 — 전표유형(
T003T) · 사업영역(TGSBT) · 사용자(USR01) · 회사코드(T001) - 양식 — 운영에서 스마트폼이 그리는 레이아웃을 같은 블록 구성으로 재현
| 항목 | 내용 |
|---|---|
| 업무 영역 | 재무회계(FI) · 일반회계 · 전표 결재 출력 |
| Namespace | zui5.docprint |
| 셸 구조 | 조회조건 영역(우측 조회) + 전표 목록 + 라인 목록, 결재 양식 미리보기 Dialog |
| 화면 수 | 조회 화면 1개 + 결재 양식 미리보기 |
| 기준 사양 | 620-3 프로그램 사양서 (전표 출력) |
| 상세 추출 | ZFIA_GET_DOCUMENT_INFO |
| 연계 | 나의전표 관리에서 선택 전표를 전달받음 |
| 성격 | 조회·출력형 — 전표 생성과 전기는 표준 트랜잭션이 담당 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 5종 둘러보기
회사코드·전표번호·회계연도를 넣고 조회하면 대상 전표가 목록으로 뜹니다 → 전표를 골라 라인과 원천세·지급계좌를 확인하고 → 결재 양식 미리보기로 인쇄될 모습을 그대로 본 뒤 출력합니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 회사코드 · 전표번호 · 회계연도를 넣습니다. 세 값은 필수이며, 비어 있으면 조회 전에 입력필드에 오류 상태로 표시됩니다. 회계연도 기본값은 시스템 연도입니다.
- 작성자와 통화는 보조 조건입니다. 특정 담당자가 만든 전표만 추릴 때 씁니다.
- 조회조건 입력필드에서 Enter 를 눌러도 바로 조회됩니다. 조회·초기화 버튼은 조회조건 영역 오른쪽 끝에 있습니다.
- 조건에 맞는 전표가 없으면 회사코드·전표번호·회계연도를 함께 보여 주며 알립니다.
- 목록에서 전표를 고르면 아래에 라인이 펼쳐집니다. 차대·계정·지정 대상·금액·코스트센터·적요를 확인합니다.
- 결재 양식 미리보기로 인쇄될 모습을 그대로 확인합니다. 결재란·헤더·라인·부가 정보가 한 장에 들어갑니다.
- 여러 전표를 고르면 전표마다 페이지가 나뉩니다. 인쇄는 새 창에서 A4 여백 12mm 로 실행됩니다.
- 목록은 CSV 다운로드로 내려받습니다. UTF-8 BOM 이 붙어 엑셀에서 한글이 깨지지 않습니다.
지정 대상 해석 규칙
결재자가 라인을 보고 판단하려면 계정과 금액만으로는 부족합니다. 이 금액이 어느 거래처, 어느 자산, 어느 오더에 붙은 것인지가 같은 줄에 있어야 합니다. 그래서 라인마다 아래 순서로 대상을 찾아 구분·코드·명칭을 한 칸에 담습니다.
| 구분 | 원천 | 표시 예 |
|---|---|---|
| 거래처 | LFA1 | 거래처 0000200027 가나상사 |
| 고객 | KNA1 | 고객 0000100014 한빛유통 |
| 자산 | ANLA | 자산 000000012000-0000 생산설비 |
| 오더 | AUFK | 오더 700001 라인 개선 |
| WBS | PRPS | WBS P-2026-01 신공장 |
부가 정보를 조건부로 그리는 이유
원천세는 매입·지급 전표에만, 지급계좌는 지급·입금 전표에만 붙습니다. 관계없는 전표에 빈 블록이 남으면 결재자가 "왜 비어 있지" 하고 한 번 더 확인하게 됩니다. 그래서 해당 정보가 없는 전표에서는 블록 자체를 그리지 않고, 양식 높이도 그만큼 줄입니다.
결재 양식 4블록 구성
운영에서 스마트폼이 그리는 레이아웃을 같은 순서의 네 블록으로 재현했습니다. 위에서 아래로 읽으면 결재 흐름 그대로입니다.
| 블록 | 내용 |
|---|---|
| 제목 · 결재란 | 회사명과 함께 담당 · 검토 · 승인 3단 결재란(서명 공간 포함) |
| 헤더 | 전표번호/회계연도 · 전표유형 · 사업영역 · 전기일자 · 증빙일자 · 작성자 · 참조번호 · 헤더텍스트 |
| 라인 | 항목 · 계정 · 지정 대상 · 코스트센터 · 차변 · 대변 · 적요, 마지막에 차대 합계 |
| 부가 정보 | 원천세(과세표준 · 세율 · 세액), 지급계좌(하우스뱅크 · 계좌번호) — 해당 전표에만 |
여러 전표를 선택하면 전표마다 page-break-after 로 페이지를 나눠 한 번에 인쇄합니다.
운영에서는 스마트폼이 양식을 그리고, 이 화면은 같은 레이아웃을 브라우저 인쇄용 HTML 로 재현한 것입니다.
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
| Company code | 필수 | 대상 회사코드 |
| SAP NO. | 필수 | 전표번호. 실행 시 값 점검 |
| Fiscal Year | 필수 | 회계연도. 기본값은 시스템 연도 |
| Create By | 선택 | 전표 작성자 |
| Currency | 선택 | 회사코드 통화 |
결과 컬럼
전표 목록
| 컬럼 | 의미 · 표시 |
|---|---|
| 전표번호 · 회계연도 | 출력 대상 키 |
| 전표유형 | 코드와 텍스트를 함께 표시 |
| 전기일자 · 증빙일자 | YYYY.MM.DD 형식 |
| 사업영역 | 코드와 명칭 |
| 금액 | 우측정렬, 천단위 콤마 |
| 라인수 | 전표에 달린 라인 건수 |
| 작성자 · 헤더텍스트 | 결재 양식 헤더에 그대로 실림 |
| 원천세 · 지급계좌 | 보유 여부를 표시해 양식에 어떤 블록이 붙을지 미리 알림 |
전표 라인
| 컬럼 | 의미 · 표시 |
|---|---|
| 항목 · 차대 | 라인 번호와 차변/대변 구분 |
| 계정 | 계정코드와 명칭 |
| 지정 대상 | 구분 · 코드 · 명칭을 한 칸에 결합 |
| 코스트센터 | 원가 귀속처 |
| 차변 · 대변 금액 | 우측정렬, 마지막 행에 차대 합계 |
| 적요 | 라인 적요 |
SAP 표준 기능 매핑
이 화면은 전표 생성이나 전기를 대체하지 않습니다. 전표는 표준 트랜잭션이 만들고, 운영의 양식 출력은 스마트폼이 담당합니다. 이 화면은 그 데이터를 결재 관점으로 모아 미리보기와 다건 인쇄를 더해 확장하는 구성입니다.
| 테이블 · 오브젝트 | 역할 |
|---|---|
BKPF | 전표 헤더 — 전표유형 · 전기일 · 증빙일 · 참조번호 · 헤더텍스트 · 작성자 |
FAGLFLEXA | 전표 라인 — 계정 · 차대 · 금액 · 코스트센터 · 적요 |
LFA1 · KNA1 · ANLA · AUFK · PRPS | 지정 대상 마스터 |
WITH_ITEM | 원천세 — 과세표준 · 세율 · 세액 |
T012K · T012T | 하우스뱅크와 계좌 텍스트 |
TCURF | 환산율 — 원화환산 검증의 근거 |
T003T · TGSBT · USR01 · T001 | 전표유형 · 사업영역 · 사용자 · 회사코드 텍스트 |
ZFIA_GET_DOCUMENT_INFO | 전표 상세 추출 인터페이스 |
도입 시 확인이 필요한 부분
결재란 단계와 서명 문구, 회사명 표기는 회사 양식 규정에 따라 달라집니다. 또 지정 대상을 찾는 순서(거래처 → 고객 → 자산 → 오더 → WBS)는 라인에 여러 대상이 동시에 물릴 때 무엇을 먼저 보일지의 문제라, 실제 도입 때는 업무 기준에 맞춰 순서를 정합니다. 원천세율도 설정값을 따르므로 고정값으로 두지 않습니다.
참고 CDS 뷰
운영 서비스로 연결할 때는 헤더와 라인에 지정 대상 명칭을 붙인 뷰로 서빙하는 구성을 제안합니다.
@AbapCatalog.sqlViewName: 'ZCDOCPRINT'
@EndUserText.label: '전표 출력용 라인 (Z)'
define view Z_C_DOCUMENT_PRINT
as select from bkpf as Header
inner join faglflexa as Line on Header.bukrs = Line.rbukrs
and Header.belnr = Line.docnr
and Header.gjahr = Line.ryear
left outer join lfa1 as Vendor on Line.lifnr = Vendor.lifnr
left outer join kna1 as Customer on Line.kunnr = Customer.kunnr
left outer join aufk as Order on Line.aufnr = Order.aufnr
left outer join t003t as DocTypeText on Header.blart = DocTypeText.blart
and DocTypeText.spras = 'K'
{
key Header.bukrs,
key Header.belnr,
key Header.gjahr,
key Line.docln,
Header.blart,
DocTypeText.ltext as BlartTx,
Header.budat,
Header.bldat,
Header.usnam,
Header.bktxt,
Line.racct,
Line.drcrk,
Line.hsl,
Line.rcntr,
Line.sgtxt,
// 지정 대상 — 값이 있는 것을 순서대로 골라 구분·코드·명칭으로 결합
case when Line.lifnr <> '' then 'VENDOR'
when Line.kunnr <> '' then 'CUSTOMER'
when Line.aufnr <> '' then 'ORDER'
else '' end as PartnerType,
coalesce( Vendor.name1, Customer.name1, Order.ktext ) as PartnerName
// 원천세(WITH_ITEM)·하우스뱅크(T012K)는 연장 뷰에서 결합
}
매핑 이해를 돕기 위한 참고용 설계입니다. 실제 도입 시에는 운영 환경의 원장 구조(신전기 여부)와 지정 대상 사용 범위에 맞춰 조정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 영역 · 전표 목록 · 라인 목록 |
| 조회조건 | sap.m.Input · sap.m.Select — 우측 끝에 조회 버튼, 필수값 오류 상태 표시 |
| 전표 목록 | sap.m.Table — 선택 시 라인 목록 갱신 |
| 결재 양식 | sap.m.Dialog — 인쇄용 HTML 을 그대로 렌더링 |
| 인쇄 | 새 창 열기 + A4 여백 12mm, 전표별 page-break-after |
| 포맷 | 금액 · 일자 · 차대 · 지정 대상 · 원천세 · 계좌 포맷터 |
미리보기와 인쇄를 같은 HTML 로 만든 이유
미리보기와 실제 출력이 다른 코드로 그려지면, 화면에서는 멀쩡한데 종이에서 표가 잘리는 일이 생깁니다. 같은 HTML 을 Dialog 에 넣고 인쇄 창에도 그대로 넘기면 "보이는 대로 나오는" 상태가 유지됩니다. 페이지 나눔도 CSS 한 줄로 끝나므로 전표 건수가 늘어도 로직이 복잡해지지 않습니다.
파일 구성
| 경로 | 역할 |
|---|---|
index.html | OpenUI5 부트스트랩 — sap_horizon · lodash · moment |
Component.js | 조회조건 모델 · 결과 모델 초기화 |
manifest.json | 앱 디스크립터 — 앱 ID(zui5.docprint) · ko 로케일 |
view/Main.view.xml | 조회화면 + 전표 목록 + 라인 + 결재 양식 Dialog |
controller/Main.controller.js | 필수값 점검 · 조회 · 양식 렌더링 · 인쇄 · CSV |
model/ModelMock.js | localdata JSON 읽기(Promise) + 양식 데이터 구성 |
model/formatter.js | 금액 · 일자 · 차대 · 지정 대상 · 원천세 · 계좌 포맷 |
i18n/i18n_ko.properties | ko 로케일 리소스 |
localdata/docprint.json | 전표 헤더 · 라인 검증용 데이터 |
운영 전환 시에는 ModelMock 내부만 실제 서비스 호출로 바꾸면 화면과 양식 로직은 그대로 씁니다.
검증 결과
화면 구성에 쓴 데이터는 전표 46건 · 라인 125건이며, 원천세 4건 · 지급계좌 16건, 합계 268,177,720원입니다.
| 검증 항목 | 결과 |
|---|---|
| 전표별 차변 합계 = 대변 합계 · 헤더 금액 = 차변 라인 합계 | 통과 |
| 원화환산 = 거래통화금액 × 환율 (헤더 · 라인) | 통과 |
| 지정 대상 코드가 있으면 구분 · 명칭도 존재 | 통과 |
| 원천세는 매입/지급 전표에만 · 세액 = 과세표준 × 3.3% | 통과 |
| 하우스뱅크는 지급/입금 전표에만 · 계좌번호 보유 | 통과 |
| 결재란 3단계 구성 · 라인 통화/사업영역이 헤더와 일치 | 통과 |
| 전표유형 · 작성자 마스터 일치 · 전표+항목 중복 없음 | 통과 |
| 화면 렌더링 — 실브라우저에서 조회 → 라인 → 양식 미리보기 실동작 후 캡처 | 5/5 |
거래처 · 금액 · 결재자는 모두 검증용 데이터입니다.
자주 묻는 질문
지정 대상은 무엇을 보고 채우나요?
전표 라인에 물린 대상을 순서대로 찾습니다. 거래처(LFA1) · 고객(KNA1) · 자산(ANLA) · 오더(AUFK) · WBS(PRPS) 중 값이 있는 것을 골라 구분과 코드, 명칭을 한 칸에 담습니다. 결재자가 라인만 보고도 무엇에 대한 금액인지 알 수 있어야 하기 때문에, 코드만 찍지 않고 '거래처 0000200027 가나상사' 형태로 붙여 씁니다.
원천세와 지급계좌는 왜 전표마다 다르게 나오나요?
해당 정보가 있는 전표에만 붙기 때문입니다. 원천세는 매입·지급 전표에서 과세표준과 세율, 세액을 함께 싣고, 지급계좌는 지급·입금 전표에서 하우스뱅크와 계좌번호를 싣습니다. 관계없는 전표에 빈 블록이 남으면 양식이 지저분해지므로 블록 자체를 그리지 않습니다.
여러 전표를 한 번에 인쇄할 수 있나요?
가능합니다. 목록에서 여러 건을 고르면 전표마다 페이지를 나눠 한 번에 출력합니다. 인쇄는 새 창을 열어 A4 여백 12mm 로 브라우저 인쇄를 실행하므로, 별도 출력 프로그램 없이 화면에서 끝납니다.
SAP 표준 기능과 어떻게 이어지나요?
전표 자체는 표준 전기 트랜잭션이 만들고 BKPF·FAGLFLEXA에 그대로 남습니다. 운영에서 양식을 그리는 것도 표준 스마트폼입니다. 이 화면은 그 데이터를 같은 레이아웃으로 브라우저 인쇄용 HTML에 재현해, 결재 올리기 전에 화면에서 미리 보고 여러 건을 묶어 출력할 수 있게 확장한 것입니다.