建立準確、可靠的基於軟體的會計財務系統的最佳實踐和原則。
在過去的幾百年裡,會計並沒有太大的變化。儘管如此,人們對如何正確構建財務系統軟體仍存在很多困惑。
在這篇文章中,我將分享我在大型科技公司從事財務系統工作多年所獲得的經驗教訓。我們的重點是建立會計系統,但這些原則也適用於更一般的財務系統。
這篇文章將討論以下內容
- 與職位相關的基本財務定義
- 會計系統的高階目標
- 實現這些目標的工程原理
- 最佳實踐
定義
- 總帳 (General Ledger :GL) :公司的主要會計記錄,總結特定時間段內的所有財務交易。您可以將其視為其相應子分類帳的集合。
- 子分類賬(Sub-ledger):包含與特定 GL 相關的所有單個交易的詳細資訊。子分類賬中的記錄將比總分類賬包含更詳細的資料,例如特定客戶是誰、訂單中的特定專案等。子分類賬和 GL 之間的資料差異取決於業務型別和您處理的資料量。一些小型企業可以完全不使用任何子分類賬,但他們是否需要定製軟體來管理規模如此小的事物值得懷疑。
- 財務記錄:指總賬和明細賬。
- 重要性(Material):重要性是指財務報表中的資訊錯報是否會影響合理的利益相關者的決策陳述。請注意,此定義在設計上有些模糊,因為不同的企業具有不同的重要性閾值。例如,對於年收入 25 萬美元的企業來說可能很重要的事情,對於年收入 10 億美元的企業來說可能並不重要。從設計角度來看,此概念的主要價值在於對不同類別的財務資料進行分類。
目標
會計系統的三個主要目標是
- (1)準確,
- (2)可審計
- (3)及時
準確
財務記錄需要反映已知的業務狀況。這個說法有點寬泛,需要一些解釋:
如果我們銷售 10 件售價 9.99 美元的產品,相應的財務記錄必須總計 99.90 美元。這似乎很明顯,但當您彙總數千(很多情況下是數百萬)筆交易時,系統之間的簡單求和或舍入誤差可能會導致重大錯誤。
Wasteman 的註釋:人們說命名是電腦科學中最難的問題,而我認為緊隨其後的是加法。
過去幾年,我一直在處理大型金融系統,我記不清最小的錯誤導致我們的資料出現巨大差異的次數。
另外
- 不要讓我一開始就使用浮點數求和
- 我透過慘痛的經歷學到了為什麼應該始終使用整數。
財務記錄也需要完整。更具體地說,分類賬和總賬都是在特定時間發生的所有業務活動的完整表示。
如果發生了某個事件但未記錄在財務記錄中,則系統不完整。
請注意,這並不意味著最終一致性不可接受。
您只需要知道您的資料何時會完整,以通知利益相關者資料已完成。
另一個令人驚訝的難題是保證完整性。隨著系統規模的擴大,資料在許多系統之間跳躍,每次跳躍時資料都很容易意外改變或丟失。
可審計
與準確性密切相關的是,您的財務記錄必須易於審計,以便利益相關者能夠發現錯誤並準確衡量您的業務績效。即使您不關心,國稅局肯定關心。
及時
這一點完全取決於您的業務及其具體需求。小型企業只需在月底之前將所有數字全部轉儲即可,剛好可以及時結賬。大型企業通常希望避免這種情況,並擁有近乎實時的系統。這使他們能夠監控當月的財務狀況,更快地根據財務資料做出決策,並減少在月初幾天匆忙結賬的現象。
但無論需求是什麼,我們的會計系統都應該滿足您的業務需求,以及及時性對它們意味著什麼。
工程原理
您的會計系統應遵循的三個主要工程原則是
- 資料的不變性和永續性
- 資料應該以最小的粒度表示
- 程式碼應該是冪等的
不變且持久
這允許可審計性,從而有助於除錯並進而提高準確性。當資料不可變時,您可以記錄系統在任何給定時間的狀態。這使得從以前的狀態重新計算世界變得非常容易,因為沒有狀態會丟失。
此外,一旦資料被記錄在財務記錄中,它就不能被刪除。對系統的任何更正都必須表示為新的財務交易。
例如:
- 假設您的系統有一個錯誤,並意外地報告了一項服務的售價為 1000 美元,而實際價格應該是 900 美元。
- 要糾正這個錯誤,您應該首先撤銷與錯誤相對應的會計分錄,然後重新記錄正確金額的會計分錄。
以最小粒度記錄的資料
與上述原則類似,這對於實現清晰的審計線索也至關重要。儘管財務報告和總賬是彙總的,但它們是根據更精細的事件計算出來的。當資料不合理時,您需要最精細的資料來除錯可能存在的問題。
以最低粒度儲存資料還可以非常輕鬆地更正從該資料集派生的資料。如果單個不可變資料集是該資料所有檢視的核心事實來源,則要更正該檢視,您只需在修復資料後重新執行建立該檢視的管道即可。
同樣,當會計準備結賬時,他們會核對賬戶餘額與發生的所有交易,以驗證賬簿是否準確。當發現差異時,您可以深入研究可能導致問題的確切交易
冪等性
每個財務事件只能處理一次,財務記錄中的重複將導致明顯的不準確性。因此,所有生成財務記錄的程式碼都應該是冪等的。
最佳實踐
多年來,我遇到了不少讓我痛苦不堪的陷阱。以下是我推薦的最佳做法,可以避免我親身遇到的諸多陷阱。
1、最好使用整數來表示財務金額。
這樣算術就容易多了。某些小數表示是可以的,但要儘量避免使用浮點數。
2、財務金額的粒度應支援貨幣轉換,同時將精度損失降至最低。
如果您只使用美元,那麼用美分表示價值可能就足夠了。如果您是一家全球性企業,則最好使用微位數或小數DECIMAL(19, 4)。小數選擇在財務系統中非常流行,但微位數一直是廣告財務系統的標準。這限制了在貨幣之間轉換時精度的損失。
3、使用一致的舍入方法。
在規模上,舍入方式可能會導致預期金額之間出現重大差異。例如,
- 一種舍入方法是將所有 5 及以上的值四捨五入到下一個有效數字,4 及以下則向下舍入。
- 另一種有效方法是始終向上舍入。重要的是要始終保持一致。
當您處理數百萬筆交易時,每筆交易 1 美分的偏差都可能導致重大差異。(1000 萬筆交易中 1 美分的偏差會導致 10 萬美元的差額)。這可能對您在這種規模上的業務並不重要,但對於政府來說,這足以因您少繳稅款而追究您的責任。
如果您是一家全球性企業,那麼在四捨五入和貨幣兌換方面可能會遇到很多問題。我甚至建議您應該建立一個集中式庫/服務來處理四捨五入和貨幣兌換。不同的政府在計算稅款時遵循不同的四捨五入規則,因此將所有這些細微差別抽象為單一服務將降低複雜性。
4、儘可能延遲貨幣兌換。
提前兌換貨幣可能會導致精度損失。請延遲貨幣兌換,直到以當地貨幣進行彙總之後再進行。
5、使用整數表示時間。
不同技術中有許多庫可以將時間戳解析為物件,而且它們都以不同的方式執行。
避免這種麻煩,只需使用整數即可。
- Unix 時間戳,甚至基於整數的 UTC 日期時間都可以正常工作。
- 系統之間發生的資料轉換越少越好。