Skip to content

Beancount言語構文

Beancount言語の構文をまとめるが、網羅するのではなく覚えておいたほうが良いことだけを抜粋する。公式ドキュメントはBeancount Language Syntaxにある。

Beancountはファイルを読み込んだ後で、特定の順番にソートするので、日付が前後していても問題ない。ただしこれに関連して、ソートの順序には特徴があるので以下に同日で優先度が高い(早く処理される)順に並べる。

  1. open
  2. balance
  3. これら以外のディレクティブ
  4. txn
  5. close

これはbeancount/core/data.py:695,705で書かれているコメントを参照した。

open ディレクティブでBeancountの勘定科目を設定する。日本の場合はあらかじめ決まった勘定科目しか使えないらしいが、Beancountではルートの項目以外はなんでもいい様子。

txn ディレクティブで取引の記録を記述する。txn は省略可能なので、一般的にはフラグを使って txn は省略することが多い。

2024-10-15 ! "ツクモex" "PCパーツ"
Liabilities:Amex:CreditCard 45,000 JPY
Expenses:Shopping 45,000 JPY
2024-10-18 * "リバティ長岡" "食材"
Expenses:Food:Groceries 1,300 JPY
Assets:Cash -1,300 JPY

これを一般化すると次のようなルールとなる。

YYYY-MM-DD [txn|Flags] [[Payee] Narrattion]
[[key: value] ...]
[Flags] Account Amount

トランザクションの各行にはメタデータで id を与えられるらしいので、インポートした場合に重複があるかどうかの判定はこれを使うといいのだろう。

取引記録では価格(Amount)が必須となっている。Amount の構文ではひとつの数値を書くだけではなく演算も行えるが、それ以外にも通貨の両替を伴う場合は @ を使って「支払った通貨1ユニット」の金額(Price)を与えたり、@@ で「支払った価格の合計」金額(Cost)を与えることも可能になっている。

2,996 - 221 JPY
3000 USD @ 158 JPY
3000 USD @@ 475,365 JPY

なんだけど、内部的に @@@ と解釈されるようで、4.40 USD @@ 729 JPY とすると 4.40 USD @ 165.6818.. となって端数が生まれてしまった。この場合は {} でも同じ。

4.40 USD { 729 JPY }

端数は金額の有効桁数で調整するらしいが、理解できていない。

原価は {} で指示するらしいが、たぶん使わない。

txn の他にもいくつかあるが、主に使うのはこの辺り。

  • balance
  • pad
  • price

padbalance と合わせて使う。pad 直後に balance があれば、その値で埋めるらしい。ただし pad記述した日付に 埋め合わせるための金額を txn で生成するので、balance と同じ日付にすると