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 позиция, количества > 0, дата не заблокирована
- Считает суммы для каждой строки (без НДС, НДС, с НДС)
- Создаёт складские транзакции (тип INCOMING)
- Обновляет остатки на складе
- Переводит накладную в статус 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 и логируется предупреждение.