6. Инвентаризация и учет

Last modified: 07 May 2025

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

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

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

Первый шаблон — это счет (6.1). На счете хранятся ценные вещи — товары или деньги, — которые можно добавлять или удалять только с помощью записей (проводок). Они обеспечивают историю всех изменений на счете. Когда мы используем счет для записи истории изменений ценных вещей, важно следить за тем, чтобы предметы не потерялись. Транзакции (6.2) добавляют еще одну степень проверяемости, связывая проводки вместе. В транзакции предметы, снятые с одного счета, должны быть помещены на другой; предметы не могут быть созданы из ниоткуда или уничтожены.

Существует два вида транзакций: Простая (двухуровневая) транзакция — операция перемещает сумму с одного счета на другой. Сложная транзакция может иметь проводки для нескольких счетов, пока транзакция в целом сбалансирована по приходу\расходу, т.е. сумма всех проводок равна нулю.

Счета можно объединять в группы с помощью суммарного счета (6.3), который применяет большинство функций отчетности к группам счетов. Иногда нам нужно сделать записи по счетам, которые не предназначены для поддержания баланса. С этой задачей справляется счет-памятка (6.4).

Счет может содержать фиксированные правила, определяющие порядок перевода сумм между счетами. Правила проводок (6.5) позволяют нам создавать активные сети счетов, которые обновляют друг друга и отражают бизнес-правила. Для этого экземпляры правил проводок должны иметь свои собственные исполняемые методы, и это требование вводит важную концепцию моделирования метода индивидуального экземпляра (6.6). Методы индивидуальных экземпляров могут быть реализованы с помощью: некоторой комбинации одного подтипа, шаблона стратегии, внутреннего оператора case, интерпретатора и параметризованного метода.

Шаблон выполнения правил проводки (6.7) описывает способы запуска правил проводки:

  • во время создания транзакции;

  • путем запроса учетной записи на обработку ее правил;

  • путем запроса на срабатывание правила проводки;

  • или путем запроса учетной записи на обновление, что приводит к срабатыванию связанных счетов обратном порядке (не от «головы» — запрошенного счета, а с низовых узлов (счетов) которые связанны с текущим счетом правилами проводки, т.е. обновлениями).

Чтобы использовать правила проводок со многими счетами, нам нужен способ определения правил проводок для многих счетов (6.8). Один из способов — использовать уровень знаний, в этом случае правила проводок определяются для типов счетов. Другой способ — связать правила проводок с суммарными счетами.

В бухгалтерской системе различным объектам нужны подмножества записей по счету и их остатков, и для того, и для другого требуется шаблон выбора записей (6.9). Этот шаблон полезен, когда мы хотим выбрать объекты из многозначного отображения (различных типов счетов). Доступные опции — вернуть весь набор и позволить клиенту сделать выборку, добавить дополнительные операции к счету или использовать фильтр счета.

Мы можем разделить большие сети правил проводок на группы с помощью шаблона бухгалтерской практики (6.10). В длинных расчетах нам часто приходится возвращаться назад, чтобы понять, почему те или иные операции привели к текущей ситуации; тогда нам нужно использовать схему источников записи (6.11).

В балансовых отчетах и отчетах о прибыли (6.12) различают счета для инвентаризации и для расходных материалов. Люди могут видеть один и тот же счет несколько иначе; например, то, как я вижу свой банковский счет, вероятно, схоже с тем, как его видит мой банк. Один из них является корреспондентским счетом (6.13) другого.

Полученные шаблоны достаточно абстрактны; для применения их в повседневной практике в конкретных случаях требуется специализированная модель счета (6.14). Такие счета разрабатываются путем подтипизации общих шаблонов учета.

Последний шаблон в этой главе описывает учет проводок по нескольким счетам (6.15). Этот шаблон полезен, когда существует более одного способа отразить в отчете следы проводок. Два альтернативных способа — это использование проводок или использование производных счетов. Мы можем использовать производные счета вместо шаблонов учета, если нам нужны отчеты поведения счетов, но не возможности балансировки и аудита.

Эти модели — результат идей, возникших в ходе нескольких проектов. Они возникли в ходе работы над системой обслуживания клиентов для американской коммунальной компании и получили дальнейшее развитие при изучении структуры бухгалтерского учета для международной телекоммуникационной компании. Кроме того, в моделях использован опыт недавней разработки системы расчета заработной платы для крупной американской производственной компании.