Перейти к содержимому

4. Складской учёт

Что это

Складской учёт отслеживает всё движение товаров: от поставщика до тарелки гостя. Каждый приход, расход, порча и перемещение фиксируются.


Жизненный цикл товара на складе

ПОСТАВЩИК СКЛАД КЛИЕНТ
│ │ │
│ ── Накладная (приход) ────► │ │
│ ◄── Накладная (возврат) ─── │ │
│ │ │
│ │ ── Акт реализации ─────────► │
│ │ ── POS-чек (автосписание) ──►│
│ │ │
│ │ ── Акт списания (порча) ──► мусор
│ │ │
│ Склад A ──┤── Перемещение ──► Склад B │
│ │ │
│ Инвентаризация → коррекция остатков │

Типы складских операций

ОперацияЗнакЧто происходит
Приход (INCOMING)+Товар поступил от поставщика
Возврат (RETURN)Вернули товар поставщику
Перемещение (TRANSFER)±0Переместили между складами (−из одного, +в другой)
Продажа (SALE)Списание при ручной продаже (акт реализации)
Списание (WRITE_OFF)Порча, просрочка, утеря
Излишки (SURPLUS)+Фактический остаток больше учётного (инвентаризация)
Недостача (SHORTAGE)Фактический остаток меньше учётного (инвентаризация)

Накладная (приёмка товара)

Основной документ поступления товара на склад.

Жизненный цикл

┌─────────┐ подтверждение ┌──────────────┐ закрытие ┌──────────┐
│ ЧЕРНОВИК │───────────────────►│ ПОДТВЕРЖДЕНА │──────────────►│ ЗАКРЫТА │
│ (DRAFT) │ │ (CONFIRMED) │ │ (CLOSED) │
└────┬─────┘ └──────┬───────┘ └──────────┘
│ │
│ отмена │ отмена (откат остатков)
▼ ▼
┌──────────┐ ┌──────────┐
│ ОТМЕНЕНА │ │ ОТМЕНЕНА │
└──────────┘ └──────────┘

Пример: приёмка говядины

Шаг 1. Черновик

┌─────────────────────────────────────────────────────────────┐
│ НАКЛАДНАЯ #INV-2026-042 │
│ Дата: 16.04.2026 Статус: ЧЕРНОВИК │
│ Поставщик: ООО «МясоПром» │
│ Склад: Основной (Центр) │
│ Юрлицо: ООО «Бергамот» │
├─────────────────────────────────────────────────────────────┤
│ Позиции: │
│ ┌──────────────────┬─────┬──────────┬──────┬──────────────┐│
│ │ Номенклатура │ Кол.│ Цена │ НДС │ Сумма с НДС ││
│ ├──────────────────┼─────┼──────────┼──────┼──────────────┤│
│ │ Говядина рибай │30 кг│ 800 ₽/кг │ 10% │ 26 400 ₽ ││
│ │ Куриное филе │20 кг│ 350 ₽/кг │ 10% │ 7 700 ₽ ││
│ │ Масло оливковое │ 5 л │ 900 ₽/л │ 20% │ 5 400 ₽ ││
│ ├──────────────────┼─────┼──────────┼──────┼──────────────┤│
│ │ ИТОГО │ │ │ │ 39 500 ₽ ││
│ └──────────────────┴─────┴──────────┴──────┴──────────────┘│
└─────────────────────────────────────────────────────────────┘

Шаг 2. Подтверждение

Что делает система:

  1. Проверяет: минимум 1 позиция, количества > 0, дата не заблокирована
  2. Считает суммы для каждой строки (без НДС, НДС, с НДС)
  3. Создаёт складские транзакции (тип INCOMING)
  4. Обновляет остатки на складе
  5. Переводит накладную в статус CONFIRMED
Результат на складе:
Говядина рибай: было 0 кг → стало 30 кг (себестоимость 800 ₽/кг)
Куриное филе: было 5 кг → стало 25 кг (пересчёт средневзвешенной)
Масло оливковое: было 2 л → стало 7 л

Шаг 3. Закрытие — документ полностью завершён, расчёты окончены.

Бизнес-правила накладной

  • Редактирование только в статусе ЧЕРНОВИК
  • Минимум одна позиция для подтверждения
  • Количество > 0, цена > 0
  • НДС: от 0% до 100%
  • Дата оплаты не раньше даты документа
  • Дата документа не в заблокированном периоде
  • Фактическое количество не больше заявленного

Методы списания себестоимости

При продаже или списании нужно определить: по какой цене списывать товар? Ведь один и тот же товар мог поступать по разным ценам.

Метод списания задаётся на уровне корпорации.

FIFO (первый пришёл — первый ушёл)

Каждая поставка — отдельная партия со своей ценой. При расходе списывается самая старая партия.

Поступления говядины на склад:
01.04 Партия 1: 10 кг × 750 ₽/кг ← самая старая
10.04 Партия 2: 20 кг × 800 ₽/кг
15.04 Партия 3: 15 кг × 850 ₽/кг ← самая новая
Остаток на складе: 45 кг
Продали 15 кг → списание по FIFO:
Из партии 1: 10 кг × 750 ₽ = 7 500 ₽ (партия исчерпана)
Из партии 2: 5 кг × 800 ₽ = 4 000 ₽ (осталось 15 кг)
─────────────────────────────────────
Итого списано: 15 кг на 11 500 ₽
Средняя себестоимость: 766.67 ₽/кг
Остаток после продажи:
Партия 2: 15 кг × 800 ₽
Партия 3: 15 кг × 850 ₽
Всего: 30 кг, средняя: 825 ₽/кг

Средневзвешенная (AVERAGE_COST)

Все партии «смешаны» — цена усредняется при каждом поступлении.

Начало: 10 кг × 750 ₽/кг = 7 500 ₽
Поступление: 20 кг × 800 ₽/кг = 16 000 ₽
Средневзвешенная = (7 500 + 16 000) / (10 + 20) = 783.33 ₽/кг
Остаток: 30 кг × 783.33 ₽
Поступление: 15 кг × 850 ₽/кг = 12 750 ₽
Средневзвешенная = (23 500 + 12 750) / (30 + 15) = 805.56 ₽/кг
Остаток: 45 кг × 805.56 ₽
Продали 15 кг:
Списание: 15 × 805.56 = 12 083.40 ₽
Остаток: 30 кг × 805.56 ₽/кг ← цена не меняется при расходе

Сравнение методов

КритерийFIFOСредневзвешенная
ТочностьКаждая партия отслеживается отдельноЦена усреднена
При росте ценСписывает дешёвое первым → прибыль вышеСглаживает колебания
СложностьНужно хранить историю партийПроще — одна цифра на остаток
Подходит дляСкоропорт, дорогие ингредиентыМассовые однородные товары

Инвентаризация

Сверка фактических остатков с данными системы.

Процесс

┌──────────┐ проведение ┌──────────┐
│ ЧЕРНОВИК │─────────────────►│ ПРОВЕДЕНА│
│ (DRAFT) │ │ (POSTED) │
└────┬─────┘ └──────────┘
│ отмена
┌──────────┐
│ ОТМЕНЕНА │
└──────────┘

Пример инвентаризации

Склад: Основной (Центр), дата: 16.04.2026
┌──────────────────┬───────────┬───────────┬───────────┬──────────────┐
│ Номенклатура │ По данным │ По факту │ Разница │ Результат │
│ │ системы │ (подсчёт) │ │ │
├──────────────────┼───────────┼───────────┼───────────┼──────────────┤
│ Говядина рибай │ 25.000 кг │ 24.500 кг │ −0.500 кг │ НЕДОСТАЧА │
│ Куриное филе │ 18.000 кг │ 18.200 кг │ +0.200 кг │ ИЗЛИШКИ │
│ Масло оливковое │ 6.000 л │ 6.000 л │ 0.000 │ Всё сходится │
│ Соль морская │ 3.000 кг │ 2.800 кг │ −0.200 кг │ НЕДОСТАЧА │
└──────────────────┴───────────┴───────────┴───────────┴──────────────┘

При проведении:

  • Недостача говядины: создаётся транзакция SHORTAGE на −0.5 кг
  • Излишки курицы: создаётся транзакция SURPLUS на +0.2 кг
  • Остатки корректируются до фактических
  • Суммы привязываются к счетам излишков/недостач (для бухгалтерии)

Акт списания

Удаление товара со склада: порча, просрочка, утеря.

Склад: Основной (Центр)
Причина: Истечение срока годности
Дата: 16.04.2026
┌──────────────────┬───────────┬───────────────┬───────────────┐
│ Номенклатура │ Кол-во │ Себестоимость │ Сумма списания│
├──────────────────┼───────────┼───────────────┼───────────────┤
│ Куриное филе │ 2.000 кг │ 350.00 ₽/кг │ 700.00 ₽ │
│ Молоко 3.2% │ 3.000 л │ 85.00 ₽/л │ 255.00 ₽ │
├──────────────────┼───────────┼───────────────┼───────────────┤
│ ИТОГО │ │ │ 955.00 ₽ │
└──────────────────┴───────────┴───────────────┴───────────────┘
При проведении:
→ Транзакция WRITE_OFF: −2 кг курицы, −3 л молока
→ Остатки на складе уменьшены
→ Себестоимость списания = 955 ₽ (убыток)

Акт реализации

Ручная продажа — не через POS (опт, корпоративные заказы, кейтеринг).

Склад: Основной (Центр)
Метод оплаты: Безналичный расчёт
Дата: 16.04.2026
┌────────────────┬──────┬──────────┬───────────┬───────────┬──────────┐
│ Номенклатура │ Кол. │ Цена │ Скидка │ Себестоим.│ Маржа │
├────────────────┼──────┼──────────┼───────────┼───────────┼──────────┤
│ Стейк Рибай │ 10 │ 1 200 ₽ │ 100 ₽ │ 470 ₽ │ 630 ₽ │
│ Цезарь │ 15 │ 450 ₽ │ 50 ₽ │ 180 ₽ │ 220 ₽ │
├────────────────┼──────┼──────────┼───────────┼───────────┼──────────┤
│ ИТОГО │ │ 18 750 ₽ │ 1 750 ₽ │ 7 400 ₽ │ 9 600 ₽ │
│ │ │(до скид.)│ │ │ │
│ К оплате │ │ 17 000 ₽ │ │ │ │
└────────────────┴──────┴──────────┴───────────┴───────────┴──────────┘
При проведении:
→ Транзакции SALE: списание со склада
→ Себестоимость берётся по методу склада (FIFO / средневзвешенная)
→ Маржа = Цена − Скидка − Себестоимость

Складские остатки

Система ведёт два уровня учёта:

WarehouseStock — текущий остаток

┌──────────────────┬──────────┬───────────────┬───────────────────┐
│ Номенклатура │ Кол-во │ Себестоимость │ Закупочная цена │
├──────────────────┼──────────┼───────────────┼───────────────────┤
│ Говядина рибай │ 24.50 кг │ 800.00 ₽/кг │ 800.00 ₽/кг │
│ Куриное филе │ 16.20 кг │ 355.00 ₽/кг │ 350.00 ₽/кг │
│ Масло оливковое │ 6.00 л │ 905.00 ₽/л │ 900.00 ₽/л │
└──────────────────┴──────────┴───────────────┴───────────────────┘

InventoryTransaction — полная история

┌───────────┬──────────────────┬──────────┬─────────┬───────────────┐
│ Дата │ Номенклатура │ Тип │ Кол-во │ Документ │
├───────────┼──────────────────┼──────────┼─────────┼───────────────┤
│ 01.04 │ Говядина рибай │ INCOMING │ +30.00 │ Накл. #042 │
│ 05.04 │ Говядина рибай │ SALE │ −8.75 │ Акт реал. #15 │
│ 10.04 │ Говядина рибай │ INCOMING │ +20.00 │ Накл. #048 │
│ 16.04 │ Говядина рибай │ SHORTAGE │ −0.50 │ Инвент. #03 │
│ 16.04 │ Говядина рибай │ SALE │ −5.25 │ Акт реал. #21 │
├───────────┼──────────────────┼──────────┼─────────┼───────────────┤
│ │ │ Остаток: │ 35.50 кг│ │
└───────────┴──────────────────┴──────────┴─────────┴───────────────┘

Лимиты остатков

Для каждого товара на складе можно задать минимальный и максимальный остаток — для мониторинга.

Говядина рибай на «Основном складе»:
├── Минимум: 10 кг ← если меньше — пора заказывать
└── Максимум: 50 кг ← если больше — перезакупка
Текущий остаток: 8.5 кг
→ ⚠️ Ниже минимума! Нужно заказать.

Расчёт НДС в накладных

При подтверждении накладной система рассчитывает суммы для каждой позиции.

Формулы

По каждой позиции:
Сумма без НДС = Количество × Цена за единицу
Сумма НДС = Сумма без НДС × Ставка НДС / 100
Сумма с НДС = Сумма без НДС + Сумма НДС

Пример

Позиция: Говядина рибай, 30 кг × 800 ₽/кг, НДС 10%
Сумма без НДС = 30 × 800 = 24 000.00 ₽
Сумма НДС = 24 000 × 10 / 100 = 2 400.00 ₽
Сумма с НДС = 24 000 + 2 400 = 26 400.00 ₽

Итоги накладной

totalWithoutVat = СУММА(всех позиций без НДС)
totalVat = СУММА(всех сумм НДС)
totalWithVat = totalWithoutVat + totalVat

Распределение сервисных расходов

Если к накладной добавлены сервисные расходы (доставка, страховка, таможня), они распределяются пропорционально стоимости товаров.

Метод: пропорционально сумме (BY_AMOUNT)

Накладная:
├── Говядина: 24 000 ₽ (80% от общей суммы)
├── Масло: 6 000 ₽ (20% от общей суммы)
│ Итого товаров: 30 000 ₽
└── Сервисный расход: доставка 3 000 ₽
Распределение доставки:
├── Говядина: 3 000 × (24 000 / 30 000) = 2 400 ₽
└── Масло: 3 000 × ( 6 000 / 30 000) = 600 ₽
Итоговая себестоимость на складе:
├── Говядина: (24 000 + 2 400) / 30 кг = 880.00 ₽/кг (было 800)
└── Масло: ( 6 000 + 600) / 5 л = 1 320.00 ₽/л (было 1 200)

Последний товар получает остаток — это защита от ошибок округления.


Переотпуск с переоценкой

Если после подтверждения накладной изменилось фактическое количество (приняли не всё), система пересчитывает суммы.

Было: 30 кг говядины × 800 ₽ = 24 000 ₽
Факт: 28 кг (2 кг не приняли)
Переоценка:
Новая сумма без НДС = 28 × 800 = 22 400 ₽
НДС 10% = 2 240 ₽
Сумма с НДС = 24 640 ₽
Складские остатки скорректированы: −2 кг

Отмена подтверждённых документов

При отмене подтверждённой накладной или акта система откатывает складские остатки.

Отмена прихода (reverseIncoming)

Метод AVERAGE_COST:
Было на складе: 50 кг × 820 ₽/кг = 41 000 ₽
Отменяем приход: 20 кг × 800 ₽/кг = 16 000 ₽
Новая себестоимость = (41 000 − 16 000) / (50 − 20) = 833.33 ₽/кг
Новый остаток: 30 кг × 833.33 ₽/кг
Метод FIFO:
Удаляется партия, пересчитывается средневзвешенная из оставшихся

Отмена расхода (reverseOutgoing)

Метод AVERAGE_COST:
Было на складе: 30 кг × 833 ₽/кг = 24 990 ₽
Отменяем расход: 5 кг × 800 ₽/кг (по цене на момент списания)
Новая себестоимость = (24 990 + 4 000) / (30 + 5) = 828.29 ₽/кг
Новый остаток: 35 кг × 828.29 ₽/кг
Метод FIFO:
Восстанавливается партия с исходной себестоимостью

Важно: система защищает от отрицательной себестоимости — если расчёт даёт < 0, используется 0 и логируется предупреждение.