Звіт показує, скільки грошей стоїть у запасі і як швидко цей запас обертається. Один рядок = один товар, який зараз є на складі. Немає залишку — немає рядка, навіть якщо товар активно продається.
📥 Джерело даних
Усе з нашої бази (D1), не з 1С наживо. Запит — action=inventory_turnover.
Залишки — знімок регістру «Запаси» 1С на останню дату синку (вона під таблицею і в PDF). Оновлює автосинк кожні 30 хв, 08:00–20:30.
Беруться лише додатні залишки і лише товари — послуги та позначені на видалення не входять.
Виключені склади: «В дорозі», «Майно», «АВТО», «Інструменти», «Сонячна станція», «ПОСЛУГ», «НОВИЙ ОФИС». Тобто транзит у залишок не рахується.
Продажі — проведені видаткові накладні (не замовлення й не оплати). Кількість переводиться в базові одиниці: бухта 500 м рахується як 500 м.
Собівартість — середньозважена ціна закупівлі за всю історію: сума прихідних накладних ($) ÷ кількість у базових одиницях (бухта 500 м = 500 м, як і в продажах). Не FIFO і не остання ціна.
Усі суми — в USD. Сума рядка накладної береться з рядка; якщо курс для рядка ще не проставлено (позиції, що досинкались пізніше за документ), — пропорційно від суми шапки документа в USD, тож виручка й собівартість не губляться. Вікна 90 і 365 днів рахуються від сьогодні, а не від дати залишків.
📐 Що означають цифри
Вартість запасу = залишок × середня ціна закупівлі. Якщо товар жодного разу не приходив прихідною накладною з сумою — ціни нема, у вартість він не входить, у колонках «—».
ITR (оборотність) = COGS за рік ÷ вартість запасу, де COGS = продано за рік × середня ціна закупівлі. 4x = запас обертається 4 рази на рік. По одному товару ціна в чисельнику й знаменнику та сама і скорочується, тому ITR рядка = продано за рік ÷ залишок — він є і в товару без ціни закупівлі. KPI зверху — грошовий, по товарах із ціною.
DSI (дні запасу) = 365 ÷ ITR. На скільки днів вистачить запасу — рахується в грошах.
GMROI = (виручка за рік − COGS за рік) ÷ вартість запасу. Скільки доларів маржі приносить кожен долар, вкладений у запас: 1.0 = долар за рік повернув долар маржі.
Покриття днів = залишок ÷ денний темп продажів. Темп = продано за 90 днів ÷ 90, а якщо за 90 днів не продавали — продано за рік ÷ 365.
ABC — за виручкою за останні 365 днів: позиції сортуються за спаданням, перші, що дають 80% виручки — A, далі до 95% — B, решта — C. Товар без продажів за рік отримує «—» і у фільтри A/B/C не потрапляє.
🚦 Статуси
Перевіряються згори вниз, перший збіг виграє:
Мертвий — жодного продажу за 12 місяців (або взагалі жодного).
Повільний — DSI понад 180 днів або DSI не порахувався.
Нормальний — DSI 60–180 днів.
Швидкий — DSI менше 60 днів.
Товар без ціни закупівлі статус отримує так само (ITR і DSI рахуються з кількостей), але у вартість запасу, COGS і GMROI не входить — у цих колонках «—».
📦 Надлишок
Запас понад норму покриття 90 днів: надлишок = залишок − денний темп × 90 (у мінус не йде), у грошах — × середню ціну закупівлі.
Якщо продажів нема взагалі, темп = 0 і надлишком вважається весь залишок. Тому «Мертвий сток» майже цілком сидить і в «Надлишку» — це не подвійний рахунок, а два різні розрізи тих самих грошей.
🔎 Фільтри
Організація: Реакт / Генерація (Одеса + Київ) / Всі. Фільтр діє одразу на залишки, продажі й закупівлі. У зрізі однієї організації продаж Реакт → Генерація (і навпаки) — звичайний продаж: товар реально пішов зі складу. У зрізі «Всі» такі обороти виключаються разом із зустрічними закупівлями, бо товар групу не покинув — інакше одна партія продавалась би двічі при одному залишку.
Категорія — реквізит «Категорія номенклатури» картки в 1С (заповнений у 100% товарів), не папка довідника: папка є лише у половини карток, а торгова номенклатура лежить у корені без неї. Чіп = корінь дерева категорій; обрав корінь — під ним другий ряд підкатегорій. «Категорію не завантажено» — картка ще не приїхала в нашу базу нічним синком. Товар — пошук по назві, артикулу й коду.
Картки статусів клікабельні і звужують тільки таблицю. KPI зверху при цьому не міняються: вони рахуються по вибірці «категорія + пошук + ABC», статус на них не діє.
Сортування — клік по заголовку колонки, за замовчуванням «Надлишок $» за спаданням.
PDF вивантажує рівно те, що зараз на екрані, з поточними фільтрами в шапці.
⚠️ Чому цифра може здивувати
DSI ≠ «Покриття днів». DSI — у грошах і завжди по річному вікну; покриття — у штуках і по свіжому 90-денному темпу. Товар, який щойно почали активно продавати, матиме мале покриття і великий DSI.
Матеріали бригад сидять у залишку. Склади «під звіт» (видано монтажникам) входять у звіт, а списання на обʼєкт — не продаж. Тому в Генерації частина таких позицій виглядає мертвою чи надлишковою, хоча по факту витрачається на монтажах. Грошей там мало (≈2% вартості запасу), позицій — багато.
Сезонність не враховується. Темп лінійний: разовий сплеск продажів занижує покриття й надлишок, а мертвий сезон — завищує.
Ціна закупівлі — середня за всю історію. Коли ціни росли чи падали, вона відрізняється від останнього приходу, і вартість запасу з нею — теж. У зрізі «Всі» середня рахується лише по зовнішніх закупівлях, без трансфертної ціни між Реактом і Генерацією.
Транзит не в залишку. Товар, який уже їде, у покриття та надлишок не входить.