株主資本等変動計算書が手入力なのはなぜか、そしてChrome拡張で自動化する

開発misc-dev

ヘッダーに「仕訳帳」を足すだけのはずだった

自作の Chrome 拡張で、クラウド会計(会計ソフトA)の全ページのヘッダーに明細一覧と月次推移表の2つのボタンを出している。 普段使うのはこの2つだけだと判断して、他の導線は9月8日に全部やめたばかりだった。

その判断が少し外れていた。 仕訳帳へ直行したい場面が思ったよりずっと多い。

やることは1つ足すだけだ。 MF_home画面/content.jsNAV_BUTTONS に1行足す。 URL の cti を引き継ぎ、仕訳帳を開いているときは他と同じく押せない表示にする。 ここまでは Claude Code に書かせて、すぐ終わった。

終わらなかったのは、そのあとだった。

拡張をリロードしても、ボタンが増えない

拡張をリロードして、開いていたタブを再読み込みした。 ボタンは2つのままだった。

manifest の version を上げてからリロードした。変わらない。 拡張を無効にして、有効に戻した。変わらない。 dev-reload の合図(mfc:reload-extension)を送った。何も起きない。

新しいタブで同じページを開いたら、3つ目のボタンがあっさり出た。

content script はレンダラープロセス単位で生きていて、リロード前から開いていたタブには古いスクリプトが残り続ける。 version を変えても、無効にして戻しても、そのタブの中身は入れ替わらない。 リロード前から開いていたタブは拡張のコンテキストを失っているので、こちらが合図を送っても何も起きない。

近いことは CLAUDE.md に1行あった。 拡張を無効にしても開いているタブの content script は止まらない、という9月10日のメモだ。 ただしそれは「無効にしたのに重い」を切り分けたときの文脈で書いてあって、リロードしても表示が変わらない話とはつながっていなかった。 今回の形で書き足してもらってから、学習ゲートはスキップしてコミットした。

なぜ株主資本等変動計算書は手入力なのか

10時半すぎ、年次推移表のページを開いていた。

このページは年度が列に並んでいる。 貸借対照表と損益計算書はこの並びで出せるとして、株主資本等変動計算書も作れないだろうか。 配当を入れてあるので、純資産が何によって増えて、何によって減ったのかを年ごとに並べて見たかった。

決算書のほうに株主資本等変動計算書がある。 そちらの API を持ってくればいい。 そう思って画面を開いた。

変動事由の欄が、全部手入力だった。

期首と期末と当期純利益は入っている。 配当も、利益準備金の積立ても、自分で打ち込む欄になっている。

なぜ自動で作っていないのか、としばらく考えた。 他社のクラウド会計も同じだと分かって、ようやく腑に落ちた。

仕訳には「これは配当だ」と書いてある欄がない。 残っているのは、どの科目からどの科目へいくら動いたか、だけだ。 事由を補助科目で持っている事業者もいれば、持っていない事業者もいる。 どちらでも動くソフトを作るなら、事由の欄を空けて人に聞くのがいちばん確実になる。

逆に言えば、仕訳の形さえ決まっていれば、事由は機械で決められる。 そこを確かめたくなって、コードベースと仕訳の持ち方を調べてもらい、計画書を書かせた。

事由を決める規則と、その穴

計画の中心は、事由が「純資産科目 × 相手科目」の組で決まるという見立てだった。

繰越利益剰余金が減って未払配当金が増えれば、剰余金の配当。 繰越利益剰余金が減って利益準備金が増えれば、利益準備金の積立て。 この対応を型の表として持ち、仕訳を照らす。

期首と期末は貸借対照表から取れる。 事由が全部ついたなら、差し引きの残りはゼロになるはずだ。

Codex レビューを2回通した。

1回目で2点返ってきた。

1つめ。純資産どうしを先に相殺する規則を置くと、自己株式の処分差損(借方が預金とその他の資本剰余金、貸方が自己株式)が、消却と処分に分かれて誤分類される。 2つめ。タグは仕訳1本に1つしか付かないので、1本の中に2つの事由がある仕訳では配分を指定できない。 タグを型より優先させると、積立てまで配当に飲み込まれる。

そして、どちらも残差では検出できない。 誤分類しても金額の合計は合うので、残差はゼロのままになる。

この2点目が効いた。 残差ゼロを正しさの証明のように扱っていたが、残差が検出するのは漏れだけで、取り違えは検出しない。

規則を「行を対にして消す」から「仕訳全体の形を型の表に照らし、一致がちょうど1つのときだけ確定する」に改めさせた。 一致が0個でも2個以上でも、推定はせず「事由未確定」に残す。 処分差損の反例をテストに足して、2回目で承認になった。

判断が要る4点

残った判断は4つあった。 計画書 HTML に3択ボタンを埋め込んで、決裁フォームを立ててもらった。

  • 表示の形:推移形式だけにする(行が科目と事由、列が年度)
  • 型で決まらない事由の明示:仕訳のタグ SS:事由名 で示す。1本の仕訳は1事由に限る
  • 決算書への書き戻し:当期だけ、ボタンと差分確認つきで書き戻す
  • 過年度の仕訳の取り方:消込の年度キャッシュを流用し、取得ボタンで年度を切り替える

4件とも推奨案をそのまま選んだ。 自由記述は1件も書かなかった。 各項目に、選ぶと何がどう変わるかが書いてあったので、迷う余地がなかった。

「明日やる」と決めた直後に撤回した

ここで切り上げることにした。 キリのいいところで終わりにして、翌日の Google タスクに登録してもらった。 翌朝6時から始めるつもりだった。

登録が終わった直後に、気が変わった。

計画書は書けている。 決裁も済んでいる。 明日の朝の自分が、今と同じ解像度でこれを読み直せるとは思えなかった。

セッション切り替えのプロンプトだけ出してもらって、そのまま実装に入った。 Google タスクへの登録のほうは、もう済んでしまっていた。

当期の仕訳から事由を確定させる

Phase 0 では仕訳を読まない。 期首と期末の差額だけで組む。

貸借対照表の純資産の行から期首と期末と当期純利益を拾って、表の枠だけ作る。 ここで引っかかったのが、繰越利益剰余金と「(うち当期純利益)」の2行だった。 他の科目には data-encrypted-id が振られているのに、この2行には id もリンクも無い。 ラベルの文字列で拾うしかなく、会計ソフト側が文言を変えれば読めなくなる。 読めなかった年度は表ごと「読めません」と出し、黙ってゼロにはしない方針にした。

Phase 1 で当期の仕訳を読む。 ledger_entries から純資産に触れる仕訳番号を拾い、journals?numbers= でその仕訳だけを取る。

実機で確かめた。 検証用の2026年度に、配当と積立てが1本にまとまった仕訳(No.392)がある。 これが「剰余金の配当 −632,000」と「利益準備金の積立て ±63,200」に分かれ、残差がゼロになった。

机上の指摘として受け取った「1本に2事由」が、手元のデータにそのまま入っていた。

過年度と、決算書への書き戻し

過年度の仕訳は、年度を切り替えないと読めない。

消込の機能が年度ごとの仕訳をキャッシュしているので、そこに sourceTypetagNames を足して流用した。 取得ボタンを押すと、年度を切り替え、保存し、元の年度に戻す。

2021年から2025年まで取ってみた。 事由未確定として残ったのは、2022年の −29,091 だけだった。 繰越の漏れだ。

最後に、決算書への書き戻しをやらせた。

手で打ち込むのではなく、拡張から送っている。 /ss_datas の表を読んで、当期の確定した事由を「新規」「上書き」「同じ」に分けて見せる。 行の無い事由は POST /ss_items で作り、値は各セルのフォームと同じ POST /ss_datas(既存は PUT)で1件ずつ送る。 送る前と後で current_term を見て、年度が変わっていたら止める。 上書きはチェックを入れないと送れないようにした。

検証用の2026年度で3件を書き戻したら、決算書に出ていた「金額が不一致」の表示が消えた。

決算のたびに手で打ち込んでいた欄が、仕訳から埋まった。

今日わかったこと

  • 合計が合うことを正しさの根拠にしていた。残差ゼロが拾うのは漏れだけで、取り違えはすり抜ける
  • 「自動で作れない」の正体は、たいてい「そのデータに書いていない」だった。株主資本等変動計算書の事由は、仕訳のどこにも書かれていない
  • 拡張のリロードで表示が変わらないときは、まず新しいタブで開いて切り分ける。version を上げても無効化しても、開きっぱなしのタブには効かない
  • 計画が固まった直後は、寝かせるより着手したほうが早い。明日の自分は、今日の自分ほど文脈を持っていない
#Chrome拡張#株主資本等変動計算書#クラウド会計#仕訳#Codex