Система учёта
основных средств «ОСнова»
Здесь собрано всё, что нужно знать о проекте: как его запустить, что умеет каждый экран, на чём он написан, как устроена база данных и как система считает амортизацию. Читать можно по порядку или сразу переходить к нужному разделу через меню слева.
Коротко о предметной области
Тема: «Проектирование системы автоматизации учёта поступления и выбытия основных средств на предприятии». Вымышленное предприятие ООО «Кедр-Мебель» (Пермь) делает корпусную мебель: у него станки, здания, транспорт, компьютеры — 47 объектов в пяти подразделениях, история с 2020 года. Бухгалтер принимает объекты к учёту, перемещает между цехами, списывает и каждый месяц начисляет амортизацию. Раньше всё это считалось в Excel, а акты заполнялись в Word. Система «ОСнова» сама считает амортизацию, печатает документы по формам ОС-1, ОС-2, ОС-4 и не даёт сделать типичные ошибки.
Запуск за пять шагов
Программировать ничего не нужно. Всё запускается двойным щелчком по файлу, а база данных заполняется сама.
Установить Docker Desktop
Docker — это программа, которая запускает проект в «контейнерах»: изолированных коробках, где уже установлено всё нужное. Скачать бесплатно с официального сайта docker.com (Docker Desktop for Windows), установить и перезагрузить компьютер, если попросит.
Распаковать архив
Распакуйте osnova.zip в папку, в пути к которой нет русских букв и пробелов, например C:\osnova.
Дважды щёлкнуть «Запустить.bat»
Файл лежит в корне папки проекта. Он проверит, что Docker запущен, соберёт и запустит систему и сам откроет браузер. Первый запуск занимает 5–10 минут и требует интернета: Docker скачивает всё нужное. Потом — несколько секунд.
Или то же самое командой
Откройте папку проекта в проводнике, правой кнопкой по пустому месту → «Открыть в Терминале», вставьте команду и нажмите Enter:
В этом случае окно терминала не закрывайте: пока оно открыто, система работает.
Открыть в браузере
| Логин | Пароль | Роль |
|---|---|---|
| buh | buh2026 | Бухгалтер по учёту ОС — Мельникова Ольга Викторовна |
| glavbuh | glavbuh2026 | Главный бухгалтер — Зуев Павел Андреевич |
База данных через phpMyAdmin: http://localhost:8081, база osnova.
Остановить
Дважды щёлкнуть Остановить.bat. Или в Docker Desktop → Containers → fixed-assets → кнопка «стоп».
Запустить снова
Снова Запустить.bat. Второй раз ничего не скачивается, система стартует за несколько секунд.
Вернуть демо-данные
Дважды щёлкнуть Сбросить данные.bat. Всё добавленное удалится, база станет как после первого запуска.
Что умеет каждый экран
Навигация — меню слева: «Учёт» (главная, основные средства, амортизация), «Документы» (поступление, перемещение, списание, журнал) и «Настройки» (справочники). Наверху — открытый период, переключатель темы, внизу меню — пользователь и кнопка выхода. Скриншоты меняются вместе с темой этой страницы, по клику открываются крупно.
Что показывать на защите (5–7 минут)
Сбросить данные.bat, чтобы данные были чистые. Тему лучше выбрать светлую: на проекторе она читается лучше. В браузере нажать F11, чтобы окно было на весь экран.
Вход и главная · 1 минута
Щёлкнуть строчку buh / buh2026 под формой → «Войти». На главной показать объекты в эксплуатации, стоимость, амортизацию за год, графики по группам и подразделениям. Обратить внимание на жёлтое предупреждение про непроведённый акт списания.
«Система ведёт учёт основных средств: принимает к учёту, перемещает, списывает и каждый месяц сама считает амортизацию».
Реестр и карточка · 1 минута
«Основные средства» → в поиске набрать ФР-3200 → открыть станок. Показать реквизиты и график: сплошная линия — уже начислено, пунктир — прогноз. Станок амортизируется способом уменьшаемого остатка, поэтому в первые годы стоимость падает быстрее.
Поступление · 1,5 минуты
«Поступление»: станок кромкооблицовочный КО-600, 5-я группа, срок 96 мес., стоимость 1 450 000, дата 15.09.2026, раскройный цех, МОЛ Кондратьев, поставщик СтанкоПромСнаб → «Принять к учёту» → «Печать акта ОС-1».
«Система проверяет, что стоимость не меньше 100 тысяч и срок подходит под группу. Справа сразу расчёт: 1 450 000 / 96 = 15 104 ₽ в месяц, начисление начнётся с октября».
Перемещение и защита от ошибки · 1 минута
«Перемещение»: ноутбук для конструкторского бюро → «Администрация», МОЛ Никонова → «Провести перемещение». Затем «Амортизация»: кнопка «Начислить» серая, сверху предупреждение.
«Начислить нельзя: есть акт списания МФУ, который ещё не проведён. Иначе амортизация попала бы на объект, который уже списывают».
Главный бухгалтер проводит списание · 1 минута
Выйти (значок рядом с фамилией внизу меню) → войти как glavbuh → «Журнал операций» → в строке СП-26/001 «Провести» → значок принтера, акт ОС-4.
«Акт оформил бухгалтер, а провести его может только главный бухгалтер. Финансовый результат: выручки нет, остаточная стоимость ноль, расходы на демонтаж 1 500 ₽ — убыток 1 500 ₽».
Начисление амортизации · 1 минута
«Амортизация» → «Начислить за сентябрь 2026» → подтвердить. В «Закрытых периодах» у сентября открыть «Ведомость». Вернуться на главную — цифры обновились.
«Система посчитала амортизацию по каждому объекту и закрыла сентябрь. Задним числом в закрытом месяце документы оформить уже нельзя».
Материалы к защите
| osnova.zip | проект целиком: исходный код, файлы запуска, README |
| diagrams.zip | 8 диаграмм для записки в .drawio и .png |
| Шпаргалка | «Защита — шпаргалка.pdf»: сценарий со скриншотами, что нажать и что сказать, ответы на вопросы |
Из чего сделана система
Любое веб-приложение состоит из трёх частей: то, что видит пользователь (клиент), логика, которая считает и сохраняет (сервер), и место хранения данных (база данных). «Стек» — это список инструментов, на которых всё это написано.
JavaScript
Язык программирования, на котором написан весь проект: и клиент в браузере, и сервер. Один язык на всё — проще разбираться и поддерживать.
React 19
Библиотека, которая собирает страницу из «кубиков»-компонентов: карточек, кнопок, таблиц. Один раз сделанный компонент используется на всех экранах.
Vite
Инструмент, который собирает клиент в готовые файлы для браузера, а при разработке мгновенно показывает изменения. Переходы между страницами — React Router.
CSS Modules
Стили лежат рядом с каждым компонентом и не мешают друг другу. Светлая и тёмная тема — два набора цветовых переменных. Иконки — Tabler Icons.
Chart.js
Библиотека графиков: начисления по месяцам, структура по группам и подразделениям, кривая остаточной стоимости в карточке объекта.
Node.js + Express
Сервер принимает запросы от клиента, проверяет права пользователя и данные, считает амортизацию и сохраняет результат в базу.
MySQL 8.4
Популярная бесплатная реляционная база данных. Хранит объекты, документы, начисления, справочники и пользователей.
phpMyAdmin
Веб-программа, чтобы посмотреть таблицы базы в браузере. Удобно показать комиссии, как хранятся данные.
Docker
Запускает систему в четырёх контейнерах: frontend (клиент), backend (сервер), mysql (база) и phpmyadmin. На компьютер не нужно ничего ставить, кроме Docker Desktop.
Как это работает вместе
Пользователь открывает систему в браузере, контейнер frontend отдаёт ему готовый клиент на React.
Клиент запрашивает данные у сервера по адресам /api/..., например список объектов.
Сервер на Express проверяет, кто вошёл и какая у него роль, достаёт данные из MySQL и возвращает их клиенту.
Пользователь нажимает кнопку, например «Начислить за сентябрь». Сервер считает амортизацию по каждому объекту и сохраняет всё одной транзакцией: либо всё, либо ничего.
Клиент обновляет экран и показывает результат.
Почему выбран именно этот стек
- Распространённый и бесплатный: React, Node.js и MySQL — одни из самых популярных технологий для веб-приложений.
- Один язык на всё: клиент и сервер написаны на JavaScript.
- Реляционная база данных: MySQL поддерживает связи между таблицами и транзакции, это важно для учёта.
- Простой запуск: Docker снимает проблему «у меня не запускается» — система поднимается одной командой на любом компьютере.
- Без внешних сервисов: система полностью автономна, после первого запуска ей не нужен интернет.
Где что лежит
Проект делится на две папки: backend — сервер и frontend — клиент. Самое интересное для записки — расчёт амортизации в backend/src/depreciation.js.
npm test)9 таблиц в трёх группах
База данных — как Excel-файл с листами: каждый лист — таблица, строки — записи, столбцы — свойства. Таблицы связаны по номерам: в документе записан не весь объект, а только его номер, и по нему находится объект.
Первичный ключ (PK)
Уникальный номер записи, как номер паспорта. Повторяться не может.
Внешний ключ (FK)
Ссылка на запись в другой таблице. Например, «номер подразделения» у объекта.
Один ко многим
В одном подразделении много объектов, но каждый объект числится в одном подразделении.
справочники постоянная информация
| users | Пользователи: логин, пароль в зашифрованном виде, ФИО, роль (бухгалтер или главный бухгалтер). |
| asset_groups | Амортизационные группы: номер 1–10, название, минимальный и максимальный срок полезного использования в месяцах. |
| departments | Подразделения: раскройный цех, сборочный цех, склад готовой продукции, транспортный участок, администрация. |
| responsible_persons | Материально ответственные лица: ФИО, должность, подразделение. |
| counterparties | Контрагенты: название, ИНН, вид — поставщик, покупатель или оба. |
объекты и документы что происходит с имуществом
| assets | Основные средства: инвентарный номер, наименование, группа, подразделение, МОЛ, первоначальная стоимость, срок, способ амортизации, дата ввода, статус, дата выбытия. |
| operations | Документы: номер, вид (поступление, перемещение, списание), дата, объект, откуда и куда, контрагент, выручка и расходы при списании, остаточная стоимость, статус (черновик или проведён), кто оформил и кто провёл. |
амортизация ежемесячные начисления
| depreciation_runs | Начисление за месяц: период, общая сумма, кто и когда начислил. Есть запись за месяц — значит, месяц закрыт. |
| depreciation_entries | Строки начисления по каждому объекту: сумма за месяц, накопленная амортизация, остаточная стоимость. |
ER-диаграмма
Состояния документа
Черновик → Проведён. Поступление и перемещение проводятся сразу. Акт списания сначала сохраняется черновиком, провести его может только главный бухгалтер. Черновик можно удалить, проведённый документ — нет.
Математика простыми словами
Амортизация — постепенный перенос стоимости объекта на расходы. Объект изнашивается, и каждый месяц часть его стоимости списывается. В системе два способа.
Линейный способ
Каждый месяц одинаковая сумма: стоимость делится на срок в месяцах.
Уменьшаемого остатка
В первые годы списывается больше, потом меньше. Сумма пересчитывается раз в год от остатка, коэффициент k = 2.
Финансовый результат
Считается при списании. Если меньше нуля — это убыток.
Когда начисляется
Начисление начинается с месяца, следующего за месяцем принятия к учёту, и прекращается, когда стоимость полностью списана или объект выбыл.
При способе уменьшаемого остатка А(мес) = А(год) / 12. В последний месяц срока списывается вся оставшаяся стоимость, чтобы остаток стал ровно нулём.
Правила, которые проверяет система
- Стоимость основного средства — не меньше 100 000 ₽, иначе это не основное средство.
- Срок полезного использования должен попадать в границы амортизационной группы (например, 5-я группа — свыше 7 и до 10 лет включительно, 85–120 месяцев).
- В закрытом месяце нельзя оформить документ задним числом.
- Начислить амортизацию нельзя, пока есть непроведённый акт списания.
- Проводить списание и отменять начисление может только главный бухгалтер.
Примеры для записки
| Линейный | Станок КО-600 за 1 450 000 ₽, срок 96 мес. → 1 450 000 / 96 = 15 104,17 ₽ в месяц, 181 250 ₽ в год |
| Уменьш. остатка | Станок ФР-3200 за 1 902 600 ₽, срок 96 мес. = 8 лет → первый год 1 902 600 × 2 / 8 = 475 650 ₽, в месяц 39 637,50 ₽ |
| Второй год | остаток 1 902 600 − 475 650 = 1 426 950 → 1 426 950 × 2 / 8 = 356 737,50 ₽ — сумма уменьшается |
| Списание | МФУ: выручки нет, остаточная стоимость 0, расходы на демонтаж 1 500 ₽ → 0 − 0 − 1 500 = убыток 1 500 ₽ |
В коде это функция buildSchedule в файле backend/src/depreciation.js: она строит график начислений по месяцам. Тот же расчёт система показывает справа на экране «Поступление».
Восемь готовых диаграмм
Каждая есть в двух видах: .drawio — можно открыть и поправить в бесплатной программе draw.io (app.diagrams.net),
и .png — сразу вставить в Word. Все лежат в архиве diagrams.zip. Нажмите на картинку, чтобы увеличить.
Частые проблемы
«Запустить.bat» пишет, что Docker не запущен
Откройте Docker Desktop из меню «Пуск» и подождите, пока внизу слева появится зелёная надпись «Engine running». Затем запустите файл ещё раз.
«docker» не является командой / не найден
Docker Desktop не установлен или не перезапущен терминал после установки. Установите Docker Desktop, перезагрузите компьютер.
Docker Desktop не запускается, ошибка про виртуализацию или WSL
На старых ноутбуках в BIOS бывает выключена виртуализация, а иногда не хватает компонента WSL. Включите виртуализацию в BIOS (Intel VT-x или AMD-V) и в PowerShell от администратора выполните wsl --install, затем перезагрузите компьютер.
«port is already allocated» — порт занят
Порт 8080 занят другой программой. Запустите на другом порту и откройте http://localhost:8085:
Если занят порт phpMyAdmin 8081 — так же через $env:PMA_PORT=8086.
Браузер пишет «Не удаётся получить доступ к сайту»
Сервер ещё стартует. Подождите 30 секунд и обновите страницу (F5). Не помогло — ещё раз Запустить.bat.
Кнопка «Начислить» серая уже после проведения акта
Обновите страницу (F5): экран амортизации ещё показывает старое состояние.
Нужно начать с полностью чистой базы
Обычно хватает Сбросить данные.bat. Если нужно удалить базу целиком и создать заново:
Что могут спросить и что ответить
Что такое основные средства?
Имущество, которое используется больше 12 месяцев и стоит дороже 100 000 рублей: здания, станки, транспорт, оборудование.
Какие способы амортизации есть в системе?
Линейный — каждый месяц одинаковая сумма, стоимость делится на срок. Уменьшаемого остатка с коэффициентом 2 — в первые годы списывается больше, потом меньше: годовая сумма = остаточная стоимость на начало года × 2 / срок в годах.
Что такое амортизационная группа?
По классификации основных средств все объекты делятся на 10 групп по сроку службы. Например, 5-я группа — свыше 7 и до 10 лет включительно. Система не даст указать срок вне группы.
Какие документы формирует система?
ОС-1 — акт о приёме-передаче (поступление), ОС-2 — накладная на внутреннее перемещение, ОС-4 — акт о списании. Плюс ведомость начисления амортизации за месяц.
Зачем закрывать периоды?
Чтобы после начисления амортизации никто не изменил данные за прошлый месяц задним числом. Это защищает отчётность.
Зачем две роли?
Разделение обязанностей. Бухгалтер оформляет документы, а проведение списания и отмену начисления делает только главный бухгалтер. Так меньше риск ошибки или злоупотребления.
Как обеспечивается целостность данных?
Начисление за месяц и изменение объектов при проведении документов выполняются в транзакции: либо всё, либо ничего. Таблицы связаны внешними ключами, поэтому нельзя сослаться на несуществующий объект или подразделение.
Как хранятся пароли и как система понимает, кто вошёл?
Пароли хранятся не в открытом виде, а в виде хеша (алгоритм bcrypt). После входа сервер выдаёт браузеру токен (JWT) в защищённом cookie и по нему при каждом запросе определяет пользователя и его роль.
Как проверялась правильность расчётов?
Для расчётов написаны автоматические тесты (11 проверок): оба способа амортизации сверены с ручным расчётом, проверены финансовый результат списания и правила документов. Запуск — npm test в папке backend.
Чем это лучше 1С?
Это не замена 1С, а узкая система под одну задачу: проще, бесплатная, её легко освоить. Учебный проект показывает, как такая автоматизация устроена изнутри.
Что можно доработать?
Инвентаризацию со сканированием QR-кодов на объектах, переоценку и модернизацию, налоговый учёт, выгрузку в 1С и отчёты в Excel.
Термины
| Основное средство (ОС) | Имущество дороже 100 000 ₽, которое служит больше года: станок, здание, автомобиль. |
| Первоначальная стоимость | Сколько стоил объект при принятии к учёту. |
| Остаточная стоимость | Первоначальная стоимость минус уже начисленная амортизация. |
| Срок полезного использования | Сколько месяцев объект будет приносить пользу; за это время списывается вся стоимость. |
| МОЛ | Материально ответственное лицо — сотрудник, который отвечает за объект в своём подразделении. |
| Инвентарный номер | Уникальный номер объекта, по нему объект находят в учёте и на месте. |
| Проведение документа | Документ вступает в силу: объект снимается с учёта, меняет подразделение и т. п. |
| Закрытый период | Месяц, за который уже начислена амортизация; менять его задним числом нельзя. |
| Frontend / клиент | Всё, что видит пользователь в браузере. |
| Backend / сервер | Часть программы «за кулисами»: проверяет данные, считает, сохраняет в базу. |
| API | Набор адресов, по которым клиент обращается к серверу, например /api/assets. |
| Транзакция | Группа изменений в базе, которая выполняется целиком или не выполняется совсем. |
| Контейнер | Изолированная «коробка» Docker, в которой работает программа со всем необходимым. |