Trung tâm hỗ trợ 1Office
Truy cập 1Office

Công thức tính lương 1Office: hướng dẫn chi tiết từng hàm và từ khoá

Công thức được cấu hình tại Loại bảng lương hoặc Bảng lương > cột có giá trị cột là Công thức. Xem thêm bài Công thức tính lương.


1. Quy tắc viết công thức

  • Không bắt đầu bằng dấu =. Nhập IF(A > 0, 1, 0), không nhập =IF(...).
  • Hàm không phân biệt chữ hoa, chữ thường: IF, if đều dùng được. Nên viết chữ hoa cho dễ đọc.
  • Dấu phân cách tham số là dấu phẩy ,.
  • Chuỗi ký tự đặt trong dấu nháy kép "...". Ví dụ "Hợp đồng thử việc". Không dùng dấu nháy đơn.
  • Số thập phân dùng dấu chấm: 0.8, không dùng 0,8.
  • Nên chọn hàm và từ khoá từ danh sách gợi ý của trình soạn công thức, không gõ tay tên cột để tránh sai chính tả. Phép toán và số được phép nhập tay.
  • Định dạng ngày là YYYY-MM-DD (ví dụ 2026-09-30). Một số hàm ngày nhận thêm d/m/Y.
  • Từ khoá cột (alias) do người dùng đặt khi tạo cột: không dấu, tối thiểu 4 ký tự, bắt đầu bằng chữ cái, chỉ gồm A-Z, 0-9, _. Hệ thống tự viết hoa. Không được trùng alias trong cùng loại bảng lương và không được tự tham chiếu chính cột đang soạn.
  • Công thức lỗi sẽ hiện thông báo lỗi ngay trong ô của nhân sự đó và không tự trả về 0. Xem mục 14.

2. Toán tử

Nhóm Toán tử Ý nghĩa
Số học + - * / Cộng, trừ, nhân, chia
Số học ^ Luỹ thừa (số mũ nguyên)
Số học % X % Y là số dư của phép chia. X% đứng sau một số là chia 100
Nhóm ( ) Nhóm phép tính để đổi thứ tự ưu tiên
So sánh = != > >= < <= Bằng, khác, lớn hơn, lớn hơn hoặc bằng, nhỏ hơn, nhỏ hơn hoặc bằng
Logic && VÀ: cả hai vế đúng
Logic || HOẶC: ít nhất một vế đúng

Thứ tự ưu tiên từ cao đến thấp: ^, rồi * / %, rồi + -, rồi các phép so sánh, rồi && ||. Khi trộn && và || trong cùng một điều kiện, hãy dùng dấu ngoặc để rõ ý: (A = 1 && B = 2) || C = 3.

Lưu ý quan trọng:

  • Không có hàm AND(), OR(), NOT() và không có hàm SUM(). Dùng &&, ||. Muốn cộng nhiều cột thì dùng +: LUONG_CB + PHU_CAP. Muốn tổng theo nhiều dòng thì dùng SUB_SUM hoặc SA_SUM (mục 6, 7).
  • Không dùng <> để so sánh khác. Dùng !=.
  • So sánh chuỗi phân biệt chữ hoa, chữ thường: "Hợp đồng thử việc" khác "hợp đồng thử việc". So sánh phải khớp đúng từng ký tự, kể cả dấu cách.
  • Chuỗi dạng số so như số ("10" bằng 10).
  • Toán tử + giữa hai số là cộng. Nếu một vế là chữ thì kết quả là nối chuỗi.
  • Phép chia / cho 0 báo lỗi ("Divide by zero error encountered"), không ra 0. Dùng SAFE_DIV (mục 4) để tránh.
  • Khi cần nhân với tỷ lệ phần trăm, nên viết dạng số thập phân (* 0.8) cho chắc chắn.
  • && và || dừng sớm: nếu vế trái đã đủ quyết định kết quả thì vế phải không được tính.
  • Giá trị logic viết là true hoặc false.

3. Từ khoá: cách tham chiếu cột và cột chuẩn

3.1. Tham chiếu cột của chính bảng lương đang soạn

Chỉ cần viết từ khoá cột (alias) mà bạn đã đặt, không cần tiền tố. Ví dụ cột "Lương cơ bản" có alias LUONG_CB thì công thức LUONG_CB * 0.8 lấy giá trị cột này của đúng nhân sự đang tính.

Thứ tự hệ thống tìm một từ khoá:

  1. Nếu là alias của một cột trong bảng thì lấy giá trị cột đó (cột có công thức sẽ được tính trước).
  2. Nếu không có cột nhưng tên trùng một cột chuẩn (mục 3.3) thì lấy giá trị cột chuẩn của nhân sự.
  3. Nếu không có gì thì giá trị là 0.

Vì vậy một từ khoá gõ sai sẽ không báo lỗi mà ra 0. Hãy kiểm tra kỹ chính tả. Hệ thống tự phát hiện các cột tham chiếu vòng nhau.

3.2. Tham chiếu cột của bảng lương khác: ALIAS_BANG__ALIAS_COT

Viết alias của bảng lương, hai dấu gạch dưới, rồi alias của cột. Ví dụ BL_KDHN__T_LTT là cột T_LTT của bảng lương có alias BL_KDHN. Dạng này dùng trong các hàm SA_* (mục 6).

3.3. Cột chuẩn và kiểu dữ liệu

Các cột chuẩn hiển thị trong danh sách từ khoá của trình soạn công thức. Tên hiển thị có thể khác đôi chút theo ngôn ngữ và cấu hình của doanh nghiệp.

Kiểu dữ liệu quyết định cách so sánh: cột kiểu chữ (ví dụ CONTRACT_TITLE, JOB_TITLE) phải so sánh với chuỗi trong nháy kép (CONTRACT_TITLE = "Hợp đồng thử việc"). Cột kiểu số so sánh với số (CAL_WORKDAY >= 22). Mã nhân sự PERSONNEL_CODE luôn được xem là chữ, kể cả khi mã chỉ gồm chữ số.

Hợp đồng

Từ khoá Ý nghĩa Kiểu
CONTRACT_TITLE Tên loại hợp đồng của nhân sự (hiển thị là "Tên hợp đồng"), lấy từ danh mục Loại hợp đồng. Ví dụ "Hợp đồng thử việc", "Hợp đồng lao động 12 tháng". Đây là tên loại trong danh mục, không phải tiêu đề của từng bản hợp đồng Chữ
CONTRACT_TYPE Mã loại hợp đồng viết hoa: THOIVU, LAODONG, KHONGTHOIHAN, THUVIEC, DAOTAONGHE, DICHVU Chữ
CONTRACT_TYPE_ID ID của loại hợp đồng Số
CONTRACT_CODE Mã hợp đồng Chữ
CONTRACT_DATE_START, CONTRACT_DATE_FINISH Ngày bắt đầu, ngày kết thúc hợp đồng (định dạng YYYY-MM-DD) Chữ
CONTRACT_DURATION Thời hạn hợp đồng (hoặc "Vô thời hạn") Chữ
DATE_END_PROBATION Ngày kết thúc thử việc Ngày

Ghi chú về CONTRACT_TITLE và CONTRACT_TYPE:

  • Giá trị lấy theo loại hợp đồng của hợp đồng hiện tại của nhân sự trong hồ sơ nhân sự (hợp đồng chính mới nhất chưa thanh lý, không tính phụ lục).
  • Nếu nhân sự chưa có hợp đồng hoặc hợp đồng chưa có loại thì giá trị là chuỗi rỗng (khi bảng có cột này). Nếu bảng lương không có cột CONTRACT_TITLE mà bạn gọi trực tiếp tên này trong công thức, hệ thống trả 0 thay vì chuỗi rỗng. Vì vậy nên thêm cột "Tên hợp đồng" (giá trị cột CONTRACT_TITLE) vào mẫu bảng lương nếu muốn so sánh với chuỗi.
  • Nên so sánh CONTRACT_TYPE với mã (ví dụ CONTRACT_TYPE = "THUVIEC") khi doanh nghiệp có thể đổi tên loại hợp đồng trong danh mục. Dùng CONTRACT_TITLE khi bạn cần theo đúng tên đang đặt trong danh mục.
  • Giá trị này không sửa tay trực tiếp trên bảng lương. Muốn đổi thì đổi loại hợp đồng trong hồ sơ nhân sự.

Nhân sự và tổ chức

Từ khoá Ý nghĩa
PERSONNEL_CODE Mã nhân sự
PERSONNEL_NAME Họ tên
PRIVATE_CODE CMT / Căn cước / Hộ chiếu
DEPARTMENT_CODE, DEPARTMENT_NAME, DEPARTMENT_FULLNAME Mã phòng ban, tên phòng ban, tên phòng ban đầy đủ
DEPARTMENT_DEEP0 đến DEPARTMENT_DEEP6 Công ty và phòng ban cấp 1 đến cấp 6
JOB_TITLE Chức vụ
POSITION_TITLE Vị trí
GENDER, BIRTHDAY Giới tính, ngày sinh
DATE_JOIN, DATE_REAL, YEAR_JOIN Ngày vào công ty, ngày vào chính thức, thâm niên
NUMBER_DEPENDENT Số người phụ thuộc
EMAIL, MOBILE, NATIONALITY, JOB_TAX Email, số điện thoại, quốc tịch, mã số thuế cá nhân
BANK_ACCOUNT_NAME, BANK_ACCOUNT, BANK_NAME, BANK_BRANCH, BANK_CODE Thông tin ngân hàng

Lương, thuế, bảo hiểm (các cột có công thức mặc định, có thể chỉnh)

Từ khoá Ý nghĩa
SALARY_REAL Lương vị trí
SALARY_PREMIUM Lương đóng bảo hiểm
SALARY_ALLOW, SALARY_ALLOW_TAX, SALARY_ALLOW_NO_TAX Lương phụ cấp, phụ cấp tính thuế, phụ cấp không tính thuế
SALARY_END Tổng tiền (lương thực nhận)
SALARY_ENTERPRISE, SALARY_PRIVATE Lương chuyển qua tài khoản doanh nghiệp, tài khoản cá nhân
SALARY_PAID, SALARY_REST Lương đã chi trả, lương chưa thanh toán
GROSS_INCOME Tổng thu nhập
TAXABLE_INCOME Thu nhập chịu thuế
NON_TAXABLE_INCOME Thu nhập không chịu thuế
DEDUCT_TOTAL, DEDUCT_PRIVATE, DEDUCT_INSURANCE Tổng giảm trừ, mức giảm trừ cá nhân, khấu trừ BHXH BHYT BHTN
NUMBER_RELATION Số người phụ thuộc dùng tính thuế
ASSESSABLE_INCOME Thu nhập tính thuế (sau các khoản giảm trừ)
RATE_TAX Thuế suất
PIT Thuế thu nhập cá nhân
UNION, UNION_EMPLOYER Kinh phí công đoàn, kinh phí công đoàn của người sử dụng lao động
KPI_MONTH Điểm KPI tháng

Chấm công (lấy từ bảng chấm công tháng)

Từ khoá Ý nghĩa
CAL_WORKDAY Công làm việc
CAL_WORKHOUR Giờ làm việc thực tính
NUMBER_WORKDAY, NUMBER_WORKDAY_AUTO Số công chuẩn, số công chuẩn tự động
WORKDAY_OVERTIME, CAL_WORKDAY_OVERTIME, WORKHOUR_OVERTIME, CAL_WORKHOUR_OVERTIME Công và giờ làm thêm
LATE, SOON, LATE_MINUTE, SOON_MINUTE Số lần và số phút đi muộn, về sớm
LEAVE_P, LEAVE_NOREASON Số công nghỉ phép, số công nghỉ không lý do
OFF_TIME Số giờ vắng mặt không lương
FURLOUGH_OPEN, FURLOUGH_USED, FURLOUGH_CLOSED Phép năm đầu kỳ, đã dùng, cuối kỳ
BONUS_MONEY, PENALTY_MONEY, WELFARE_MONEY Tiền thưởng, tiền phạt, tiền phúc lợi

Ngoài ra, các biến tuỳ biến (loại hằng số, sheet tháng) mà doanh nghiệp khai báo trong mẫu bảng chấm công cũng xuất hiện trong danh sách từ khoá.

Từ khoá hệ thống

Từ khoá Ý nghĩa
SALARY_MONTH, SALARY_YEAR Tháng, năm của bảng lương đang tính
PAY_DATE Ngày chi lương
IS_MAIN Loại dòng

4. Hàm điều kiện và toán học

IF: tính giá trị theo điều kiện

Từ khoá tìm kiếm: hàm IF, điều kiện nếu thì ngược lại, so sánh chuỗi, IF lồng nhau.

Cú pháp: IF(điều_kiện, giá_trị_nếu_đúng, giá_trị_nếu_sai)

Tham số Bắt buộc Ý nghĩa
điều_kiện Có Biểu thức so sánh hoặc logic, ví dụ CONTRACT_TITLE = "Hợp đồng thử việc"
giá_trị_nếu_đúng Có Số, chuỗi, từ khoá, biểu thức, hoặc một hàm khác
giá_trị_nếu_sai Có Như trên

Kết quả: giá trị của nhánh được chọn. Chỉ nhánh được chọn mới được tính.

Ví dụ:

  • Lương thử việc hưởng 80%, hợp đồng chính thức hưởng 100%: IF(CONTRACT_TITLE = "Hợp đồng thử việc", LUONG_CB * 0.8, LUONG_CB)
  • Thưởng theo chức vụ với điều kiện HOẶC: IF(JOB_TITLE = "Quản lý" || JOB_TITLE = "Tổ trưởng", 2000000, 700000)
  • Điều kiện VÀ: thưởng chuyên cần khi đủ công và không đi muộn: IF(CAL_WORKDAY >= 22 && LATE = 0, 500000, 0)
  • IF lồng nhau, ba mức xếp loại: IF(KPI_MONTH >= 90, 3000000, IF(KPI_MONTH >= 70, 2000000, 1000000))

Lưu ý:

  • Cả ba tham số đều bắt buộc. Luôn viết đủ nhánh sai, ví dụ trả 0 nếu không muốn cộng gì.
  • Điều kiện được coi là sai khi kết quả là 0, chuỗi rỗng, "0", false; còn lại là đúng.
  • So sánh chuỗi phân biệt chữ hoa, chữ thường và phải khớp chính xác (mục 2).
  • Có thể lồng nhiều tầng IF.

SAFE_DIV: chia an toàn

Cú pháp: SAFE_DIV(tử_số, mẫu_số, [giá_trị_mặc_định])

Tham số Bắt buộc Ý nghĩa
tử_số Có Số bị chia
mẫu_số Có Số chia
giá_trị_mặc_định Không Giá trị trả về khi mẫu số bằng 0. Bỏ trống thì trả 0

Kết quả: tử_số / mẫu_số. Khi mẫu số bằng 0 thì trả giá trị mặc định (hoặc 0), không báo lỗi.

Ví dụ: lương một ngày công: SAFE_DIV(LUONG_CB, NUMBER_WORKDAY). Có mặc định: SAFE_DIV(A, B, -1).

ROUND: làm tròn

Cú pháp: ROUND(giá_trị, [số_chữ_số])

Làm tròn kiểu "5 trở lên thì làm tròn lên". số_chữ_số mặc định là 0. Số chữ số âm làm tròn về hàng chục, trăm, nghìn. Giá trị không phải số cho kết quả 0.

Ví dụ: ROUND(1234.567, 2) cho 1234.57. ROUND(1234567, -3) cho 1235000.

CEIL: làm tròn lên

Cú pháp: CEIL(giá_trị). Làm tròn lên số nguyên gần nhất. CEIL(2.1) cho 3.

FLOOR: làm tròn xuống

Cú pháp: FLOOR(giá_trị). Làm tròn xuống số nguyên gần nhất. FLOOR(2.9) cho 2.

MAX: giá trị lớn nhất

Cú pháp: MAX(giá_trị_1, giá_trị_2, ...). Nhận nhiều tham số, trả về giá trị lớn nhất.

Ví dụ: không cho lương tính thuế âm: MAX(0, THU_NHAP - GIAM_TRU).

MIN: giá trị nhỏ nhất

Cú pháp: MIN(giá_trị_1, giá_trị_2, ...). Nhận nhiều tham số, trả về giá trị nhỏ nhất.

Ví dụ: khống chế mức đóng bảo hiểm không vượt trần (thay TRAN_BH bằng cột hoặc hằng số trần của doanh nghiệp): MIN(LUONG_BH, TRAN_BH).

AVG: trung bình các tham số

Cú pháp: AVG(giá_trị_1, giá_trị_2, ...). Trả về trung bình cộng của các tham số truyền vào, không phải của một cột qua nhiều dòng. Để tính trung bình một cột trên nhiều nhân sự hoặc nhiều dòng, dùng SA_AVG hoặc SUB_AVG.

Ví dụ: AVG(10, 20, 30) cho 20.


5. Hàm ngày tháng

Các hàm DATE, MONTH, YEAR, WEEK lấy thời điểm tại lúc hệ thống tính lương, không phải tháng của bảng lương. Muốn dùng tháng và năm của bảng lương đang tính, hãy dùng từ khoá SALARY_MONTH, SALARY_YEAR.

DATE: ngày hiện tại

Cú pháp: DATE([số_ngày_lệch], [định_dạng])

Tham số Ý nghĩa
số_ngày_lệch Số ngày cộng thêm (dương) hoặc trừ đi (âm), phải là số gõ trực tiếp, không dùng biểu thức hay từ khoá. Mặc định 0
định_dạng Định dạng ngày, mặc định Y-m-d. Có thể dùng d/m/Y

Kết quả: chuỗi ngày. Ví dụ: DATE(-1) là ngày hôm qua. DATE(0, "d/m/Y") là hôm nay theo dạng ngày/tháng/năm.

DATE_DIF: chênh lệch giữa hai ngày

Từ khoá tìm kiếm: tính thâm niên, tính số tháng làm việc, số ngày giữa hai mốc thời gian.

Cú pháp: DATE_DIF(ngày_bắt_đầu, ngày_kết_thúc, "đơn_vị")

Cả ba tham số đều bắt buộc. Ngày ở dạng YYYY-MM-DD hoặc d/m/Y. đơn_vị viết chữ hoa trong nháy kép:

Đơn vị Kết quả
"D" Số ngày giữa hai ngày
"M" Chênh lệch số tháng lịch (chỉ tính theo tháng và năm, không xét ngày trong tháng)
"Y" Số năm tròn (trừ 1 nếu chưa đến ngày kỷ niệm)
"MD", "YM", "YD" Số ngày bỏ qua tháng; số tháng bỏ qua năm; số ngày bỏ qua năm

Kết quả: số. Nếu một trong hai ngày rỗng thì trả 0. Nếu ngày bắt đầu sau ngày kết thúc thì kết quả là số âm. Đơn vị sai cũng trả 0.

Ví dụ: thâm niên theo năm: DATE_DIF(DATE_JOIN, DATE(0), "Y"). Số tháng làm việc: DATE_DIF("2024-01-15", "2026-10-06", "M") cho 33.

DAY_WEEK: thứ trong tuần

Cú pháp: DAY_WEEK([ngày], [định_dạng]). Không truyền ngày thì lấy hôm nay.

Định dạng Kết quả
"dvi" Thứ bằng tiếng Việt
"den" Thứ bằng tiếng Anh (Monday, Tuesday...)
Khác hoặc bỏ trống Số từ 1 (Thứ Hai) đến 7 (Chủ nhật)

GET_MONTH: lấy tháng từ một ngày

Cú pháp: GET_MONTH(ngày). Trả số tháng từ 1 đến 12 của ngày (YYYY-MM-DD). Ví dụ: GET_MONTH(DATE_JOIN).

GET_YEAR: lấy năm từ một ngày

Cú pháp: GET_YEAR(ngày). Trả năm 4 chữ số của ngày. Ví dụ: GET_YEAR(BIRTHDAY).

MONTH: tháng hiện tại của hệ thống

Cú pháp: MONTH([bước]). Trả số tháng hiện tại cộng thêm bước (có thể âm). MONTH(-1) là tháng trước. Chỉ nhận số gõ trực tiếp. Hàm này tự quay vòng tháng nhưng không điều chỉnh năm.

YEAR: năm hiện tại của hệ thống

Cú pháp: YEAR([bước]). Trả năm hiện tại cộng thêm bước.

WEEK: số tuần trong năm

Cú pháp: WEEK([bước]). Trả số tuần (theo chuẩn ISO) hiện tại cộng thêm bước tuần (có thể âm).


6. Hàm lấy dữ liệu từ bảng lương khác (nhóm SA)

Nhóm hàm SA_* gom dữ liệu của một cột từ một bảng lương (có thể là bảng khác, tháng khác).

Cú pháp chung: SA_xxx(wage_alias, time, keyword, [condition])

Tham số Bắt buộc Ý nghĩa
wage_alias Có Từ khoá (alias) của bảng lương cần lấy dữ liệu, trong nháy kép. Giá trị đặc biệt "CURRENT" là bảng lương hiện tại
time Có Tháng cần lấy so với tháng của bảng lương hiện tại: 1 là tháng hiện tại, -1 tháng trước, -2 hai tháng trước, -3 ba tháng trước. Có thể dùng số âm lớn hơn. Số không âm (0, 1, 2...) đều được hiểu là tháng hiện tại
keyword Có Cột cần tính, viết theo dạng ALIAS_BANG__ALIAS_COT (mục 3.2). Phải là từ khoá cột, không phải chuỗi chữ
condition Không Điều kiện lọc, được kiểm tra cho từng dòng; dòng nào thoả mới được tính

Phạm vi tính (rất quan trọng): nhóm SA_SUM, SA_AVG, SA_COUNT, SA_MAX, SA_MIN gộp tất cả nhân sự (mọi dòng chính) của bảng lương đích trong tháng đó. Hàm không tự lọc theo nhân sự đang được tính. Muốn lấy riêng một nhân sự, hãy đưa vào condition điều kiện theo mã nhân sự, ví dụ BL_KDHN__PERSONNEL_CODE = "NV001". Riêng SA_VALUE lấy giá trị của chính nhân sự đang tính (xem bên dưới).

Điều kiện (condition): là biểu thức bình thường (so sánh, &&, ||), có thể so sánh số hoặc chuỗi. Cột của bảng được viết ALIAS_BANG__ALIAS_COT. Khi lấy dữ liệu từ chính bảng lương đang tính và cùng tháng, có thể viết alias cột không cần tiền tố.

Khi không có dòng nào: các hàm trả 0. Nếu thiếu wage_alias, báo lỗi "Wage code is required". Nếu không tìm thấy bảng lương hiện tại, báo lỗi "Wage is not found".

Khi lấy dữ liệu tháng trước (time âm): dùng alias bảng lương thật thay vì "CURRENT".

SA_SUM: tổng

Cú pháp: SA_SUM(wage_alias, time, keyword, [condition]). Trả tổng giá trị cột trên các dòng thoả điều kiện.

Ví dụ: tổng quỹ lương tháng trước của bảng kinh doanh Hà Nội: SA_SUM("BL_KDHN", "-1", BL_KDHN__T_LTT).

SA_AVG: trung bình cộng

Cú pháp: SA_AVG(wage_alias, time, keyword, [condition]). Trả trung bình cộng cột, làm tròn 2 chữ số. Số dòng dùng để chia là số dòng thoả điều kiện, kể cả dòng có giá trị 0 hoặc trống (tính là 0).

Ví dụ: trung bình cột "Tổng lương thực tế" (T_LTT) của bảng BL_KDHN tháng hiện tại, với điều kiện tổng lương thực tế lớn hơn 1.000.000: SA_AVG("BL_KDHN", "1", BL_KDHN__T_LTT, BL_KDHN__T_LTT > 1000000) Nếu có ba dòng 15.000.000, 15.000.000 và 10.000.000 thì kết quả là 13.333.333.

SA_COUNT: đếm

Cú pháp: SA_COUNT(wage_alias, time, keyword, [condition]). Đếm số dòng thoả điều kiện mà cột có giá trị khác 0 và khác rỗng. Dòng có giá trị 0 hoặc rỗng không được đếm.

SA_MAX: lớn nhất

Cú pháp: SA_MAX(wage_alias, time, keyword, [condition]). Trả giá trị lớn nhất của cột trên các dòng thoả điều kiện, làm tròn 2 chữ số. Trả 0 nếu không có dòng nào.

SA_MIN: nhỏ nhất

Cú pháp: SA_MIN(wage_alias, time, keyword, [condition]). Trả giá trị nhỏ nhất của cột trên các dòng thoả điều kiện, làm tròn 2 chữ số. Trả 0 nếu không có dòng nào.

SA_VALUE: giá trị của chính nhân sự ở bảng lương tháng khác

Từ khoá tìm kiếm: lấy lương tháng trước, lấy giá trị cột của tháng trước của nhân sự.

Cú pháp: SA_VALUE(wage_alias, time, keyword). Ba tham số đều bắt buộc, không có condition.

Kết quả: giá trị keyword ở bảng lương có alias wage_alias, tháng tương ứng với time, của chính nhân sự đang được tính. Nếu nhân sự không có dòng ở bảng đó thì trả 0. keyword có thể là một cột (BL_THANG__LUONG_CB) hoặc một biểu thức trên các cột của bảng đó. Chỉ lấy bảng lương tự động tạo (không lấy bảng nhập tay).

Ví dụ: lương cơ bản của nhân sự ở bảng BL_THANG tháng trước: SA_VALUE("BL_THANG", "-1", BL_THANG__LUONG_CB).


7. Hàm gộp dòng con (nhóm SUB)

Một nhân sự có thể có nhiều dòng trong cùng bảng lương (một dòng chính và các dòng con, khi nhân sự bị tách dòng, ví dụ làm ở nhiều phòng ban). Nhóm SUB_* gộp giá trị một cột trên các dòng con đó cho cùng một nhân sự, trong cùng bảng lương. Nhân sự không bị tách dòng thì kết quả là giá trị của chính dòng đó.

Cú pháp chung: SUB_xxx(ALIAS_COT). Chỉ có một tham số bắt buộc: từ khoá cột cần gộp. Thiếu tham số thì báo lỗi "Hàm gộp dòng con cần tên cột, ví dụ SUB_SUM(LUONG_CO_BAN)".

Hàm Kết quả
SUB_SUM(ALIAS_COT) Tổng giá trị cột trên các dòng con
SUB_AVG(ALIAS_COT) Trung bình cộng, làm tròn 2 chữ số
SUB_MAX(ALIAS_COT) Giá trị lớn nhất
SUB_MIN(ALIAS_COT) Giá trị nhỏ nhất

Kết quả: số. Không có dữ liệu thì trả 0. Giá trị không phải số bị bỏ qua. Cột kiểu chữ không cộng được.

Ví dụ: tổng lương ngày công của nhân sự trên mọi dòng con: SUB_SUM(LUONG_NGAY_CONG).

Lưu ý: hệ thống kiểm tra khi lưu mẫu. Nếu các cột tham chiếu vòng nhau qua hàm gộp dòng con sẽ báo lỗi, và cột nguồn bị xoá hoặc đổi mã cũng báo lỗi.


8. Hàm thuế thu nhập cá nhân

Cả hai hàm có một tham số: thu nhập tính thuế. Hàm áp biểu thuế trực tiếp lên số bạn truyền vào và không tự trừ giảm trừ gia cảnh hay bảo hiểm. Hãy truyền vào thu nhập đã trừ các khoản giảm trừ, thường là cột ASSESSABLE_INCOME (Thu nhập tính thuế).

Biểu thuế được chọn theo ngày chi lương của bảng lương (nếu trống thì theo ngày tạo bảng):

  • Bảng lương có ngày từ 01/01/2026 trở đi dùng biểu thuế 5 bậc.
  • Bảng lương trước đó dùng biểu thuế 7 bậc.

SA_PIT: số tiền thuế TNCN

Cú pháp: SA_PIT(thu_nhập_tính_thuế). Trả số tiền thuế phải nộp. Thu nhập bằng 0 hoặc âm thì trả 0.

Ví dụ: cột Thuế thu nhập cá nhân: SA_PIT(ASSESSABLE_INCOME). Với thu nhập tính thuế 15.000.000 đồng, biểu 5 bậc cho 1.000.000 đồng, biểu 7 bậc cho 1.500.000 đồng.

SA_RATE_TAX: thuế suất

Cú pháp: SA_RATE_TAX(thu_nhập_tính_thuế). Trả thuế suất theo phần trăm dưới dạng số (5, 10, 15, 20, 25, 30, 35), không chia 100.

Ví dụ: cột Thuế suất: SA_RATE_TAX(ASSESSABLE_INCOME). Thuế suất mặc định của cột RATE_TAX còn xét thêm loại hợp đồng (thử việc, dịch vụ, đào tạo nghề tính 10%).

Biểu thuế 5 bậc (từ 01/01/2026)

Thu nhập tính thuế / tháng Thuế suất Số trừ
Đến 10 triệu 5% 0
Trên 10 đến 30 triệu 10% 500.000
Trên 30 đến 60 triệu 20% 3.500.000
Trên 60 đến 100 triệu 30% 9.500.000
Trên 100 triệu 35% 14.500.000

Biểu thuế 7 bậc (trước 01/01/2026)

Thu nhập tính thuế / tháng Thuế suất Số trừ
Đến 5 triệu 5% 0
Trên 5 đến 10 triệu 10% 250.000
Trên 10 đến 18 triệu 15% 750.000
Trên 18 đến 32 triệu 20% 1.650.000
Trên 32 đến 52 triệu 25% 3.250.000
Trên 52 đến 80 triệu 30% 5.850.000
Trên 80 triệu 35% 9.850.000

Cách tính: thuế = thu nhập tính thuế × thuế suất − số trừ. Hướng dẫn đổi mức giảm trừ gia cảnh và biểu thuế theo quy định mới xem bài Hướng dẫn chỉnh sửa công thức thay đổi cách tính thuế TNCN.


9. Hàm dữ liệu Import

Các hàm này đọc dữ liệu từ Import dữ liệu được khai báo trong mẫu bảng lương (ví dụ file Excel chứa số liệu doanh số, tiền ăn, sản lượng).

Cú pháp chung: XXX_DATA_VALUE(tên_dữ_liệu, tên_cột, [điều_kiện])

Tham số Bắt buộc Ý nghĩa
tên_dữ_liệu Có Từ khoá (alias) của dữ liệu Import trong mẫu bảng lương
tên_cột Có Tên cột trong dữ liệu Import, đúng như tiêu đề cột
điều_kiện Không Biểu thức lọc, kiểm tra cho từng dòng của dữ liệu Import

Quan trọng: các hàm này không tự lọc theo nhân sự. Nếu không có điều kiện, kết quả tính trên toàn bộ dòng của dữ liệu Import. Muốn lấy dữ liệu riêng của từng nhân sự, hãy đặt điều kiện so khớp mã nhân sự. Trong điều kiện, dùng DATA_FIELD("tên cột") để lấy giá trị của một ô trong dòng đang xét.

Hàm Kết quả
GET_DATA_VALUE(...) Giá trị cột của dòng đầu tiên thoả điều kiện (số hoặc chữ)
SUM_DATA_VALUE(...) Tổng giá trị cột
AVG_DATA_VALUE(...) Trung bình cộng giá trị cột (làm tròn 5 chữ số)
MAX_DATA_VALUE(...) Giá trị lớn nhất (tính từ 0, nên tập toàn số âm cho kết quả 0)
MIN_DATA_VALUE(...) Giá trị nhỏ nhất

DATA_FIELD: tham chiếu cột của dòng Import

Cú pháp: DATA_FIELD("tên_cột"). Chỉ dùng bên trong điều kiện của các hàm *_DATA_VALUE; nó đại diện cho giá trị ô thuộc cột đó của dòng Import đang xét.

Ví dụ minh hoạ cú pháp (thay tên dữ liệu và tên cột theo dữ liệu Import của bạn): tổng số ngày công của nhân sự đang tính, lấy từ Import có alias CHAM_CONG, cột SO_NGAY, khớp theo cột MA_NV: SUM_DATA_VALUE("CHAM_CONG", "SO_NGAY", DATA_FIELD("MA_NV") = PERSONNEL_CODE)

Lưu ý: thiếu tên_dữ_liệu thì báo lỗi "Data name is required". Không tìm thấy dữ liệu Import thì kết quả rỗng hoặc 0.


10. Hàm KPI

KPI_VALUE: lấy kết quả KPI của nhân sự

Cú pháp: KPI_VALUE("tên_mẫu_KPI", time)

Tham số Bắt buộc Ý nghĩa
tên_mẫu_KPI Có Tên mẫu KPI trong phân hệ KPI, viết đúng tên, trong nháy kép
time Có Tháng lấy KPI so với tháng bảng lương: 1 tháng hiện tại, -1 tháng trước, -2, -3

Kết quả: số. Là kết quả (result) KPI của chính nhân sự đang tính, trong tháng tương ứng, thuộc mẫu KPI đã chọn, chỉ lấy các phiếu KPI ở trạng thái đã chốt. Nếu có nhiều bản ghi thì lấy kết quả lớn nhất. Không có KPI thì trả 0.

Lưu ý: nếu gõ sai tên mẫu KPI, hàm không báo lỗi mà trả 0.

Ví dụ: thưởng theo KPI tháng trước: KPI_VALUE("KPI Kinh doanh", "-1") * 100000.


11. Hàm lấy dữ liệu từ đối tượng khác

Nhóm hàm này đọc dữ liệu từ các đối tượng khác trong hệ thống (ví dụ phiếu thu, đơn từ). Đối tượng, trường và điều kiện được chọn bằng giao diện của trình soạn công thức, nên nên chọn từ danh sách gợi ý thay vì gõ tay.

Hàm Cú pháp Kết quả
FIELD_VALUE FIELD_VALUE(đối_tượng, trường, [điều_kiện], [kiểu_hiển_thị]) Giá trị của trường ở bản ghi đầu tiên thoả điều kiện. kiểu_hiển_thị là "display" (như trên giao diện), "export" (như khi xuất file) hoặc "raw" (giá trị thô, ví dụ ID)
SUM_OBJECT SUM_OBJECT(đối_tượng, trường, [điều_kiện]) Tổng giá trị trường. Không có bản ghi thì trả 0
MAX_OBJECT MAX_OBJECT(đối_tượng, trường, [điều_kiện]) Giá trị lớn nhất
MIN_OBJECT MIN_OBJECT(đối_tượng, trường, [điều_kiện]) Giá trị nhỏ nhất
AVG_OBJECT AVG_OBJECT(đối_tượng, trường, [điều_kiện]) Giá trị trung bình
COUNT_OBJECT COUNT_OBJECT(đối_tượng, [điều_kiện]) Số bản ghi thoả điều kiện

Hàm lọc dùng làm điều_kiện (chỉ dùng làm tham số điều kiện của các hàm trên, không dùng trực tiếp trong biểu thức số hay IF):

Hàm Lọc theo
IN_THIS_MONTH(trường) Trường ngày thuộc tháng hiện tại
IN_PREV_MONTH(trường) Trường ngày thuộc tháng trước
IN_NEXT_MONTH(trường) Trường ngày thuộc tháng sau
IN_THIS_YEAR(trường) Trường ngày thuộc năm hiện tại
IN_PREV_YEAR(trường) Trường ngày thuộc năm trước
IN_DATE(trường, từ_ngày, đến_ngày) Trường ngày nằm trong khoảng, gồm cả hai ngày đầu và cuối
FIELD_EMPTY(trường) Trường rỗng
FIELD_NOT_EMPTY(trường) Trường có giá trị

Lưu ý: các hàm IN_* tính theo tháng và năm của máy chủ tại thời điểm tính, không theo kỳ lương của bảng. Có thể kết hợp nhiều điều kiện bằng &&.


12. Hàm theo phòng ban và người dùng

GET_SUB_DEPARTMENTS: các phòng ban con

Cú pháp: GET_SUB_DEPARTMENTS(phòng_ban). Trả chuỗi ID các phòng ban con của phòng ban. Trả chuỗi rỗng nếu không có.

USER_RELATIONS: người dùng liên quan

Cú pháp: USER_RELATIONS(người_dùng_hoặc_phòng_ban, [quan_hệ], [loại])

Loại Kết quả
"user" (mặc định) Danh sách ID người dùng liên quan
"count_user" Số người dùng liên quan
"department" Theo phòng ban
"count_user_department" Số người dùng liên quan theo phòng ban

Không có người dùng hoặc phòng ban thì báo lỗi "User/deparment is not found"; không tìm thấy quan hệ thì báo lỗi "Relation not found".


13. Tình huống thường gặp (hỏi đáp)

Làm sao để lương thử việc chỉ hưởng 80%, còn hợp đồng chính thức hưởng 100%?

Dùng hàm IF so sánh CONTRACT_TITLE (tên loại hợp đồng) hoặc CONTRACT_TYPE (mã loại hợp đồng):

  • Theo tên loại hợp đồng: IF(CONTRACT_TITLE = "Hợp đồng thử việc", LUONG_CB * 0.8, LUONG_CB)
  • Theo mã loại hợp đồng (khuyến nghị nếu tên loại có thể đổi): IF(CONTRACT_TYPE = "THUVIEC", LUONG_CB * 0.8, LUONG_CB)

Trong đó LUONG_CB là từ khoá của cột lương cơ bản trong bảng lương của bạn. Hãy thay bằng alias thực tế.

Cần lưu ý:

  1. Chuỗi so sánh phải khớp chính xác từng ký tự với tên loại hợp đồng trong danh mục Loại hợp đồng (kể cả chữ hoa, chữ thường).
  2. Nên thêm cột "Tên hợp đồng" (giá trị cột CONTRACT_TITLE) hoặc "Loại hợp đồng" (CONTRACT_TYPE) vào mẫu bảng lương để giá trị rỗng được hiểu là chuỗi rỗng thay vì 0.
  3. Giá trị lấy theo hợp đồng hiện tại của nhân sự trong hồ sơ nhân sự, nên hãy bảo đảm hồ sơ đã chọn đúng loại hợp đồng.

Làm sao áp dụng cho nhiều loại hợp đồng, ví dụ thử việc và dịch vụ?

Dùng toán tử ||: IF(CONTRACT_TYPE = "THUVIEC" || CONTRACT_TYPE = "DICHVU", LUONG_CB * 0.8, LUONG_CB).

Làm sao tính hệ số khác nhau theo loại hợp đồng (ba mức)?

Dùng IF lồng: IF(CONTRACT_TYPE = "THUVIEC", 0.8, IF(CONTRACT_TYPE = "DICHVU", 0.9, 1)). Nhân kết quả này với lương: LUONG_CB * IF(CONTRACT_TYPE = "THUVIEC", 0.8, IF(CONTRACT_TYPE = "DICHVU", 0.9, 1)).

Làm sao so sánh một cột chữ với một giá trị?

Đặt giá trị trong dấu nháy kép và dùng =: JOB_TITLE = "Quản lý". So sánh phân biệt chữ hoa, chữ thường. Không dùng dấu nháy đơn và không dùng <> (dùng !=).

Làm sao tính lương theo ngày công?

LUONG_CB / NUMBER_WORKDAY * CAL_WORKDAY. Để tránh lỗi khi số công chuẩn bằng 0: SAFE_DIV(LUONG_CB, NUMBER_WORKDAY) * CAL_WORKDAY.

Làm sao lấy giá trị của nhân sự ở bảng lương tháng trước?

Dùng SA_VALUE: SA_VALUE("BL_THANG", "-1", BL_THANG__LUONG_CB) (mục 6).

Làm sao tính thuế TNCN theo biểu thuế luỹ tiến?

Cột Thuế TNCN dùng SA_PIT(ASSESSABLE_INCOME); cột Thuế suất dùng SA_RATE_TAX(ASSESSABLE_INCOME) (mục 8).

Hàm SA_SUM, SA_AVG có tính riêng cho từng nhân sự không?

Không. Các hàm SA_SUM, SA_AVG, SA_COUNT, SA_MAX, SA_MIN gộp toàn bộ nhân sự của bảng lương đích. Chỉ SA_VALUE lấy theo chính nhân sự. Muốn lấy riêng một nhân sự bằng các hàm SA_*, dùng condition theo mã nhân sự (mục 6).

Có hàm SUM, AND, OR, NOT không?

Không. Dùng toán tử + để cộng, và && || cho logic (mục 2). Với tổng theo nhiều dòng hoặc nhiều nhân sự, dùng SUB_SUM hoặc SA_SUM.

Công thức ra kết quả 0 dù đã nhập đúng?

Một từ khoá không tồn tại hoặc gõ sai sẽ trả 0 mà không báo lỗi (mục 3.1). Kiểm tra lại chính tả từ khoá cột. Với CONTRACT_TITLE và CONTRACT_TYPE, nếu bảng không có cột tương ứng thì giá trị khi nhân sự chưa có hợp đồng là 0 thay vì chuỗi rỗng.


14. Lỗi thường gặp và cách xử lý

Thông báo Nguyên nhân Cách xử lý
Divide by zero error encountered Phép chia cho 0 Dùng SAFE_DIV
Keyword X notfound Từ khoá không tồn tại trong hệ thống Chọn lại từ khoá từ danh sách gợi ý
X (Funcs\funcX) is not supported Dùng hàm không có trong hệ thống, ví dụ SUM(...) Dùng toán tử + hoặc hàm đúng của hệ thống
! is not supported Dùng toán tử phủ định ! Dùng != hoặc = false
Wage code is required Thiếu alias bảng lương ở hàm SA_* Điền tham số wage_alias
Wage is not found Không tìm thấy bảng lương hiện tại Kiểm tra lại bảng lương và alias
Hàm gộp dòng con cần tên cột Gọi SUB_* mà không có tên cột Truyền alias cột, ví dụ SUB_SUM(LUONG_CO_BAN)
Data name is required Thiếu tên dữ liệu ở hàm *_DATA_VALUE Điền alias của dữ liệu Import
Args in function DATE_DIF not enough DATE_DIF thiếu tham số Truyền đủ ngày bắt đầu, ngày kết thúc và đơn vị
Args in function SA_PIT not enough SA_PIT hoặc SA_RATE_TAX thiếu tham số Truyền thu nhập tính thuế
Không tính được cột X: cột nguồn ... chưa tính xong Các cột tham chiếu vòng nhau Kiểm tra các công thức có tham chiếu lẫn nhau không
Báo lỗi vòng tham chiếu khi lưu mẫu Các cột tham chiếu vòng nhau qua hàm gộp dòng con Sửa công thức để bỏ vòng tham chiếu

 

Back to top
1Office là phần mềm đa chức năng dành cho quản trị doanh nghiệp, giúp tối ưu hoá quy trình làm việc và nâng cao hiệu suất hoạt động của tổ chức.