Бухгалтерия с двойной записью для программистов

Фото на обложке: Ibrahim Boran на Unsplash


Это та статья, о существовании которой я мечтал, когда мне нужно было поддерживать бухгалтерские функции. Бухгалтерия с двойной записью может показаться эзотерической и неоправданно сложной, но на самом деле она описывает простую структуру для ведения корректной и проверяемой записи изменений состояния.

Это не практическое руководство о том, как на самом деле вести современный бухгалтерский учет. В нем рассматриваются только некоторые механические аспекты бухгалтерского учета, а не практические вопросы работы.

Определяющие слова

Кредиты и Дебеты. Забудьте все, что вы думаете, что знаете о том, что эти слова «означают». Они не являются «положительными» или «отрицательными». Ни «хороший», ни «плохой». С таким же успехом их можно назвать «левый» и «правый». Они ничего не «означают». Они лишь зеркальное отражение друг друга. Слова им даны только для того, чтобы узнать их хиральность.

Далее, счета. Запутанное слово из тысячелетней истории бухгалтерского учета. Но я прощу их, называть вещи сложно. Если бы программист изобретал бухгалтерский учет, он, вероятно, назвал бы его типом, или категорией, или коллекцией. Счет — это просто ведро, дающее имя некоторым деньгам (отличая их от других денег, которые учитываются… о, подождите, может, поэтому они и называются счетами… кто бы мог подумать).

Счета бывают двух видов: Кредитовые и Дебетовые. Описывается, каким образом следует складывать все кредиты и дебеты по счету. Счета на основе кредита вычитают сумму дебетов из суммы кредитов («Кредиты — Дебеты»). В свою очередь, счета, основанные на дебете, вычитают сумму кредитов из суммы дебетов («Дебет — Кредит»). В практике бухгалтерского учета бухгалтеры часто подразделяют эти два вида счетов на ~5 основных счетов, которые подставляются в бухгалтерское уравнение. По общему правилу, счета, относящиеся к активам, являются дебетовыми, а счета, относящиеся к обязательствам, — кредитовыми. Опять же, эта статья не предназначена для углубления в бухгалтерскую практику; для сегодняшнего дня достаточно знать фундаментальную механику.

Подведем итоги:

  • Кредит: противоположность дебета
  • Дебет: Противоположность кредита
  • Счет: Ярлык для определенных Кредитов & Дебеты должны суммироваться вместе
  • Счет на основе кредита: Счет, общая сумма которого = Кредиты — Дебеты
  • Дебетовый счет: Счет, общая сумма которого = Дебет — Кредит.

Бухгалтерия с двойной записью стала немного более доступной. Слегка. Три слова в пяти понятиях составляют наше ядро. Но теперь давайте на деле использовать эти вещи…

Бухгалтерия с двойным входом — это НЕ таблица

Откройте любую книгу по бухгалтерскому учету или вводную статью в блоге. В самом начале текста будут таблицы, выглядящие примерно так:

Счет Кредит Дебет
Денежные средства 42
Кредит 42

Именно поэтому бухгалтерский учет с двойной записью получил свое название: для записи одного действия требуется две записи. Это, возможно, самый неинтуитивный способ представления финансовой деятельности.

Непрофессиональное описание выглядит так: $42 было взято из «Наличных» и передано (или выплачено) в «Кредит». К и От… хммм, давайте перепишем эту таблицу:

Со счета К счету Сумма
Наличные Кредит 42

Этот формат намекает на новый способ освободить наше мышление от мышления, основанного на табличном учете. Что если мы будем думать о нашем учете как о графике?

Бухгалтерия с двойной записью — это график

Пусть каждый счет будет узлом, а каждая пара кредит/дебет — одной стрелкой (она же направленное ребро; кредиты/дебеты начинают/заканчивают «стрелку» соответственно) с указанием суммы (она же вес) и каждого счета (она же узел). Вот как будет выглядеть этот взвешенный направленный граф:

Теперь вы, возможно, слышали правило бухгалтерского учета по принципу «двойной записи»: «Каждый кредит должен иметь дебет, а каждый дебет должен иметь кредит». Очевидно, что стрелка всегда имеет начало и конец (или «к» и «от»). Таким образом, графическая форма бухгалтерского учета по методу двойной записи делает следование правилам неизбежным.

Но как мы представляем внешнее движение денег? В конце концов, мы получаем деньги за свою работу. Не только это, но я заработал целых пять долларов на этом блоге. Давайте на мгновение ослабим это правило и позволим деньгам появиться из ничего на нашем денежном счете.

Это работает, но здесь есть некоторый бесполезный недостаток информации. Если мы переведем этот график в таблицу, мы можем обозначить счет «от» этих двух новых действий как null.

От аккаунта К счету Сумма
Наличные Кредит 42
null Наличные 100
null Наличные 1000

Однако мы не обязаны обозначать его как null. В теории графов мы можем обозначить null как угодно, и график будет эквивалентным. Выбрав что-то достаточно неопределенное, мы можем нарисовать эквивалентный график нашей ситуации, выглядящий следующим образом:

Хотя эти счета не особенно полезны (почему я получил $1000? почему $100?), мы ответили на вопрос, как представить деньги, перемещающиеся к внешним источникам и от них. Просто создайте новый узел (он же счет)! Вместо одного счета с расплывчатым названием «Внешний» сделайте по одному для каждого источника, который нам нужно учитывать. И чтобы завершить наш пример, купите немного еды и отложите немного денег на потом:

Представление внешних сторон как собственных узлов дает некоторые интересные преимущества: Если сложить счета работодателя и подработок, то получится общий доход, а если рассматривать их по отдельности, то можно понять, где больше платят. То же самое касается расходов (McTaco King выглядит немного переборщившим с посещением); а также внутреннего денежного маневрирования. Хранение фонда на случай чрезвычайных ситуаций, например, можно рассматривать как «заем», который «погашается», когда фонд используется и восстанавливается; графически нет никакой разницы между займом с «внутреннего» счета и «внешнего» счета (кроме процентов; я дал себе неплохую сделку).

Но все равно храните книгу с двойной записью в таблице

Хотя полезно думать о нашей бухгалтерии как о графе, не будет полезно рассматривать нашу бухгалтерию как граф через год, когда у нас будет 24 ребра между Employer и Cash и 200 между Cash и McTaco King (не судите меня).

Как насчет того, чтобы перевести наш график в табличное представление и посмотреть, что из этого получится:

Со счета К счету Сумма
Наличные Кредит 42
Работодатель Наличные 1000
Подработка Наличные 100
Наличные McTacoKing 12
Наличные Сбережения 50

Будучи таблицей, эти данные можно легко записать в SQL (или CSV, или Excel). Но этот формат требует небольшой хитрости, чтобы правильно сгруппировать и сложить значения счетов. Если мы вернемся к «классической» форме таблицы:

Счет Кредит Дебет
Денежные средства 42
Кредит 42
Работодатель 1000
Наличные 1000
Подработка 100
Наличные 100
Наличные 12
МакТако Кинг 12
Наличные 50
Сбережения 50

Мы можем легко суммировать счета этой таблицы, используя либо sum(Credit) - sum(Debit), либо sum(Debit) - sum(Credit) и группировку по счету. Но мы променяли более легкое чтение того, что сделало одно действие, на две строки вместо одной для этого более легкого агрегирования.

Кроличья нора: если вам нужен псевдо-SQL о том, как эта вторая таблица может быть сделана из первой, то, вероятно, это будет выглядеть следующим образом:

SELECT
   FromAccount AS Account,
   Amount AS Credit,
   NULL AS Debit
FROM actions

UNION

SELECT
  ToAccount AS Account,
  NULL AS Credit,
  Amount AS Debit
FROM actions

Войти в полноэкранный режим Выйти из полноэкранного режима

А какие хитрые запросы делают эти две таблицы для агрегации? Рассмотрим эти два запроса, какой из них проще?

-- To aggregate the "classic" table for the Cash account
SELECT
  SUM(COALESCE(Debit, 0)) - SUM(COALESCE(Credit, 0)) AS CashTotal
FROM actions
WHERE Account = 'Cash'

-- To aggregate the former table for the Cash account
SELECT
  SUM(
    CASE
      WHEN ToAccount = 'Cash' THEN Amount
      ELSE -Amount
    END
  ) AS CashTotal
FROM actions
WHERE ToAccount = 'Cash'
OR FromAccount = 'Cash'

Войти в полноэкранный режим Выйти из полноэкранного режима

В каком формате должна хранить их ваша финансовая система? Ответ (как и на многие другие вопросы) зависит от ситуации. Но красота наших современных вычислительных машин означает, что нам не нужно выбирать! Мы можем хранить нашу историю в одном формате и автоматически преобразовывать ее в любой другой, когда нам это удобно.

Зачем вообще использовать бухгалтерский учет с двойной записью?

Вы прочитали всю эту статью и теперь лучше понимаете, что такое ведение бухгалтерского учета с двойной записью, но я еще не говорил о том, зачем нам это нужно. Конечно, нам нужно хранить историю, чтобы отчитываться о наших финансах и быть уверенными, что мы не разоримся, но почему бы просто не хранить моментальный снимок стоимости каждого счета при каждом изменении? Мы даже запишем, какая внешняя вещь произвела изменение, так что все должно быть в порядке, и мы сможем ответить на все вопросы нашего бухгалтера, верно? Я здесь, чтобы сказать вам: не делайте этого. Пожалуйста, не делайте этого. Бухгалтерия с двойной записью была независимо изобретена и переизобретена во многих культурах на протяжении 2000 лет! Те изобретатели нашли множество преимуществ такого способа ведения записей:

  1. Двойная запись защищает от неправильного письма
  2. Двойные реквизиты защищают от неправильного чтения
  3. Двойные знаки защищают от арифметических ошибок
  4. Двойные реестры защищают от поврежденных или неполных записей.

Но все эти преимущества, как мне кажется, в основном стерты современными базами данных и компьютерами; автоматические контрольные суммы и алгоритмы целостности данных, автоматические вычисления, которые никогда не ошибаются и не делают ошибок со встроенными кодами коррекции ошибок, машины, считающие наличные, машины, читающие чеки, машины, напрямую сообщающие друг другу о финансовых действиях. Но я вижу преимущества, которые все еще делают ведение учета таким способом хорошей идеей:

  1. Исправление исторических ошибок
  2. Гипотетические альтернативные истории
  3. Гипотетическое будущее
  4. Гибкие возможности хранения и миграции

Срочная новость: люди все еще совершают ошибки. Я гарантирую, что однажды бухгалтеры придут к вам и скажут, что они что-то неправильно записали, и теперь им нужно это изменить, а исправление должно быть в прошлом. Что мы будем делать, если на каждом этапе мы сохраняли только снимок значения счета? Конечно, мы вставим одно новое значение в прошлом, но это сделает всю последующую историю неверной! Тогда нам придется исправлять все последующие; не забывайте, что эти счета живые и постоянно обновляются. Удачи вам в этом.

В системе двойной записи решение этой проблемы — детская забава: найдите ошибочное действие, вставьте другое действие с прямо противоположными «к» и «от» (или «кредит» и «дебет») и отметьте это вставленное действие как произошедшее в то же время, что и первоначальное. Пуф, как будто ошибки никогда не было (и все же, когда нас спросят, мы можем подтвердить, что ошибка действительно была допущена и исправлена соответствующим образом).

А благодаря тому, что в ней никогда не используется мутация («обновления» выполняются с помощью вставки новых записей), ведение бухгалтерии с двойной записью делает перемещение наших данных простым. У вас есть SQL и вы хотите NoSQL? Просто скопируйте строки в документы и готово. Что-то изменилось после миграции? Просто проверьте наличие новых записей и скопируйте их. Экспорт в Excel; нет проблем. Даже текстовый файл с добавленными к нему строками удовлетворяет требованиям наших потребностей в хранении данных.

Благодаря тому, что наши данные легко переносятся, мы можем копировать их в среду с гипотетическими записями для проверки исправления истории или тестирования потенциального будущего. Все это стало возможным благодаря системе Double-entry. А тех, кто говорит «просто добавьте X» или «измените Y» в историю снимков, поздравляю, вы последние в длинной очереди на изобретение двойной бухгалтерии. Но продолжайте, оставьте этот комментарий, как будто вам нужно мое разрешение.

(Пссс, если вы хотите практиковать эти принципы бухгалтерского учета, я принимаю пожертвования в моем магазине Buy Me a Coffee. Вот небольшой график того, что происходит: [Вы]-$4->[Я])

Дополнительное чтение

  • Бухгалтерский учет для компьютерных ученых
  • О бухгалтерском учете с двойной записью: Математическая обработка
  • Википедия: Дебеты и кредиты
  • Википедия: Подход на основе бухгалтерских уравнений
  • Википедия: Бухгалтерское уравнение
  • Википедия: История бухгалтерского учёта с двойной записью

Оцените статью
Procodings.ru
Добавить комментарий