Что попадает в прирост выручки и валовой прибыли, а что мы сознательно не засчитываем себе. Здесь описано ровно то, что делает расчёт, — без округления в свою пользу.
Алгоритм смотрит, что продаётся в конкретном автомате, и предлагает поменять товар в конкретной ячейке: убрать тот, что стоит зря, поставить тот, что будет продаваться. Оператор приезжает и делает.
Эффект замены — деньги, которые принесло само это решение. Не работа оператора, не сезон, не изменение цен.
Отрезок от одного приезда оператора до следующего. Внутри такого отрезка полка не меняется: что загрузили, то и продаётся. Это и позволяет сравнить «что есть» с «что было бы».
Приезды берутся из документов обслуживания с точным временем. Два приезда в один день — это два разных отрезка: подневные данные слепили бы их в один и потеряли бы прирост.
Если товар уже стоял в этом автомате в других ячейках, из проданного вычитается его прежняя ёмкость: столько он мог продать за отрезок и без нашего решения. Остаётся то, что дала именно новая ячейка.
Здесь живёт вся честность расчёта, поэтому правило одно и оно короткое. Раньше на его месте был список исключений, который отставал от кода; теперь все случаи выпадают из одной строки.
Спрос — сколько товар продавал за такой же отрезок до замены: его скорость за 30 дней до того, как у него забрали место, умноженная на рабочие дни отрезка. Рабочие дни — дни отрезка за вычетом каникул. Места — ёмкость его ячеек до и после.
И второй ограничитель, поверх первого. Тем же порядком считается, сколько товар недопродал на самом деле — спрос минус факт, — и в вычет идёт меньшее из двух. Чтобы вычесть, мало забрать место: продажи должны ещё и реально просесть. Одного из двух условий недостаточно.
Из этой одной строки выпадают все три случая, которые встречаются на практике, — считать их по отдельности не нужно.
потеря = 0
Спрос равен нулю, значит нулю равны обе половины формулы. Именно такие ячейки алгоритм ищет в первую очередь: они не приносят ничего и занимают место.
потеря настоящая, считаем полностью
Мест не осталось вовсе, второе слагаемое обнуляется, и вычитается весь его спрос. Ровно то, что он зарабатывал, — и не меньше.
потеря = 0
Если спрос помещается в оставшиеся места, обе половины формулы равны спросу и разность обнуляется сама. Место было лишним — изъятие ничего не отняло.
Автомат на транспортном узле, 16 июня 2026 года. У воды было четыре ячейки, одну отдали энергетику.
Место было лишним: вода как продавалась, так и продаётся, и весь заработок энергетика на этой ячейке — чистый прирост. Рост воды при этом мы себе не записываем: он от июньской жары, а не от нашего решения.
Продавай вода 18 бутылок при 20 местах — вычет стал бы настоящим, и мы бы его сделали, как бы хорош ни оказался энергетик.
Штуки переводятся в рубли по явному порядку источников, одинаковому для обоих концов замены — и для нового товара, и для вытесненного.
Почему со второй ступени берётся только доля, а цена всегда своя. Сетевая цена приезжает сегодняшняя, а замена могла быть в феврале. Подставили её в рублях — и доля валовой прибыли скакнула к 75 %, потому что весенние продажи считались по августовским ценникам. С долей наценки и своей ценой доля легла на реальную маржинальность замен.
Правило, из которого это выросло. Ошибка в вычете уменьшает нашу цифру, ошибка в приросте — увеличивает. Осторожничать надо там, где ошибка играет в нашу пользу, поэтому у нового товара сетевые рубли не берутся никогда.
Три из них работают против нас, одна — в нашу пользу, и о ней сказано так же прямо.
В закрытой школе не продаёт никто — ни новый товар, ни прежний. Дни каникул выкидываются из отрезка с обеих сторон, и ожидание от прежнего товара считается тоже по рабочим дням. Лето не должно записываться нам в убыток, но и лишнего прироста из него не берётся.
Алгоритм сам возвращает вытесненный товар, если новый оказался хуже. Если в отрезке этот товар снова загружали — он опять на полке и торгует, и вычитать «недополученное» больше нечего. Исправленную ошибку не наказываем дважды.
Если отрезок ушёл в минус, а нового товара привезли меньше, чем помещается в ячейку, он физически не мог продать больше. Такой минус — к обслуживанию, а не к выбору товара, и в оценку решения он не идёт. Счётчик таких случаев ведётся отдельно.
Тем же числом штук, что и валовую прибыль, — просто умноженным на его цену, а не на маржу. Без этого «прирост выручки» был бы всей выручкой нового товара, а это не прирост.
Отсеянное не теряется: каждая задача, не попавшая в расчёт, попадает в счётчик с причиной — их видно в отчёте прогона.
Деньги покупателей: выручка нового товара за отрезок минус выручка, которую недодал вытесненный.
То, что осталось от этих денег после закупочной цены товара. Работать надо на неё: именно она отражает, что решение принесло бизнесу.
Маржа за штуку берётся из учётной системы, а не выводится из цены: наценка по позициям разная, и «средний процент» здесь врал бы.
Иногда прирост прибыли выходит больше прироста выручки — и это не ошибка счёта. Так бывает, когда дорогой товар с низкой наценкой меняют на дешёвый с высокой: выручка на ячейке падает, а зарабатывает она больше. На 6 705 замерённых замен таких примерно триста. Мы это не прячем: спрятать значило бы подогнать расчёт под ожидание, что прибыль всегда меньше выручки.
Этот список важнее прочих: он показывает, в какую сторону мы ошибаемся, когда ошибаемся.
Что стояло, что стало, сколько продавал прежний товар, сколько продаёт новый, по каким именно отрезкам считали и сколько дней каникул выкинули. Детализация хранится по каждому отрезку, а не только итогом.
Если какая-то цифра не сходится с вашей, это разбирается на конкретной замене и конкретном отрезке, а не сверкой итогов. Сверка итогов не находит причину, она только фиксирует расхождение.
Все числа считаются по тем же кассовым данным, по которым вы сводите выручку. Своей «параллельной» статистики у расчёта нет.
Аудит базы бесплатный: подключаемся на чтение, показываем, что мешает считать, и на чём эффект будет виден первым.
Оставить заявку