Semrush ghi nhận 'file xml hóa đơn điện tử' khoảng 260 lượt tìm mỗi tháng, 'ký hiệu hóa đơn điện tử' khoảng 210 lượt, 'mẫu số hóa đơn điện tử' khoảng 170 lượt, 'đọc file xml hóa đơn điện tử' khoảng 110 lượt, tất cả có độ khó dưới 10 trên 100 (cơ sở dữ liệu Việt Nam, 25/09/2026). Ít người viết kỹ về phần này, nhưng đây lại là chỗ kế toán và đội kỹ thuật cần hiểu chung khi tích hợp.
Đây là bài cuối của chuỗi về hóa đơn điện tử. Nửa đầu dành cho kế toán (đọc ký hiệu, đọc XML, lưu trữ), nửa sau dành cho người phụ trách phần mềm (tích hợp).
Ký hiệu mẫu số và ký hiệu hóa đơn
Theo hướng dẫn tại Thông tư 78/2021/TT-BTC, mỗi hóa đơn có ký hiệu mẫu số (một chữ số) và ký hiệu hóa đơn (sáu ký tự). Khi viết liền, ta có chuỗi bảy ký tự như 1C25TAA:
- Ký hiệu mẫu số (vị trí 1): loại hóa đơn. 1 là hóa đơn giá trị gia tăng, 2 là hóa đơn bán hàng; các số tiếp theo dành cho hóa đơn bán tài sản công, bán hàng dự trữ quốc gia và các loại khác.
- Vị trí 2: C là hóa đơn có mã của cơ quan thuế, K là không có mã.
- Vị trí 3 và 4: hai số cuối của năm lập hóa đơn.
- Vị trí 5: loại hóa đơn theo hình thức, ví dụ T là hóa đơn doanh nghiệp, tổ chức, hộ kinh doanh đăng ký sử dụng với cơ quan thuế; M là hóa đơn khởi tạo từ máy tính tiền; các chữ khác cho các trường hợp riêng.
- Vị trí 6 và 7: do người bán tự đặt để quản lý nội bộ.
Số hóa đơn là số thứ tự tăng dần trong cùng ký hiệu, tối đa tám chữ số, bắt đầu lại từ 1 mỗi năm. Vì năm nằm trong ký hiệu, mỗi đầu năm doanh nghiệp dùng ký hiệu mới. Phần mềm tích hợp phải lấy năm theo ngày lập hóa đơn, không theo ngày tạo đơn hàng; đơn tạo ngày 31/12 mà giao ngày 02/01 sẽ mang ký hiệu năm mới.
Các văn bản sửa đổi có thể bổ sung giá trị cho từng vị trí. Khi gặp ký hiệu lạ, tra bảng ký hiệu trong văn bản hướng dẫn hiện hành.
Cấu trúc tệp XML hóa đơn điện tử
Định dạng dữ liệu hóa đơn điện tử do cơ quan thuế công bố (tài liệu đặc tả thành phần dữ liệu, ban hành kèm quyết định của cơ quan thuế và được cập nhật theo các lần sửa đổi quy định). Ở mức khái quát, một tệp XML hóa đơn có các khối sau. Tên thẻ dưới đây mang tính minh họa theo cách đặt tên phổ biến; khi lập trình, dùng đúng tài liệu đặc tả hiện hành.
xml<HDon>
<DLHDon Id="...">
<TTChung> <!-- thong tin chung -->
<THDon>...</THDon> <!-- ten hoa don -->
<KHMSHDon>1</KHMSHDon> <!-- ky hieu mau so -->
<KHHDon>C25TAA</KHHDon> <!-- ky hieu hoa don -->
<SHDon>123</SHDon> <!-- so hoa don -->
<NLap>2025-10-01</NLap> <!-- ngay lap -->
<DVTTe>VND</DVTTe> <!-- don vi tien te -->
</TTChung>
<NDHDon> <!-- noi dung hoa don -->
<NBan>...</NBan> <!-- nguoi ban: ten, MST, dia chi -->
<NMua>...</NMua> <!-- nguoi mua -->
<DSHHDVu> <!-- danh sach hang hoa, dich vu -->
<HHDVu>...</HHDVu>
</DSHHDVu>
<TToan>...</TToan> <!-- tong tien, thue, bang chu -->
</NDHDon>
</DLHDon>
<MCCQT>...</MCCQT> <!-- ma cua co quan thue -->
<DSCKS>...</DSCKS> <!-- danh sach chu ky so -->
</HDon>Ví dụ trên được rút gọn, dữ liệu là giả định. Điểm cần hiểu: chữ ký số của người bán ký lên khối dữ liệu hóa đơn; mã của cơ quan thuế được gắn sau khi cấp. Bất kỳ thay đổi nào trong khối dữ liệu, kể cả thêm một khoảng trắng ở chỗ được ký, cũng làm chữ ký không còn hợp lệ.
Cách đọc file XML hóa đơn điện tử
Mở tệp XML bằng trình duyệt hoặc trình soạn thảo văn bản chỉ thấy dữ liệu thô. Để xem dưới dạng hóa đơn và kiểm tra chữ ký, có các cách:
- Dùng công cụ đọc hóa đơn do nhà cung cấp dịch vụ hóa đơn phát hành (thường miễn phí), hoặc tải tệp lên trang tra cứu của nhà cung cấp.
- Nhập tệp vào phần mềm kế toán có chức năng nhận hóa đơn điện tử; phần mềm đọc dữ liệu và tạo chứng từ.
- Với đội kỹ thuật: đọc bằng thư viện XML của ngôn ngữ đang dùng, và xác minh chữ ký bằng thư viện chữ ký XML (XML Signature) với chứng thư trong tệp.
Đừng chỉnh sửa tệp XML rồi lưu đè, kể cả chỉ để 'định dạng cho dễ đọc'. Làm vậy có thể thay đổi nội dung được ký và làm hỏng bản gốc. Nếu cần xem cho dễ, mở bản sao.
Lưu trữ tệp XML: đầu ra và đầu vào
- Lưu tệp XML gốc, không chỉ PDF, cho cả hóa đơn bán ra và mua vào.
- Đặt tên tệp theo quy ước: mã số thuế người bán, ký hiệu, số hóa đơn. Tên cố định giúp phát hiện trùng.
- Lưu kèm dữ liệu tra cứu được (ngày, người mua hoặc người bán, tổng tiền, trạng thái) trong cơ sở dữ liệu hoặc bảng tính để tìm nhanh.
- Sao lưu định kỳ ra nơi khác hệ thống chính; thời hạn lưu trữ theo pháp luật kế toán.
- Khi đổi nhà cung cấp dịch vụ hóa đơn, tải toàn bộ XML cũ về trước khi kết thúc hợp đồng.
Tích hợp xuất hóa đơn vào phần mềm bán hàng, ERP
Phần lớn nhà cung cấp dịch vụ hóa đơn có API cho phép hệ thống của doanh nghiệp gửi dữ liệu hóa đơn, yêu cầu ký (bằng HSM hoặc ký từ xa), nhận số hóa đơn, mã của cơ quan thuế, tệp XML và bản thể hiện. Mỗi nhà cung cấp có tài liệu riêng, nhưng luồng tích hợp tốt đều có chung các điểm sau.
1. Khóa chống trùng theo đơn hàng
Lỗi nguy hiểm nhất là xuất hai hóa đơn cho một đơn: hệ thống gửi yêu cầu, mạng chập chờn, không nhận được phản hồi, hệ thống tưởng lỗi và gửi lại. Cách chống: mỗi yêu cầu mang một khóa duy nhất suy ra từ đơn hàng (ví dụ mã đơn hàng cộng lần xuất). Nếu nhà cung cấp hỗ trợ khóa chống trùng (idempotency key) hoặc cho tra theo mã tham chiếu của bên gửi, luôn dùng.
2. Không thử lại mù quáng
Khi hết thời gian chờ, trước khi gửi lại, gọi API tra trạng thái theo mã tham chiếu. Nếu hóa đơn đã được lập, chỉ cần lấy kết quả về. Chỉ gửi lại khi chắc chắn yêu cầu trước chưa được ghi nhận.
ts// Minh hoa luong xuat hoa don cho mot don hang (gia lap, khong phai API cua nha cung cap cu the)
async function xuatHoaDon(don: DonHang) {
const khoa = `${don.ma}-${don.lanXuat}`; // khoa chong trung
const cu = await db.hoaDon.timTheoKhoa(khoa);
if (cu?.trangThai === "da_cap_ma") return cu; // da xuat roi, khong xuat lai
try {
const kq = await nhaCungCap.phatHanh({ maThamChieu: khoa, ...anhXa(don) });
return await db.hoaDon.luu(khoa, kq); // luu so, ma CQT, XML, trang thai
} catch (loi) {
// het thoi gian cho: tra trang thai truoc khi thu lai
const tt = await nhaCungCap.traTheoMaThamChieu(khoa);
if (tt) return await db.hoaDon.luu(khoa, tt);
await hangCho.dua(khoa, loi); // de ke toan xu ly, khong bo sot am tham
throw loi;
}
}3. Ánh xạ thuế suất và danh mục
Phần mềm bán hàng có danh mục riêng; hóa đơn cần tên hàng, đơn vị tính và thuế suất theo cách ghi hợp lệ. Nên có bảng ánh xạ thuế suất theo mặt hàng với ngày hiệu lực, vì thuế suất có thể thay đổi theo chính sách từng thời kỳ. Tránh gõ cố định thuế suất trong mã nguồn.
4. Làm tròn và tổng tiền
Tổng tiền trên đơn hàng và trên hóa đơn phải khớp tới từng đồng. Lệch thường do làm tròn tiền thuế theo từng dòng hay theo tổng, chiết khấu phân bổ vào dòng hay để dòng riêng, giá đã gồm thuế hay chưa. Thống nhất quy tắc với kế toán, viết kiểm thử với các đơn có chiết khấu và nhiều mức thuế suất.
5. Thời điểm tạo yêu cầu xuất
Gắn yêu cầu xuất hóa đơn với sự kiện đúng nghiệp vụ: giao hàng thành công, hoàn thành dịch vụ, hoặc thu tiền trước theo quy định. Với bán hàng trực tuyến, trạng thái 'đã đặt' chưa phải thời điểm lập hóa đơn. Nếu nhà vận chuyển có webhook báo giao thành công, đó là tín hiệu tốt để kích hoạt xuất hóa đơn.
6. Lưu trạng thái và tệp gốc ở phía mình
Mỗi đơn hàng nên biết hóa đơn của nó: ký hiệu, số, mã của cơ quan thuế, trạng thái (đã cấp mã, bị từ chối, bị điều chỉnh, bị thay thế) và tệp XML. Như vậy báo cáo doanh thu không phụ thuộc vào việc đăng nhập cổng nhà cung cấp, và khi đổi nhà cung cấp dữ liệu cũ vẫn còn.
7. Luồng sai sót trong phần mềm
Trả hàng, đổi hàng, sửa đơn sau khi đã xuất hóa đơn phải sinh ra hóa đơn điều chỉnh hoặc thay thế liên kết với hóa đơn gốc, không phải xóa đơn và xuất lại. Thiết kế luồng này cùng kế toán ngay từ đầu, theo quy định hiện hành về xử lý sai sót.
Câu hỏi nên hỏi nhà cung cấp hóa đơn trước khi tích hợp
- Có API công khai và tài liệu đầy đủ không, có môi trường thử nghiệm không.
- Có hỗ trợ mã tham chiếu hoặc khóa chống trùng, và API tra trạng thái theo mã đó không.
- Ký bằng cách nào khi gọi API (HSM của nhà cung cấp, ký từ xa, hay phải ký ở phía doanh nghiệp).
- Có gửi thông báo (webhook) khi hóa đơn được cấp mã hoặc bị từ chối không.
- API có chức năng lập hóa đơn điều chỉnh, thay thế, gửi thông báo sai sót không.
- Giới hạn số lượng yêu cầu, thời gian phản hồi thường gặp, và cam kết khi hệ thống của họ gián đoạn.
- Cách tải hàng loạt tệp XML khi kết thúc hợp đồng.
ALODEV xây phần mềm bán hàng, website bán hàng và hệ thống nội bộ theo yêu cầu, trong đó có phần kết nối hóa đơn điện tử với nhà cung cấp mà doanh nghiệp đang dùng. Nếu bạn đang cân nhắc tích hợp, có thể trao đổi để được đánh giá luồng dữ liệu hiện tại.
Câu hỏi thường gặp
Hóa đơn điện tử file XML là gì?
Là bản gốc của hóa đơn điện tử, chứa toàn bộ dữ liệu hóa đơn theo định dạng của cơ quan thuế, chữ ký số của người bán và mã của cơ quan thuế (với hóa đơn có mã). Tệp PDF chỉ là bản thể hiện của tệp XML.
Cách đọc file XML của hóa đơn điện tử?
Dùng công cụ đọc hóa đơn của nhà cung cấp dịch vụ hóa đơn, tải tệp lên trang tra cứu của nhà cung cấp, hoặc nhập vào phần mềm kế toán có chức năng nhận hóa đơn điện tử. Các công cụ này hiển thị hóa đơn và kiểm tra chữ ký.
Các ký hiệu trên hóa đơn điện tử nghĩa là gì?
Ví dụ 1C25TAA: 1 là hóa đơn giá trị gia tăng, C là có mã của cơ quan thuế, 25 là năm 2025, T là hóa đơn đăng ký sử dụng với cơ quan thuế, AA do người bán tự đặt. Tra bảng ký hiệu trong văn bản hướng dẫn hiện hành cho các giá trị khác.
Mẫu số hóa đơn điện tử là gì?
Là ký hiệu mẫu số, một chữ số đứng đầu cho biết loại hóa đơn: 1 là hóa đơn giá trị gia tăng, 2 là hóa đơn bán hàng, các số khác cho các loại hóa đơn còn lại theo quy định.
Cách lưu trữ hóa đơn điện tử mua vào và bán ra?
Lưu tệp XML gốc của cả hóa đơn mua vào và bán ra, đặt tên theo mã số thuế, ký hiệu, số hóa đơn, lưu kèm dữ liệu tra cứu, sao lưu định kỳ ra nơi khác, và giữ theo thời hạn của pháp luật kế toán. Không chỉ dựa vào hệ thống của nhà cung cấp dịch vụ.


