Метаданные как код
Все справочники, документы, регистры и отчёты описываются Python-dataclass. Платформа собирает SQL-схему, формы и API из этих описаний — никаких ручных миграций для прикладных объектов.
Открытая ERP-система на Python/FastAPI: торговля, склад, взаиморасчёты, деньги, отчёты. Идемпотентное проведение документов, регистры накопления, мультиорганизационность и расширяемая архитектура через модули.
Малому бизнесу нужна система, которая связывает склад, продажи, закупки и деньги в единый контур. Не таблицы Excel и не тяжёлые корпоративные системы, а рабочий инструмент, где проведение документа автоматически обновляет остатки, взаиморасчёты и денежные позиции.
Архитектурно это потребовало решить несколько задач: спроектировать идемпотентное проведение документов, чтобы повторное проведение не дублировало движения; обеспечить контроль отрицательных остатков на складе и по денежным счетам; реализовать мультиорганизационность, где каждая запись привязана к организации; и сделать систему расширяемой через модули без переписывания ядра.
Open ERP — это открытая веб-система учёта, которую я спроектировал и разработал с нуля: торговая и складская подсистема, взаиморасчёты, денежные средства, цены и валюты, печатные формы, импорт/экспорт CSV/XLSX. Проект построен вокруг четырёх ключевых понятий: метаданные, документы, регистры и идемпотентное проведение. Все прикладные объекты описываются в Python-коде, а платформа по этим описаниям создаёт таблицы, отрисовывает формы, проверяет права и предоставляет API отчётов.
Система написана на Python (FastAPI + SQLAlchemy + Jinja2), работает на SQLite для быстрого старта, но поддерживает PostgreSQL для масштабирования. Интерфейс — серверный рендеринг с Alpine.js для динамических табличных частей. Проект с открытым исходным кодом — развивается и дополняется. Исходники доступны на GitHub.
Четырёхслойная модель: метаданные → документы → регистры → проведение. Каждый слой изолирован и тестируем. Внешний веб-слой — FastAPI с серверным рендерингом и Alpine.js для динамических форм.
Все справочники, документы, регистры и отчёты описываются Python-dataclass. Платформа собирает SQL-схему, формы и API из этих описаний — никаких ручных миграций для прикладных объектов.
Повторное проведение документа удаляет старые движения и создаёт новые. Отмена — удаляет. Закрытые периоды блокируют изменения. Это гарантирует консистентность регистров при любых сценариях.
Помесячные итоги + движения текущего месяца = остаток на дату за O(1) к началу месяца. Пересчёт инкрементальный. Проверка целостности через verify_totals — сравнение движений и итогов.
Денежные счета, статьи ДДС, кассовые и банковские платежи, контроль доступного остатка по счету и валюте. Регистр cash агрегирует по money_account_id и currency_id.
Каждая прикладная запись имеет organization_id. Роли, разрешения, bcrypt-аутентификация, подписанные сессии. Аудит и журнал операций для каждой значимой операции.
Модуль trade регистрирует обработчики проведения, отчёты и печатные формы. Новый модуль — это Python-пакет с функцией register(), который автоматически подключается при запуске.
Система покрывает полный цикл: от закупки до продажи, от склада до денег, от документа до отчёта.
технологический стек
Современный async-фреймворк, SQLAlchemy ORM, Jinja2-шаблоны. SQLite для старта, PostgreSQL для продакшена.
документов с проведением
Поступление, реализация, перемещение, корректировка, заказ покупателя, кассовые и банковские платежи — все с идемпотентным проведением.
накопления + 2 сведений
Товары на складах, взаиморасчёты, денежные средства. Цены и курсы валют как регистры сведений.
ключевых сценариев тестами
pytest проверяет проведение, отмену, пересчёт итогов, контроль отрицательных остатков и консистентность регистров.