校驗(yàn)機(jī)制解析)
每個(gè)月結(jié)賬那幾天成本中心會計(jì)最沒底的環(huán)節(jié)往往就是分配分?jǐn)偂0滋鞙y試運(yùn)行看著挺順晚上正式跑完第二天報(bào)表一拉發(fā)送方成本中心本該清零的余額還掛著幾千甚至幾萬接收方的數(shù)又和測試結(jié)果對不上回頭把循環(huán)打開改兩筆重過賬一遍數(shù)字不但沒回正偏差反而更大。這就是典型的成本分配重過賬問題背后通常纏著兩件事一是迭代漂移迭代輪次不夠或者收斂條件沒設(shè)好殘差留在了發(fā)送方二是累計(jì)校驗(yàn)缺失重跑之前沒沖銷、循環(huán)又勾了累計(jì)同一筆成本被分?jǐn)偭藘纱?。這篇就把這兩個(gè)點(diǎn)從機(jī)制到參數(shù)、從手算到調(diào)優(yōu)完整拆一遍適合正在做成本中心會計(jì)、負(fù)責(zé)月結(jié)、或者被分配循環(huán)性能拖慢過關(guān)賬節(jié)奏的同行參考剛接觸這塊的也能順著看下來。1. 結(jié)賬夜里最怕的那筆余額把問題拆成迭代漂移和累計(jì)校驗(yàn)兩塊先把話說透成本分配重過賬出的問題九成以上不是循環(huán)寫錯(cuò)了而是執(zhí)行機(jī)制沒吃透。分配Distribution和分?jǐn)侫ssessment在系統(tǒng)里的執(zhí)行邏輯本質(zhì)上是一串有順序的憑證生成動作每一步都依賴上一步的結(jié)果。當(dāng)發(fā)送方和接收方之間存在互相提供服務(wù)的場景這串動作就不再是單向流水線而是一個(gè)需要反復(fù)迭代才能收斂的方程組。方程組沒解到收斂就停了殘差自然留在發(fā)送方賬上而重過賬時(shí)如果沒有把上一版結(jié)果清干凈累計(jì)口徑又會把歷史金額再疊一遍。兩個(gè)問題疊加在一起表現(xiàn)就是越改越亂。1.1 兩個(gè)高頻癥狀余額不歸零與金額翻倍余額不歸零是最直觀的信號。分配分?jǐn)偟脑O(shè)計(jì)初衷是把輔助成本中心的歸集成本全額轉(zhuǎn)移到接收方執(zhí)行完成后發(fā)送方當(dāng)期余額應(yīng)該是零。如果跑完還掛著錢只有三種可能迭代沒收斂接收方規(guī)則沒覆蓋全部成本或者分配基數(shù)總和不到百分之百。前兩種最常見而且往往同時(shí)出現(xiàn)——迭代沒收斂時(shí)系統(tǒng)會把沒分完的部分留在發(fā)送方你看到的就是一筆不大不小、看著像漏了的余額。金額翻倍則幾乎都指向累計(jì)口徑。累計(jì)標(biāo)志打開后發(fā)送方的分配基數(shù)取的是從年初到當(dāng)前期間的累計(jì)發(fā)生額不是當(dāng)期發(fā)生額。第一個(gè)月執(zhí)行沒問題第二個(gè)月再執(zhí)行基數(shù)里就包含了第一個(gè)月已經(jīng)分出去的部分receiving 方憑空多收一筆。如果這時(shí)候你還沒沖銷就重跑第三個(gè)月會把前兩個(gè)月的量再疊一次金額呈階梯式上漲月底對賬時(shí)根本找不到原始發(fā)生額在哪。1.2 為什么這兩個(gè)問題在重過賬時(shí)集中爆發(fā)平時(shí)做單筆調(diào)整、單個(gè)成本中心的小額分?jǐn)偟屠塾?jì)的問題都不明顯因?yàn)榻痤~小、接收方少、循環(huán)結(jié)構(gòu)簡單。重過賬不一樣它通常發(fā)生在結(jié)賬末期所有成本中心的數(shù)據(jù)都已歸集完畢循環(huán)是全量執(zhí)行任何一個(gè)環(huán)節(jié)的口徑偏差都會被放大到全公司范圍。更麻煩的是重過賬往往帶著時(shí)間壓力改完就想趕緊跑沖銷、測試運(yùn)行、結(jié)果比對這些動作容易被跳過問題就被帶進(jìn)了正式報(bào)表。我在實(shí)際項(xiàng)目里見過一個(gè)很典型的情況某制造企業(yè)月結(jié)時(shí)發(fā)現(xiàn)動力成本分?jǐn)偤罂傤~對不上差額約兩萬。第一反應(yīng)是改循環(huán)里的百分比改完重跑差額變成四萬多。再改變成六萬多。三次之后才意識到問題根本不在百分比而是每次重跑都沒有沖銷累計(jì)標(biāo)志又是打開的每跑一次就多疊一層。把累計(jì)關(guān)掉、沖銷歷史結(jié)果、重新執(zhí)行一次就對上了。這個(gè)教訓(xùn)很貴但也很典型。1.3 判斷問題歸屬的快速分診法遇到分配結(jié)果異常先別急著改循環(huán)用兩個(gè)動作做分診。第一步看發(fā)送方余額的方向和量級余額是零但接收方金額偏大基本是累計(jì)重復(fù)余額不為零且金額不大基本是迭代殘差。第二步看歷史執(zhí)行記錄把當(dāng)期這個(gè)循環(huán)的執(zhí)行次數(shù)拉出來如果執(zhí)行過兩次以上且沒有沖銷記錄先按重復(fù)分?jǐn)偺幚?。這兩步做完問題歸屬基本就清楚了能省掉大量無效的循環(huán)調(diào)試。2. 分配與分?jǐn)偟膱?zhí)行鏈路拆解要把迭代和累計(jì)講清楚得先把分配分?jǐn)傇谙到y(tǒng)里到底怎么跑的說清楚。很多人對這兩個(gè)功能的理解停留在把成本轉(zhuǎn)出去但實(shí)際上它們的憑證生成邏輯、成本要素處理方式、對下游報(bào)表的影響都不一樣選錯(cuò)了工具后面的調(diào)優(yōu)都是白費(fèi)。2.1 分配和分?jǐn)偟倪x型成本要素保不保留分配的核心特征是保留原始成本要素。發(fā)送方成本中心歸集的差旅費(fèi)、辦公費(fèi)、折舊費(fèi)分配出去之后接收方看到的仍然是差旅費(fèi)、辦公費(fèi)、折舊費(fèi)只是成本中心變了。這個(gè)特性決定了分配適合成本性質(zhì)需要被接收方看清的場景比如共用服務(wù)中心的日常費(fèi)用按人頭分?jǐn)偟礁鳂I(yè)務(wù)部門業(yè)務(wù)部門需要知道這筆錢具體花在什么性質(zhì)上。分?jǐn)倓t完全不同它通過一個(gè)次級成本要素分?jǐn)傄匕殉杀敬虬D(zhuǎn)移。接收方看到的是一筆統(tǒng)一的分?jǐn)偝杀究床坏皆家孛骷?xì)。這個(gè)設(shè)計(jì)看起來是信息損失但恰恰是它的價(jià)值所在當(dāng)你需要把一組性質(zhì)各異的成本按統(tǒng)一邏輯壓縮成一筆管理口徑的費(fèi)用時(shí)分?jǐn)偙确峙涓蓛舻枚?。比?IT 成本中心歸集了人力、軟件許可、硬件折舊、外包服務(wù)四五類費(fèi)用要按各業(yè)務(wù)部門的工單量分?jǐn)傁氯I(yè)務(wù)部門其實(shí)不需要逐項(xiàng)知道 IT 花了多少許可費(fèi)只需要知道我該承擔(dān)多少 IT 成本這時(shí)候用分?jǐn)偩捅确峙浜线m。選型上還有個(gè)隱性因素分配不改成本要素所以接收方的成本要素報(bào)表會變得很長分?jǐn)傆么渭壱貓?bào)表干凈但追溯性差。做管理報(bào)表為主的場景我一般傾向分?jǐn)傋龀杀咀匪莺筒町惙治鰹橹鞯膱鼍胺峙涓线m。這個(gè)選擇在循環(huán)設(shè)計(jì)階段就要定下來后期改造成本很高。2.2 循環(huán)、分段、發(fā)送方與接收方的執(zhí)行順序一個(gè)分配循環(huán)不是一個(gè)整體動作它內(nèi)部由若干分段Segment組成每個(gè)分段獨(dú)立定義發(fā)送方規(guī)則和接收方規(guī)則。執(zhí)行時(shí)系統(tǒng)按分段順序逐個(gè)處理前一個(gè)分段產(chǎn)生的結(jié)果會成為后一個(gè)分段的輸入。這個(gè)順序性非常關(guān)鍵它決定了循環(huán)內(nèi)部的依賴關(guān)系也決定了迭代會在哪里發(fā)生。發(fā)送方規(guī)則定義的是從哪個(gè)成本中心、哪個(gè)成本要素區(qū)間取多少錢。這里有個(gè)容易忽略的點(diǎn)發(fā)送方可以指定成本要素區(qū)間如果不指定默認(rèn)取該成本中心全部初級成本要素。區(qū)間設(shè)得太寬會把不該分的成本帶出去設(shè)得太窄又會漏掉一部分導(dǎo)致余額不歸零。我一般建議把發(fā)送方的成本要素區(qū)間顯式寫出來哪怕就是全區(qū)間也要寫明白方便后面排查。接收方規(guī)則定義的是分給誰、按什么比例分。分配基數(shù)可以是固定百分比、固定金額也可以是統(tǒng)計(jì)指標(biāo)。固定百分比最直觀但最不靈活業(yè)務(wù)量一變就得改循環(huán)統(tǒng)計(jì)指標(biāo)最靈活但依賴統(tǒng)計(jì)指標(biāo)本身的取數(shù)準(zhǔn)確性。實(shí)際項(xiàng)目里統(tǒng)計(jì)指標(biāo)取數(shù)為零或者取數(shù)延遲是導(dǎo)致接收方分不到錢、發(fā)送方留余額的高頻原因這個(gè)后面還會細(xì)說。2.3 迭代在整個(gè)鏈路里到底做了什么迭代解決的問題是循環(huán)引用。當(dāng)分段 A 的接收方里包含了分段 B 的發(fā)送方而分段 B 的接收方里又包含了分段 A 的發(fā)送方兩個(gè)分段就構(gòu)成了互相依賴。系統(tǒng)沒法一次性算出來只能先給一個(gè)初始值然后反復(fù)代入修正直到兩次結(jié)果足夠接近或者達(dá)到設(shè)定的最大輪次。這里必須強(qiáng)調(diào)一點(diǎn)迭代不是多跑幾遍循環(huán)而是在一次執(zhí)行內(nèi)部對金額做反復(fù)逼近。它的收斂速度和循環(huán)結(jié)構(gòu)強(qiáng)相關(guān)結(jié)構(gòu)簡單時(shí)幾輪就穩(wěn)結(jié)構(gòu)復(fù)雜時(shí)十幾輪都未必夠。系統(tǒng)提供的最大迭代次數(shù)是一個(gè)安全閥不是精度保證。很多人默認(rèn)這個(gè)值夠用從來沒調(diào)過結(jié)果在復(fù)雜循環(huán)上就吃了虧。3. 迭代漂移的成因分析與收斂量化迭代漂移這個(gè)詞聽起來玄說白了就是沒算到位就停了。但要把它講明白得從數(shù)學(xué)上過一遍因?yàn)椴煌Y(jié)構(gòu)的循環(huán)收斂速度差得非常遠(yuǎn)憑感覺設(shè)迭代次數(shù)是靠不住的。3.1 交互分配為什么天然需要迭代假設(shè)有兩個(gè)輔助成本中心 A 和 BA 給 B 提供服務(wù)B 也給 A 提供服務(wù)。A 當(dāng)期歸集成本 1000 萬其中 10% 的服務(wù)量給了 BB 當(dāng)期歸集成本 800 萬其中 20% 的服務(wù)量給了 A。如果按順序硬算先算 A 分給 BA 分出去 100 萬A 剩 900 萬再算 B 分給 AB 的基數(shù)里要不要包含剛才 A 分進(jìn)來的 100 萬如果不包含B 分給 A 的是 160 萬A 變成 1060 萬可 A 明明已經(jīng)分過了這 60 萬就成了無源之水。如果包含B 的基數(shù)變成 900 萬分給 A 180 萬A 又變了B 又得重算。這就是交互分配的本質(zhì)兩個(gè)成本中心互相是對方的成本來源任何一方先算都會污染另一方的基數(shù)。數(shù)學(xué)上它是一個(gè)二元一次方程組設(shè)最終 A 的待分配總額為 AB 為 B則有 A 1000 0.2BB 800 0.1A。解出來 A ≈ 1183.67 萬B ≈ 918.37 萬。迭代法就是用一個(gè)初始猜測反復(fù)代入逐步逼近這個(gè)解。3.2 手算一遍五輪迭代的漂移幅度把上面的例子按迭代展開能清楚看到殘差是怎么衰減的。輪次A 待分配額萬元B 待分配額萬元A 相對真值偏差B 相對真值偏差第 0 輪1000.00800.00183.67118.37第 1 輪1160.00900.0023.6718.37第 2 輪1180.00916.003.672.37第 3 輪1183.20918.000.470.37第 4 輪1183.60918.320.070.05第 5 輪1183.664918.360.0070.013真值1183.673918.367——看第 3 輪偏差 0.47 萬和 0.37 萬合計(jì)八千多塊。如果你的最大迭代次數(shù)設(shè)成 3系統(tǒng)跑完就停這八千多塊就留在發(fā)送方賬上報(bào)表上就是分配后仍有余額。而如果結(jié)構(gòu)稍微復(fù)雜一點(diǎn)比如 A 給 B 的比例是 30%、B 給 A 的比例是 30%收斂會慢得多同樣輪次的殘差會大一個(gè)數(shù)量級。這里有個(gè)能直接用的判斷收斂速度取決于交互比例的乘積。上例中 0.1 乘 0.2 等于 0.02開平方約 0.141意思是每輪誤差縮小到上一輪的 14% 左右。如果比例乘積是 0.09每輪縮小到 30%達(dá)到同樣的精度需要多跑五六輪。所以設(shè)迭代次數(shù)之前先把這個(gè)乘積估出來再倒推輪次比拍腦袋靠譜。3.3 舍入、百分比與統(tǒng)計(jì)指標(biāo)帶來的殘差除了迭代輪次不夠還有三類殘差來源經(jīng)常被忽略。第一類是舍入。金額分配到多個(gè)接收方時(shí)系統(tǒng)按比例切分切分結(jié)果要取整到最小貨幣單位。比如 100 萬分給 3 個(gè)接收方每人 33.33 萬合計(jì) 99.99 萬剩下 100 塊。這 100 塊怎么處理取決于系統(tǒng)的尾差處理邏輯有的版本會補(bǔ)到最大的接收方有的會留在發(fā)送方。留在發(fā)送方就是余額不歸零金額不大但看著刺眼而且每個(gè)月都有。第二類是百分比總和不到 100%。接收方規(guī)則里如果用的是固定百分比手工維護(hù)時(shí)漏了一個(gè)接收方、或者百分比加起來是 98%剩下 2% 就分不出去。這種問題在循環(huán)剛建的時(shí)候容易發(fā)現(xiàn)運(yùn)行一段時(shí)間后有人新增了成本中心但沒加進(jìn)接收方規(guī)則就會悄悄出現(xiàn)。第三類是統(tǒng)計(jì)指標(biāo)取數(shù)為零。接收方按統(tǒng)計(jì)指標(biāo)比如工單量、人頭數(shù)分?jǐn)偰硞€(gè)接收方當(dāng)期指標(biāo)值為零系統(tǒng)默認(rèn)跳過它它該承擔(dān)的那部分就按比例攤給其他接收方或者留在發(fā)送方。前者會導(dǎo)致其他接收方金額虛高后者會導(dǎo)致余額留存。這兩種表現(xiàn)都不像錯(cuò)誤很容易被當(dāng)成正常波動放過去。3.4 最大迭代次數(shù)怎么定才不浪費(fèi)也不少算迭代次數(shù)設(shè)太高性能會受影響因?yàn)槊慷嘁惠喚投嘁淮稳坑?jì)算設(shè)太低殘差留在賬上。我的做法是分兩步定先按循環(huán)結(jié)構(gòu)算出理論輪次再留兩輪余量。理論輪次的算法就是上面說的用交互比例乘積的對數(shù)來估。假設(shè)目標(biāo)精度是 1 元初始量級是 1000 萬需要滿足 0.141 的 n 次方乘以 1000 萬小于 1算下來 n 約等于 9。這就是為什么很多簡單循環(huán)設(shè) 10 輪剛好夠。但如果乘積變成 0.25比如交互比例都是 50%每輪只縮小到 50%同樣精度需要 24 輪左右10 輪遠(yuǎn)遠(yuǎn)不夠殘差會在幾萬塊的量級。實(shí)際操作中還有個(gè)折中如果循環(huán)結(jié)構(gòu)復(fù)雜到需要二十幾輪與其加大迭代次數(shù)硬算不如重構(gòu)循環(huán)把互相依賴的部分拆成獨(dú)立分段從根上消掉交互。迭代次數(shù)調(diào)高只是止痛藥結(jié)構(gòu)調(diào)整才是治本。這一點(diǎn)在后文的調(diào)優(yōu)部分會展開。4. 累計(jì)校驗(yàn)期間值、累計(jì)值與沖銷的關(guān)系如果說迭代漂移是算不準(zhǔn)累計(jì)校驗(yàn)出問題就是重復(fù)算。這兩個(gè)問題的表現(xiàn)都是金額不對但排查路徑完全相反分清楚了能省很多時(shí)間。4.1 累計(jì)標(biāo)志到底改變了什么累計(jì)標(biāo)志控制的是發(fā)送方分配基數(shù)的取數(shù)口徑。不勾累計(jì)時(shí)發(fā)送方取的是當(dāng)期發(fā)生額1 月取 1 月的2 月取 2 月的各期獨(dú)立。勾上累計(jì)后發(fā)送方取的是從年初到當(dāng)前期間的累計(jì)發(fā)生額2 月執(zhí)行時(shí)基數(shù)是 1 月加 2 月。這個(gè)設(shè)計(jì)本身有它的場景年度預(yù)算類的分?jǐn)?、按年度合同金額分期攤?cè)氲馁M(fèi)用用累計(jì)口徑可以避免逐月手工調(diào)整。但它的代價(jià)是執(zhí)行必須嚴(yán)格保證每期只跑一次且不重復(fù)。一旦有重過賬動作累計(jì)口徑就會把歷史金額再疊一遍而且疊得很隱蔽因?yàn)閱慰串?dāng)期發(fā)生額是對的只有把分?jǐn)偨Y(jié)果和歷史對比才能發(fā)現(xiàn)。判斷循環(huán)有沒有勾累計(jì)不用進(jìn)循環(huán)看直接看分?jǐn)偨Y(jié)果的特征就行如果某個(gè)月的接收方金額突然接近前幾個(gè)月之和基本就是累計(jì)口徑。這個(gè)特征很明顯但前提是你手上有歷史對比數(shù)據(jù)。4.2 重過賬為什么不沖銷就一定翻倍分配分?jǐn)偟膱?zhí)行結(jié)果是成本中心憑證每次執(zhí)行生成一批新憑證系統(tǒng)不會自動把上一版憑證刪掉或沖掉。這是很多人的認(rèn)知盲區(qū)以為重跑會覆蓋實(shí)際上它是追加。所以正確的重過賬流程一定是先沖銷、再執(zhí)行。沖銷這件事各家系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié)有差異但邏輯是一致的把上一版生成的分配憑證做反向記賬讓發(fā)送方余額恢復(fù)、接收方金額回退賬面上回到還沒分配的狀態(tài)然后再跑新的一版。這個(gè)過程必須確認(rèn)沖銷憑證真的生成了不能只看系統(tǒng)提示成功。我見過沖銷按鈕點(diǎn)了、提示也出來了、但憑證因?yàn)槠陂g已關(guān)或者成本中心被鎖而沒生成的情況然后再去執(zhí)行結(jié)果就是兩版結(jié)果并存。還有一個(gè)細(xì)節(jié)沖銷和執(zhí)行最好放在同一個(gè)時(shí)間窗口內(nèi)完成中間不要插入其他成本過賬。因?yàn)榉峙浠鶖?shù)依賴成本中心余額如果沖銷后有人做了一筆費(fèi)用過賬余額變了你再執(zhí)行時(shí)基數(shù)和上一版就不一樣前后對比會失真排查時(shí)容易往錯(cuò)誤方向想。4.3 一套可復(fù)用的校驗(yàn)動作清單校驗(yàn)不要靠眼睛看要靠固定的動作序列。我一般按這個(gè)順序走能覆蓋絕大多數(shù)情況。第一步執(zhí)行前留底。把發(fā)送方成本中心當(dāng)期余額、接收方各成本中心余額導(dǎo)出存成一張對照表。這一步花不了兩分鐘但出問題時(shí)是唯一的基準(zhǔn)。第二步?jīng)_銷后核對。沖銷執(zhí)行完重新拉一次余額確認(rèn)發(fā)送方余額回到了執(zhí)行前的水平接收方金額也回退了。如果對不上說明沖銷沒沖干凈先解決這個(gè)問題再往下走。第三步測試運(yùn)行看明細(xì)。測試運(yùn)行會輸出每個(gè)發(fā)送方分給了哪些接收方、各分多少、依據(jù)什么基數(shù)。逐行看重點(diǎn)看三類金額為零的行、金額異常大的行、接收方數(shù)量比預(yù)期少的行。這三類基本對應(yīng)統(tǒng)計(jì)指標(biāo)取數(shù)為零、百分比配置錯(cuò)誤、接收方規(guī)則漏配。第四步正式執(zhí)行后做合計(jì)校驗(yàn)。發(fā)送方余額應(yīng)為零所有接收方分?jǐn)偨痤~之和應(yīng)等于發(fā)送方當(dāng)期發(fā)生額。這兩個(gè)數(shù)對不上差額就是問題金額順著差額去找對應(yīng)的發(fā)送方。第五步橫向?qū)Ρ?。把本期結(jié)果和上期、去年同期的分?jǐn)偨Y(jié)果放在一起看波動超過百分之二三十的接收方挑出來單獨(dú)看基數(shù)。業(yè)務(wù)量波動能解釋的就放過解釋不了的就是配置問題。這套動作做熟了一次完整的校驗(yàn)控制在二十分鐘以內(nèi)比事后花兩天找差異劃算得多。5. 調(diào)優(yōu)實(shí)戰(zhàn)從循環(huán)結(jié)構(gòu)到并行作業(yè)前面講的是算得對這一部分講算得快。分配分?jǐn)偟男阅軉栴}在大型集團(tuán)里非常突出一個(gè)循環(huán)跑幾個(gè)小時(shí)的情況并不少見直接卡住整個(gè)月結(jié)窗口。5.1 循環(huán)結(jié)構(gòu)層面的瘦身性能問題八成出在循環(huán)結(jié)構(gòu)上而不是服務(wù)器。最常見的結(jié)構(gòu)問題是分段過多。每個(gè)分段都是一次獨(dú)立的取數(shù)、計(jì)算、寫憑證過程分段數(shù)量翻倍執(zhí)行時(shí)間基本也翻倍。很多循環(huán)之所以分段多是因?yàn)椴煌杀疽匾貌煌峙浠鶖?shù)又不想在接收方規(guī)則里做復(fù)雜配置就一個(gè)要素一個(gè)分段拆開寫。這種做法在循環(huán)剛建時(shí)清晰運(yùn)行幾年后積累到幾十個(gè)分段性能就崩了。優(yōu)化的思路是歸并。把分配基數(shù)相同的分段合并成一個(gè)接收方規(guī)則用成本中心組來表達(dá)而不是逐個(gè)成本中心列。成本中心組的好處是維護(hù)一次、全局生效新增成本中心時(shí)不用改循環(huán)。這一步做完分段數(shù)量通常能砍掉一半以上。第二個(gè)結(jié)構(gòu)問題是接收方規(guī)則里逐個(gè)列出成本中心而不是用組。一個(gè)分段有一百個(gè)接收方和用五個(gè)成本中心組覆蓋同樣的范圍計(jì)算量差別很大而且前者每次組織調(diào)整都要改循環(huán)后者不用。第三個(gè)是嵌套循環(huán)。有的設(shè)計(jì)里一個(gè)循環(huán)的接收方又是另一個(gè)循環(huán)的發(fā)送方兩個(gè)循環(huán)互相依賴只能靠迭代硬算。這種情況如果能在結(jié)構(gòu)上把依賴關(guān)系理順拆成有明確先后順序的兩段性能提升非常明顯。5.2 執(zhí)行參數(shù)與并行處理的取舍執(zhí)行界面上的參數(shù)對性能的影響比很多人以為的大。測試運(yùn)行和正式運(yùn)行的區(qū)別不只是跑不跑憑證測試運(yùn)行會做完整的計(jì)算但不寫庫正式運(yùn)行寫庫。排查階段用測試運(yùn)行沒問題但正式執(zhí)行時(shí)別為了保險(xiǎn)反復(fù)測試運(yùn)行它的計(jì)算開銷和正式運(yùn)行差不多。后臺執(zhí)行是必須的。前臺執(zhí)行有超時(shí)限制大型循環(huán)跑一半被中斷會留下不完整的憑證清理起來很麻煩。放后臺跑配合作業(yè)監(jiān)控看進(jìn)度出問題也有日志可查。并行處理是最有效的性能手段但不是開了就快。并行進(jìn)程數(shù)受服務(wù)器資源和數(shù)據(jù)庫連接數(shù)限制設(shè)得過高反而會因?yàn)橘Y源爭搶變慢。經(jīng)驗(yàn)值是先設(shè)一個(gè)保守的數(shù)比如四個(gè)進(jìn)程跑一次看耗時(shí)和資源占用再逐步加。加到耗時(shí)不再下降、或者數(shù)據(jù)庫負(fù)載明顯上升就停在前一檔。包大小控制的是每次提交數(shù)據(jù)庫的記錄數(shù)。包太小提交次數(shù)多開銷大包太大單次事務(wù)長鎖持有時(shí)間長容易和別的作業(yè)沖突。這個(gè)參數(shù)沒有通用最優(yōu)值得按實(shí)際數(shù)據(jù)量試。5.3 監(jiān)控、日志與前后對比執(zhí)行過程中的監(jiān)控主要看三個(gè)地方作業(yè)日志看有沒有報(bào)錯(cuò)和警告執(zhí)行清單看每個(gè)分段的處理?xiàng)l數(shù)和金額數(shù)據(jù)庫層面看有沒有長時(shí)間鎖等待。這三塊信息合起來能定位絕大部分性能問題。執(zhí)行清單要養(yǎng)成保存的習(xí)慣。它記錄了本次執(zhí)行的每個(gè)分段、每個(gè)發(fā)送方、每個(gè)接收方的明細(xì)是事后排查的第一手材料。清單在系統(tǒng)里會保留一段時(shí)間但跨月排查時(shí)往往已經(jīng)過期所以執(zhí)行完順手導(dǎo)出存一份成本很低。前后對比這件事我的做法是建一張固定的對照表每次執(zhí)行前填一遍、執(zhí)行后填一遍累計(jì)幾個(gè)月就能看出規(guī)律。哪個(gè)成本中心每個(gè)月都有殘差、哪個(gè)接收方金額波動異常表格上看得清清楚楚比臨時(shí)查報(bào)表高效得多。5.4 影響范圍從成本中心到產(chǎn)品成本與利潤中心成本分配重過賬的影響不止于成本中心報(bào)表它會順著數(shù)據(jù)鏈路往下游傳這一點(diǎn)在設(shè)計(jì)校驗(yàn)方案時(shí)必須考慮。最直接的是成本中心報(bào)表。分配分?jǐn)倛?zhí)行后輔助成本中心的余額應(yīng)歸零基本生產(chǎn)成本的制造費(fèi)用歸集增加。如果重過賬做錯(cuò)了成本中心報(bào)表上的費(fèi)用結(jié)構(gòu)會失真管理層看到的部門費(fèi)用排名可能就是錯(cuò)的。再往下是產(chǎn)品成本。如果成本中心參與了產(chǎn)品成本核算分配后的制造費(fèi)用會進(jìn)入產(chǎn)品成本的間接費(fèi)用池再按作業(yè)類型或者按期間費(fèi)率分到具體產(chǎn)品。這里錯(cuò)一筆單位成本就錯(cuò)一筆而且很難在產(chǎn)品成本層面反查出來源因?yàn)楫a(chǎn)品成本只顯示匯總的間接費(fèi)用不顯示是哪個(gè)成本中心哪次分配帶進(jìn)來的。再往下是利潤中心。成本中心通常掛靠在某個(gè)利潤中心下成本中心費(fèi)用變化會直接反映到利潤中心的損益上。如果分配重過賬導(dǎo)致某個(gè)成本中心多分?jǐn)偭艘淮蠊P對應(yīng)利潤中心的利潤就會被低估而這個(gè)偏差在做利潤中心考核時(shí)會被當(dāng)成經(jīng)營問題來討論。最末端是獲利能力分析。如果分?jǐn)傛溌芬恢蓖ǖ将@利能力段銷售收入和成本的配比關(guān)系會受影響毛利率分析就會出現(xiàn)無法解釋的波動。這一層的影響最隱蔽因?yàn)閺某杀局行牡将@利能力段中間隔了好幾層追起來費(fèi)勁。所以做重過賬的時(shí)候校驗(yàn)范圍要跟著數(shù)據(jù)鏈路走。成本中心報(bào)表對上了只是第一步往下至少要看產(chǎn)品成本有沒有異常波動、利潤中心損益是否合理、獲利能力段的毛利率是否在正常區(qū)間。這三層都過了才算真正做干凈。6. 常見問題速查與踩坑記錄把前面幾部分的內(nèi)容壓縮成一張速查表遇到問題時(shí)可以對著找方向。表里的判斷依據(jù)都是可以直接從系統(tǒng)里拉出來的不用猜。6.1 問題速查表現(xiàn)象最可能的原因快速驗(yàn)證方式處理方向發(fā)送方余額不為零金額較小且每月都有迭代輪次不夠殘差留存把最大迭代次數(shù)臨時(shí)調(diào)高看余額是否縮小按交互比例乘積重算所需輪次一般留兩輪余量發(fā)送方余額不為零金額為整數(shù)且接近某個(gè)百分比接收方百分比總和不到百分之百把接收方規(guī)則的百分比逐個(gè)加總補(bǔ)齊百分比或用成本中心組重配某期接收方金額接近前幾期之和累計(jì)標(biāo)志打開重跑未沖銷對比當(dāng)期分?jǐn)傤~與歷史分?jǐn)傤~之和關(guān)累計(jì)標(biāo)志沖銷歷史結(jié)果后重跑接收方金額逐月階梯上漲重過賬未沖銷結(jié)果疊加查當(dāng)期該循環(huán)執(zhí)行次數(shù)走完整沖銷流程確認(rèn)沖銷憑證生成某接收方金額為零或被跳過統(tǒng)計(jì)指標(biāo)當(dāng)期取數(shù)為零查該接收方對應(yīng)統(tǒng)計(jì)指標(biāo)的實(shí)際值補(bǔ)錄統(tǒng)計(jì)指標(biāo)或設(shè)置零基數(shù)的默認(rèn)處理一個(gè)循環(huán)跑幾小時(shí)分段過多、接收方逐個(gè)列舉數(shù)分段數(shù)量和接收方條目數(shù)歸并分段用成本中心組替代逐個(gè)列舉后臺作業(yè)跑到一半失敗包大小過大導(dǎo)致鎖沖突或資源不足看作業(yè)日志的鎖等待記錄減小包大小錯(cuò)開與其他作業(yè)的執(zhí)行時(shí)間測試運(yùn)行結(jié)果和正式運(yùn)行不一致兩次執(zhí)行之間成本中心余額發(fā)生變化對比兩次執(zhí)行前的余額快照沖銷后重新測試中間不做其他過賬6.2 幾條不太寫在文檔里的經(jīng)驗(yàn)第一條迭代次數(shù)和沖銷流程要一起測。很多人調(diào)迭代次數(shù)時(shí)只看余額歸不歸零不管沖銷結(jié)果迭代調(diào)好了重跑時(shí)又因?yàn)闆]沖銷翻倍。這兩個(gè)動作是一個(gè)整體測試的時(shí)候必須連著重跑兩遍看第二遍的結(jié)果和第一遍是否一致。一致了才算調(diào)通。第二條接收方規(guī)則里的成本中心組盡量不要用動態(tài)組。動態(tài)組會隨著組織架構(gòu)自動納入新成本中心看起來省事但新成本中心剛成立時(shí)往往還沒有業(yè)務(wù)量統(tǒng)計(jì)指標(biāo)為零一納入就會把分?jǐn)偨痤~攤薄導(dǎo)致其他接收方金額異常。用靜態(tài)組新增時(shí)手工加多花五分鐘少一堆麻煩。第三條月結(jié)窗口的前后要留緩沖。分配分?jǐn)偟膱?zhí)行時(shí)間波動很大平時(shí)跑半小時(shí)月結(jié)時(shí)因?yàn)閿?shù)據(jù)量大、并發(fā)高可能跑兩小時(shí)。作業(yè)排程時(shí)不要在分配和后續(xù)的產(chǎn)品成本核算之間卡得太緊留出至少一倍的緩沖時(shí)間。第四條每次重過賬都記一筆。記什么記執(zhí)行時(shí)間、執(zhí)行人、改動內(nèi)容、執(zhí)行前后發(fā)送方余額。這個(gè)記錄用表格維護(hù)就行不需要系統(tǒng)支持。出問題時(shí)回頭看這個(gè)記錄能很快定位是哪次改動引入的偏差。我待過的一個(gè)團(tuán)隊(duì)堅(jiān)持記了半年后來排查一個(gè)跨期差異十分鐘就鎖定到了具體某次改動效率提升非常直觀。第五條別在結(jié)賬當(dāng)天改循環(huán)結(jié)構(gòu)。結(jié)構(gòu)改動的影響面比參數(shù)調(diào)整大得多改完必須完整測一遍沖銷、執(zhí)行、校驗(yàn)的流程。結(jié)賬當(dāng)天時(shí)間不夠測不完整就上線風(fēng)險(xiǎn)很高。結(jié)構(gòu)改動放在月中做有充足時(shí)間驗(yàn)證。6.3 一個(gè)值得反復(fù)看的重過賬標(biāo)準(zhǔn)動作序列最后把重過賬的標(biāo)準(zhǔn)動作整理成一個(gè)可以貼在工位上的序列按順序執(zhí)行不要跳步。導(dǎo)出當(dāng)前發(fā)送方和接收方余額快照存檔。確認(rèn)當(dāng)前期間狀態(tài)確保沒有關(guān)賬或鎖定。執(zhí)行沖銷確認(rèn)沖銷憑證生成重新拉余額確認(rèn)已回退。進(jìn)入測試運(yùn)行逐段看明細(xì)清單重點(diǎn)看零金額行和異常金額行。確認(rèn)累計(jì)標(biāo)志和期間范圍符合本次重跑意圖。后臺正式執(zhí)行保存執(zhí)行日志和清單。校驗(yàn)發(fā)送方余額為零、接收方合計(jì)等于發(fā)送方發(fā)生額。橫向?qū)Ρ壬掀诤腿ツ晖谔舫霾▌映^閾值的接收方單獨(dú)核查。往下游看產(chǎn)品成本、利潤中心損益、獲利能力段毛利率三層是否合理。記錄本次重過賬的執(zhí)行信息和改動內(nèi)容。這個(gè)序列看著長實(shí)際做下來熟練了二十分鐘能走完。真正的價(jià)值不在流程本身而在于它把憑感覺排查變成了按步驟驗(yàn)證出了問題有據(jù)可查不會越改越亂。我個(gè)人在實(shí)際操作中的體會是成本分配重過賬這件事最貴的成本從來不是執(zhí)行時(shí)間而是改錯(cuò)之后的返工。把迭代和累計(jì)這兩個(gè)機(jī)制吃透把沖銷和校驗(yàn)做成固定動作剩下的參數(shù)調(diào)整都是在這個(gè)基礎(chǔ)上的微調(diào)。真正難的不是記住哪個(gè)按鈕在哪而是在結(jié)果不對的時(shí)候能第一時(shí)間判斷出問題是出在收斂上還是出在口徑上。這個(gè)判斷力沒有捷徑只能靠一次次完整走完校驗(yàn)流程積累出來。