Складские остатки: одна запись на единицу, адрес хранения, признаки и история движений
В AIERP остатки устроены так: «одна запись = одна единица товара». 22 фактических холодильника Bosch на складе — это 22 строки в журнале остатков. У каждой строки своя приходная заявка, своя первичная приходная заявка в цепочке перемещений между складами, своя расходная (когда единица ушла), физический адрес «ряд-стеллаж-полка-ячейка», индивидуальная закупочная цена и собственная наценка. У каждой единицы можно проставить один из 11 признаков: хит продаж, неликвид, излишек, новинка, распродажа, уценка, сезонный товар, акционный, эксклюзив, брак, витринный образец. Сотрудник магазина видит только остатки своих точек — права фильтруют выдачу автоматически, без явных проверок в коде. Резерв считается напрямую из активных заказов: сколько единиц забронировано — столько и заблокировано, без отдельного «резервного» счётчика, который может разойтись с реальностью. По каждой единице можно построить таймлайн: где и когда появилась, куда переезжала, кому продана.
Что получает бизнес от модуля
Каждая единица — отдельная запись
Журнал остатков хранит по одной строке на каждую физическую единицу товара. Когда на склад приехало 22 холодильника — это 22 отдельные записи, а не одна с количеством 22. Это даёт серийный учёт, индивидуальную закупочную цену и собственную судьбу единицы. Критично для электроники, мебели, автозапчастей и любых товаров, где важна история конкретной штуки.
Полная история перемещений
У каждой единицы хранится связь с приходной заявкой, по которой она пришла впервые, с заявкой текущего прихода (после переезда между магазинами она уже другая) и с расходной заявкой (по какой ушла). Получается цепочка: «пришла на склад А от поставщика, переехала в магазин Б, продана клиенту из Б». При гарантийном случае или споре с поставщиком эту цепочку видно в один клик.
Адресное хранение
У каждой единицы — физический адрес: ряд, стеллаж, полка, ячейка. На карточке отображается как «А-3-2-7». Если заполнены не все четыре уровня — пустые отбрасываются, выводится «А-3» или просто «А». Кладовщик после сканирования штрихкода сразу видит, куда идти за товаром, и собирает заказ по конкретному маршруту, а не бегает по складу.
11 признаков остатка
У единицы можно проставить признак: распродажа, неликвид, излишек, новинка, хит продаж, уценка, сезонный, акционный, эксклюзив, брак, витринный образец. У каждого свой цвет на карточке. Можно отфильтровать остатки по признаку и сделать массовые операции — например, уценить весь неликвид одним действием или вывести на печать ценники для всех новинок.
Права доступа по магазину
Сотрудник магазина видит только остатки своих точек — в любом отчёте, любом запросе, любой странице. Директор сети видит всё. Защита работает автоматически, без явных проверок в каждом отчёте. Даже если в новом разделе разработчик забудет проверить права — лишние данные не покажутся. Это снимает целый класс ошибок утечки данных.
Честный резерв из реальных заказов
Зарезервированное количество не хранится отдельным счётчиком, который может разойтись с реальностью. Оно считается напрямую из активных заказов: сколько единиц забронировано в текущих заявках с этого склада — столько и в резерве. Отменили заказ — резерв сразу освободился, без ручного сброса и без «зомби-резерва». На карточке остатка видно, какие именно заказы его бронируют.
Шесть типов событий в истории
Каждое движение единицы классифицируется одним из шести типов: первичный приход от поставщика, приход без документа (для старых данных), приход из перемещения, выход, запланированный выход, текущее состояние. У выхода есть три подтипа: перемещение между складами, подтверждение клиентом и финальная продажа. Менеджер видит ленту событий с понятными формулировками, а не сырые документы.
Богатый фильтр поиска
Поиск по остаткам поддерживает больше 25 параметров: магазин, организация, товар, категория, тип, производитель, характеристики, статус, признак, заказ прихода и расхода, флаг витринности, диапазон закупочных цен, период, способ сортировки и многое другое. Менеджер собирает любую выборку «остатки бренда X на складе Y дороже 50 000 ₽» одним фильтром.
Массовые операции и экспорт
Поддерживаются операции пачкой: обновить поля у выборки единиц, обнулить адреса при реорганизации склада, пометить партию для печати ценников, пересчитать бонусы продавцов, сгенерировать ярлыки и ценники сразу для сотен товаров. Экспорт в Excel с выбором колонок: бухгалтер забирает выгрузку для сверки, менеджер — для собственного анализа.
Что входит в Остатки
- 01
Что хранит запись об остатке
Магазин, товар, организация, ссылки на приходные и расходные заявки, статус («в наличии», «зарезервирован», «списан», «выдан» и другие), закупочная цена, итоговая закупочная цена с учётом расходов, скидка от поставщика, текущая цена продажи, перечёркнутая «старая» цена, выставочная цена, дата последнего изменения цены, категория бонуса продавца от 1 до 10, сам бонус, флаг ручного управления бонусом, признак остатка, цвет ценника, произвольный текст, физический адрес «ряд-стеллаж-полка-ячейка», флаги «витринный образец», «нужно напечатать ценник», «отредактировано», даты прихода и выхода. Удалённые записи мягко скрываются, но не пропадают — их можно восстановить и поднять для аудита.
- 02
11 признаков и их цвета
Каждой единице можно проставить признак: распродажа (оранжевый), неликвид (красный), излишек (синий), новинка (зелёный), хит продаж (жёлтый), уценка (розовый), сезонный (бирюзовый), акционный (фиолетовый), эксклюзив (индиго), брак (малиновый), витринный образец (графит). На карточке остатка и в списке — соответствующий цветной значок. Можно отфильтровать выборку по признаку или сменить признак одним кликом — для индивидуальной единицы или массово.
- 03
Цепочка перемещений между складами
У каждой единицы три ссылки на заявки: первичная заявка прихода (тот самый поставщик, что привёз её к нам впервые — не меняется при перемещениях), текущая заявка прихода (после переезда между магазинами это уже другая заявка — приёмки на новом складе) и заявка выхода (если единица ушла). При перемещении на старой записи проставляется выход, на принимающем складе создаётся новая запись с тем же первичным приходом, но новой текущей. Полная трассировка сохраняется.
- 04
Резолв связей с заявками при возвратах
Когда оформляется возврат от клиента или новая приёмка по сложной цепочке — система сама определяет, какую приходную заявку «привязать» к возникающей единице. Учитывается цепочка перемещений, выбирается корректная исходная заявка. Менеджер не указывает заявки руками — связи протягиваются автоматически и остаются согласованными.
- 05
Резерв считается из активных заказов
Сколько единиц забронировано — это сумма из реальных заявок: учитываются заказы в статусе ожидания с этого магазина, кроме отменённых. Никакого отдельного «резервного» счётчика, который требует ручной синхронизации. Когда клиент оформляет заказ — единица сразу видна как забронированная. Когда заказ отменяют — резерв тут же освобождается. Цифра всегда совпадает с реальным положением дел.
- 06
Кто конкретно забронировал единицу
На карточке остатка видно не просто «зарезервировано 3 штуки», а список конкретных заказов: номер, клиент, магазин-получатель, количество в брони, дата создания заказа, статус заявки. Менеджер при разборе ситуации сразу видит, чьи это заказы, можно ли уточнить или передоговориться. Без копания в журнале заказов.
- 07
Адрес ячейки одной строкой
Физический адрес собирается из четырёх уровней (ряд-стеллаж-полка-ячейка) в одну читаемую строку «А-3-2-7». Если заполнены не все уровни — пустые отбрасываются: «А-3» или просто «А». Сменить адрес единицы — отдельная быстрая операция, без открытия полной карточки. Удобно при перекладке товара на новое место.
- 08
Сколько дней лежит на складе
По каждой единице система считает, сколько дней прошло с момента прихода. Эта цифра подсвечивается в списке остатков: «лежит 247 дней» — повод задуматься о судьбе товара. Параллельно работает автоматическое правило: если единица лежит дольше порога и за это время не было продаж — признак автоматически переключается на «неликвид», она попадает в фокус-список для уценки.
- 09
Услуги сборки на единицу
К конкретной единице товара (например, телевизору или стиральной машине) может быть привязана услуга сборки или установки на дом. На карточке остатка видно, какая услуга предусмотрена. При больших списках остатков услуга подтягивается без повторных запросов — таблица из тысячи строк открывается быстро, без задержек.
- 10
История движений единицы
По каждой единице можно построить полную ленту событий: «1 марта — пришёл от поставщика на склад А», «12 марта — перемещён в магазин Б», «20 марта — принят в магазине Б», «30 марта — продан клиенту». Все связанные документы, контрагенты и магазины подгружаются одним запросом, без задержек на формирование таймлайна. Это рабочий инструмент при разборе спорных ситуаций и гарантийных случаев.
- 11
Классификация событий по смыслу
Каждое событие в истории получает понятный тип: первичный приход от поставщика, приход без приходной заявки (для старых импортированных данных), приход из перемещения с другого склада, выход, запланированный выход (заявка оформлена, но единица ещё на месте), текущее состояние. Выход бывает трёх видов: внутреннее перемещение, подтверждение клиентом, финальная продажа — система сама определяет вид по тому, кто отправитель и кто получатель.
- 12
Цены на единицу
У каждой единицы своя текущая цена продажи, своя «перечёркнутая» прежняя цена (для отображения скидки на ценнике), своя выставочная цена (обычно ниже, потому что витринный образец имеет следы) и дата последнего изменения цены. Сменить цену можно точечно или применить скидку — в этом случае старая цена автоматически фиксируется как «было». Расчёт продажной цены опирается на закупочную, расходы и правила ценообразования.
- 13
Списание со склада
Списание единицы делается отдельной операцией: проставляется соответствующий статус, дата выхода, фиксируется причина. Параллельно формируется акт списания в документообороте. Используется при выявленной порче, утрате, бракованной партии, истечении срока годности или просто для вывода единицы из оборота. История списания сохраняется навсегда.
- 14
Индивидуальный бонус продавца
У каждой единицы — собственная категория бонуса от 1 до 10 и собственная сумма бонуса для продавца. Можно задать вручную (тогда автоматический пересчёт её не трогает) или попросить систему рассчитать рекомендованное значение. Это позволяет ставить разный бонус на разные партии одного товара — например, повысить бонус на старую партию, чтобы продавцы заинтересовались её распродажей.
- 15
Ценники: ярлык и большой ценник
Поддерживаются два типа печатной этикетки: компактный ярлык в нужном размере (на ленточный принтер) и полноценный ценник с цветом фона и произвольным текстом. Можно сгенерировать одиночно или пачкой для целой выборки. Отдельная операция — пометить группу единиц для очередной печати: новые ценники после смены цены или нового прихода готовятся одной кнопкой.
- 16
Сборка комплектов
Несколько отдельных единиц можно собрать в комплект — например, кухонный гарнитур из плиты, холодильника и микроволновки, или подарочный набор. Система проверит, что все компоненты на месте, создаст запись на комплект (со своей ценой и адресом хранения), а компоненты пометит или спишет в зависимости от сценария. Удобно для розничных «комплектов под ключ» и подарочных наборов.
- 17
Массовые операции
Можно выбрать пачку единиц и выполнить операцию для всех сразу: сменить организацию-владельца, обнулить адреса при реорганизации склада, пометить для печати ценников, пересчитать бонусы продавцов, сгенерировать ярлыки и ценники. Сотни строк обрабатываются за один заход. Удобно при сезонных перестановках, переоценках или подготовке к инвентаризации.
- 18
Экспорт с выбором колонок
Перед выгрузкой пользователь видит список доступных колонок (артикул, закупочная, цена, адрес, дней лежит, признак и десятки других) и отмечает нужные. Применяется любой фильтр поиска — выгружается ровно то, что видно в списке. На выходе — Excel или CSV. Используется для инвентаризации, передачи бухгалтерии, аудита. Большие выгрузки идут в фоне и приходят на почту, когда готовы.
- 19
Разграничение доступа по магазинам
Сотрудник магазина автоматически видит остатки только своих точек — в любом разделе, без явных проверок в каждом отчёте. Директор сети видит всё. Защита включается на уровне базы: даже в новом разделе, который разработчик забыл обернуть проверкой, лишние данные не покажутся. Если у пользователя нет прав на запрошенный склад — он увидит пустой список, а не ошибку доступа.
Как это выглядит в системе
Частые вопросы
Сколько единиц хранится в одной записи об остатке?
По умолчанию одна. Если на склад приехало 22 одинаковых холодильника — создаётся 22 отдельные записи. Это даёт серийный учёт: у каждой единицы своя приходная заявка, свой физический адрес, своя индивидуальная закупочная цена, своя судьба от прихода до выдачи. Критично для электроники, мебели, автозапчастей и любых товаров, где важна история конкретной штуки.
Зачем у единицы три ссылки на заявки?
Первая — первичная приходная заявка: тот самый поставщик, который привёз единицу к нам впервые. Эта ссылка не меняется, даже если потом единицу несколько раз переместят между складами. Вторая — текущая приходная заявка: после перемещения это уже приёмка на новом складе. Третья — расходная заявка, по которой единица ушла. Цепочка получается такая: пришла в город А, переехали в Б — на старой записи появилась расходная, в Б создалась новая запись с тем же первичным приходом, но новой текущей.
Как устроен адрес ячейки?
Хранится в четырёх уровнях — ряд, стеллаж, полка, ячейка. На карточке собирается в одну строку «А-3-2-7». Если заполнены не все уровни — пустые отбрасываются: «А-3» или просто «А». Сменить адрес единицы — отдельная быстрая операция. Можно массово обнулить адреса при реорганизации склада. Удобно для адресного хранения, где кладовщик после сканирования штрихкода сразу видит, куда идти.
Какие признаки можно проставлять остатку?
Одиннадцать: распродажа, неликвид, излишек, новинка, хит продаж, уценка, сезонный, акционный, эксклюзив, брак, витринный образец. У каждого свой цвет на карточке. Менять признак можно точечно у одной единицы или массово у целой выборки. Признак используется в фильтрах, в массовых операциях (например, «уценить весь неликвид»), в дашбордах распределения остатков.
Как считается зарезервированное количество?
Прямо из активных заказов, без отдельного «резервного» счётчика. Считается сумма по всем заявкам в статусе ожидания с этого магазина на этот товар, кроме отменённых. Это значит, что цифра всегда совпадает с реальным положением дел: оформили заказ — резерв сразу увеличился, отменили — сразу освободился. Никакой ручной синхронизации, никаких зомби-резервов, которые надо периодически чистить.
Можно ли узнать, какие заказы забронировали единицу?
Да. На карточке остатка отдельная панель показывает список бронирующих заказов: номер, клиент, магазин-получатель, количество в брони, статус заявки, кто оформил. Менеджер при разборе ситуации сразу видит, кто бронирует и можно ли договориться с этим клиентом. Без копания в журнале заказов отдельно.
Как сотрудник магазина видит только свои остатки?
Защита прав работает автоматически на уровне базы: запрос к остаткам всегда дополняется фильтром по доступным складам пользователя. Сотрудник магазина А видит остатки только своих точек, директор сети — все. Даже в новом разделе, который разработчик забыл явно обернуть проверкой, лишних данных не покажется. Если у пользователя нет прав на запрошенный склад — он увидит пустой список, а не сообщение об ошибке.
Что такое история движений?
По любой единице можно построить полную ленту: где и когда появилась, куда переезжала, кому продана. В таймлайн попадают первичный приход от поставщика, перемещения между складами, продажа клиенту, списания. Все связанные документы и контрагенты подгружаются разом, без задержек. Это рабочий инструмент при разборе спорных ситуаций и гарантийных случаев.
Какие события бывают в истории движения?
Шесть типов: первичный приход от поставщика, приход без приходного документа (для старых импортированных данных, где полная история не сохранилась), приход с другого склада в результате перемещения, выход, запланированный выход (документ оформлен, но единица ещё физически на месте), текущее состояние. У выхода ещё три подтипа: внутреннее перемещение между складами, подтверждение клиентом, финальная продажа.
Как система понимает, какой это выход — перемещение или продажа?
По связям отправителя и получателя. Если отправляющий склад совпадает со складом клиента (по факту списание с собственных остатков клиента-магазина) — это подтверждение клиентом, обычно при внутреннем обороте. Если после этого выхода нет следующего прихода на другом складе — это финальная продажа клиенту. Иначе — внутреннее перемещение между складами сети. Менеджер видит уже готовую формулировку.
По каким параметрам можно искать остатки?
Поддерживается больше 25 параметров: магазин, организация, товар, категория, тип, производитель, характеристики, статус, признак, заявки прихода и расхода, флаг витринности, признак готовности к печати ценника, диапазон закупочных цен, текстовый поиск, тип магазина, фильтр выставочных образцов, действие, на каком складе сейчас, номер заказа, диапазон дат, способ сортировки. Один из самых богатых фильтров в системе.
Что такое витринный образец?
Флаг «эта единица стоит на витрине». У витринного образца обычно своя цена — ниже основной, потому что у товара могут быть следы и царапины от витрины. В фильтрах можно отдельно вывести только витринные образцы. Переключить флаг — отдельная быстрая операция. Это для розницы, где витринная единица проживает свою жизнь и продаётся по особой цене в конце сезона.
Зачем флаг «нужен ценник»?
Помечает единицы, для которых требуется напечатать ценник: новый приход, смена цены, переразметка. Можно пометить пачку остатков для очередной партии печати, а потом одной операцией сгенерировать все ценники сразу. После печати флаг переключается, и эти позиции больше не попадают в очередь.
Бывает ли индивидуальный бонус продавца на единицу?
Да. У каждой единицы своя категория бонуса от 1 до 10 и своя сумма бонуса для продавца. Есть флаг «бонус задан вручную» — тогда автоматический пересчёт его не трогает. Можно попросить систему рассчитать рекомендованное значение, можно поставить руками. Это позволяет ставить разный бонус на разные партии одного товара — например, повысить бонус на старую партию, чтобы продавцы заинтересовались её распродажей.
Как изменить цену?
Точечно — отдельной операцией: указываете новую цену и при желании фиксируете старую как «перечёркнутую» для отображения скидки на ценнике. Дата изменения цены фиксируется автоматически для аудита. Или через применение скидки: указываете процент либо сумму, система сама рассчитывает новую цену и фиксирует прежнюю как «было».
Как происходит списание?
Отдельная операция: проставляется статус «списан», дата выхода, фиксируется причина. Параллельно в документообороте формируется акт списания. Используется при выявленной порче, утрате, бракованной партии, истечении срока годности или просто для вывода единицы из оборота. История списания сохраняется навсегда — нужно для аудита и спорных ситуаций.
Что такое сборка комплекта?
Несколько отдельных единиц собираются в один комплект: например, кухонный гарнитур из плиты, холодильника и микроволновки или подарочный набор. Система проверяет, что все компоненты на месте, создаёт запись на комплект (со своей ценой и адресом хранения), а компоненты либо помечает, либо списывает в зависимости от сценария. Удобно для розничных «комплектов под ключ» и подарочных наборов.
Как работает экспорт остатков?
Сначала выбираются нужные колонки из списка доступных (артикул, закупочная, цена, адрес ячейки, дней лежит, признак и десятки других). Применяется любой фильтр поиска — выгружается ровно то, что видно в списке. На выходе — Excel или CSV. Используется для инвентаризации, передачи бухгалтерии, аудита. Большие выгрузки идут в фоне и приходят на почту, когда готовы.
Можно ли быстро получить остатки одного склада или одного товара?
Да, для этого есть отдельные быстрые разделы: «остатки магазина» (всё, что есть на конкретной точке, с фильтрами) и «остатки по товару» (где этот товар лежит во всей сети, сколько и в каком состоянии). Это удобно для оперативных вопросов «есть ли у нас сейчас этот холодильник» и «что на складе А прямо сейчас».
Удаляются ли единицы физически?
Нет. Удалённая единица мягко скрывается, но остаётся в базе. История её движений сохраняется. При необходимости запись можно восстановить или поднять для аудита — например, чтобы ответить на вопрос «была ли эта единица у нас в день X». Это критично для бухгалтерии, аудита налоговой и юридических разбирательств.
Какие массовые операции поддерживаются?
Обновить поля у выборки единиц (например, сменить организацию-владельца у партии), обнулить адреса при реорганизации склада, пометить группу для печати ценников, пересчитать бонусы продавцов, сгенерировать ярлыки и ценники сразу для сотен товаров, массово сменить признак (например, перевести всю партию в уценку). Все операции идут пачкой — сотни строк обрабатываются за один заход.
Что меняется на реальной сети
- Было
- В старой системе остаток вёлся одной цифрой на товар-склад. Пять холодильников — это «5» в одной колонке. Серийные номера, индивидуальные закупочные цены, история «откуда какой пришёл» — всё лежало в отдельных Excel-файлах. При гарантийном случае серийник искали час, доказательство происхождения — целый день.
- Сделали
- Перевели на учёт по единицам: пять холодильников — это пять отдельных строк в остатках. У каждой своя приходная заявка, своя первичная приходная заявка, своя физическая ячейка, своя индивидуальная закупочная цена. Приёмки и возвраты создают по одной записи на каждую физическую единицу.
- Стало
- Каждый серийный холодильник в базе со своей историей. Гарантийный случай — открываем карточку единицы, видим приходную заявку, дату, поставщика, документы. Бухгалтерия видит индивидуальную закупочную каждой единицы и считает реальную маржу по конкретной продаже. Аудит налоговой по серийникам — за полчаса.
- Было
- При перемещении холодильника из магазина А в Б терялась связь с первичным поставщиком. В принимающем магазине единица записывалась как новый приход, история обрывалась. При гарантии и спорах с поставщиком не могли быстро доказать «пришла к нам через ваш склад в марте».
- Сделали
- Включили учёт цепочки приходных заявок. При перемещении на отправляющей записи появляется расходная заявка, на принимающем складе создаётся новая запись с тем же первичным приходом (исходный поставщик сохраняется), но новой текущей приходной заявкой (перемещение). История не теряется. По любой единице можно поднять весь путь.
- Стало
- Полный таймлайн единицы: «1 марта — пришёл от поставщика А на склад Б», «10 марта — перемещение в магазин В», «20 марта — продан клиенту». При споре открываем историю — поставщик не может сказать «не мой», есть первичная приходная заявка с его подписью.
- Было
- Кладовщики долго искали товар на складе. Адрес хранился неструктурированно: «у дальней стены», «возле въезда». Новые сотрудники тратили дни на освоение, при ротации возникал хаос. Сборка заказа на 50 позиций занимала 2 часа.
- Сделали
- Включили адресное хранение по схеме «ряд-стеллаж-полка-ячейка». У каждой единицы — конкретный физический адрес «А-3-2-7». Можно точечно сменить адрес единицы или массово обнулить при реорганизации склада. На ТСД после сканирования штрихкода кладовщик сразу видит, куда идти.
- Стало
- Кладовщик идёт по конкретной траектории «А-3, А-7, B-1», а не бегает по складу. Сборка заказа на 50 позиций — 30 минут вместо двух часов. Новые сотрудники начинают работать в первый же день — не нужно учить «где что лежит».
- Было
- Сезонные товары после распродажи становились «вечным» неликвидом. Их не было видно в отчётах среди обычных остатков. Через год обнаруживали 200–300 позиций, лежащих по году. К моменту разбора сезон уже два раза прошёл — продавать невозможно.
- Сделали
- Включили признаки остатка. Ежедневно работает автоматическое правило: если единица лежит дольше порога и за это время не было продаж — признак переключается на «неликвид». Отдельный дашборд показывает агрегаты по 11 признакам. Из фильтра можно одной кнопкой собрать всю выборку неликвида.
- Стало
- Менеджер открывает дашборд и видит «247 единиц с признаком неликвид». Запускает массовую уценку: меняет признак на «уценка», ставит новую цену, отправляет на печать ценники. Через две недели 70% распродано. Старые неликвиды больше не накапливаются годами.
- Было
- Сайт и касса работали по разным остаткам — сайт читал старую модель остатков, касса — реальные единицы. Изредка возникали двойные продажи: клиент купил последний холодильник на сайте, через минуту его же продали в магазине. Возвраты денег, негатив.
- Сделали
- Перевели всё на единый учёт по единицам. Резерв считается напрямую из активных заказов. Когда клиент оформляет заказ на сайте — единица сразу видна как забронированная. Касса при попытке продать ту же единицу видит, что она зарезервирована, и отказывает в продаже.
- Стало
- Двойных продаж нет. Резерв всегда соответствует реальным заказам — не накапливается зомби-резерв. При отмене заказа единица автоматически освобождается. Сайт, касса и маркетплейсы работают по одной правде.
- Было
- Сотрудник магазина мог через прямую ссылку смотреть остатки другого магазина. Иногда возникали утечки «у конкурентов вот столько того». Контроль прав делался вручную в каждом разделе — иногда разработчики забывали добавить проверку.
- Сделали
- Подключили автоматический фильтр прав по магазинам. Любой запрос к остаткам автоматически дополняется фильтром по доступным пользователю точкам. Сотрудник одного магазина физически не видит остатки других — даже через прямую ссылку или подмену параметров. Директор сети видит всё.
- Стало
- Утечек больше нет. Новые разделы автоматически защищены — не нужно помнить «добавить проверку». Аудит безопасности проходит без замечаний. Бизнес-логика и контроль прав чётко разделены.
Как модуль помогает розничной сети
Учёт по единицам: одна запись на каждую физическую штуку
Главная особенность учёта остатков в AIERP — одна запись на каждую физическую единицу товара, а не одна строка с количеством. 22 фактических холодильника одной модели на складе — это 22 отдельные строки в журнале остатков. Это отличается от типовых систем, где остаток хранится как «товар плюс склад → количество» одной строкой.
Зачем так сделано. Первый сценарий: серийный учёт. У каждой единицы своя приходная заявка (по которой пришла к нам), своя индивидуальная закупочная цена, свой физический адрес ячейки. При гарантийном случае открываем карточку этой единицы — видим всю историю. Второй сценарий: индивидуальная цена. У каждой единицы свой ценник: после уценки витринного образца, после акции по конкретной партии, после смены курса валют — цены могут различаться внутри одного товара. Третий сценарий: трассировка перемещений. При переезде единицы между магазинами сохраняется первичная приходная заявка от исходного поставщика, а текущая обновляется на заявку перемещения.
У каждой записи об остатке хранятся: магазин, товар, организация-владелец, ссылки на приходные и расходные документы и заявки, статус («в наличии», «зарезервирован», «выдан», «списан» и другие), закупочная цена, итоговая закупочная цена с учётом расходов, скидка от поставщика, цена продажи, перечёркнутая «старая» цена, выставочная цена, дата последнего изменения цены, категория бонуса продавца, сам бонус, признак ручного управления бонусом, признак остатка, цвет ценника и произвольный текст, четыре уровня физического адреса, флаги витринности и готовности ценника, даты прихода и выхода. Удалённые записи мягко скрываются, чтобы оставалась полная история для аудита.
Цепочка приходных заявок: трассировка партии
У каждой единицы три ссылки на заявки. Первая — первичная приходная заявка: та самая, что привезла единицу к нам впервые от поставщика. Эта ссылка остаётся неизменной, даже если потом единицу переместят несколько раз между магазинами сети. Вторая — текущая приходная заявка: после перемещения это уже другая заявка, относящаяся к складу-приёмнику. Третья — расходная заявка: та, что отправила единицу дальше (если установлена, единица «ушла»).
Алгоритм перемещения. На отправляющей записи проставляется расходная заявка (заявка перемещения) и дата выхода. Статус меняется на «в пути» или «выдан». На принимающем складе создаётся новая запись: первичная приходная заявка копируется с исходной (исходный поставщик сохраняется), текущая приходная — это уже заявка перемещения, физический адрес — новый. Связь между записями обеспечивает общая первичная приходная заявка: она одинаковая на всей цепочке.
Это даёт полную трассировку. История движений по любой единице собирается одним запросом: проходит по всем трём ссылкам, подтягивает связанные документы, заказы, магазины и организации без задержек на формирование таймлайна. Каждое событие в истории классифицируется по смыслу — приход, перемещение, продажа, списание — и приходит на карточку с понятной формулировкой.
Параллельно работает аналитика на уровне товара: те же события группируются не по единице, а по всему ассортименту — «сколько этого товара пришло за месяц», «сколько ушло». Один общий движок классификации событий обслуживает оба уровня — карточку единицы и карточку товара — поэтому интерпретации событий всегда согласованы.
Шесть типов событий и три подтипа выхода
Каждое движение единицы классифицируется одним из шести типов. Первичный приход от поставщика — самое первое появление единицы в системе. Приход без приходной заявки — для старых импортированных данных, где документов нет, но факт прихода зафиксирован. Приход из перемещения — единица переехала с другого склада сети. Выход — единица ушла со склада. Запланированный выход — заявка оформлена, но единица ещё физически на месте (например, согласовали отгрузку на завтра). Текущее состояние — единица сейчас на остатке, никакого выхода ещё не было.
У выхода три подтипа. Если отправляющий склад совпадает со складом клиента — это подтверждение клиентом, по сути списание с собственных остатков клиента-магазина (обычно при кросс-продаже или внутреннем обороте). Если после этого выхода нет следующего прихода ни на одном другом складе сети — это финальная продажа клиенту. В остальных случаях — внутреннее перемещение между складами.
Это даёт правильную семантику событий: «продано», «передано в другой магазин», «принято на складе» — без догадок «что значит этот документ». Менеджеру и аудитору не нужно интерпретировать сырые заявки — событие приходит с готовой формулировкой и понятным типом.
Один и тот же классификатор используется и в карточке единицы (где видна история одной штуки), и в карточке товара (где видна динамика поступлений и продаж всего ассортимента). Это гарантирует согласованность: одно и то же физическое событие классифицируется одинаково в двух разных интерфейсах.
Одиннадцать признаков остатка и автоматические правила
Признак остатка — это короткий ярлык, который помогает быстро ориентироваться в большом ассортименте. Распродажа, неликвид, излишек, новинка, хит продаж, уценка, сезонный, акционный, эксклюзив, брак, витринный образец — у каждого свой цвет на карточке и в списке.
Зачем такое разнообразие. Хит продаж — товары с высокой оборачиваемостью, для которых важно не уйти в пустую полку. Уценка — для единиц с известным дефектом (царапина, вскрытая упаковка), которые стоят дешевле, и это нужно видеть. Неликвид — единицы, лежащие дольше определённого срока, кандидаты на массовую распродажу. Брак — единицы, которые нужно отделить от продаваемых физически и в учёте. Витринный образец — экземпляр на полке зала с собственной выставочной ценой.
Сменить признак можно точечно у одной единицы или массово у целой выборки (например, «уценить весь неликвид на 30%»). Дашборд показывает агрегат по 11 признакам — менеджер сразу видит «247 единиц в неликвиде, нужно действие». Фильтр по признаку доступен во всех отчётах и списках.
Параллельно работают автоматические правила. Каждый день система пересчитывает признаки. Например: если единица лежит дольше 90 дней и за этот период не было ни одной продажи — признак автоматически меняется на «неликвид». Если у товара мало единиц и продажи стабильно высокие — признак ставится на «хит продаж». Эти автоматические переходы освобождают менеджера от рутины ручного пересчёта.
Резерв из реальных заказов: никаких отдельных счётчиков
Главная боль типовых складских систем — рассинхронизация «резервной таблицы» с фактическим состоянием заказов. Кто-то отменил заказ, резерв должен освободиться, но не освобождается. Накапливаются «зомби-резервы», которые периодически приходится сбрасывать руками. AIERP решает это иначе.
Зарезервированное количество не хранится отдельным счётчиком. Оно считается напрямую из активных заказов в момент обращения: сколько единиц этого товара забронировано в заявках с этого магазина в статусе ожидания, кроме отменённых заказов. Если статус единицы не «в наличии» — резерв ноль (зарезервировано может быть только то, что есть в наличии).
Это даёт «честный» резерв. Кто-то отменил заказ — заявка перестаёт попадать в подсчёт, резерв уменьшился. Кто-то оформил новый заказ — заявка появилась, резерв увеличился. Нет рассинхронизации, нет зомби-резервов, нет операций «сбросить резервы».
На карточке остатка отдельная панель показывает не просто «зарезервировано 3 штуки», а список конкретных заказов: номер, клиент, магазин-получатель, количество в брони, статус заявки, кто оформил, когда. Менеджер при разборе ситуации сразу видит, чьи это заказы и можно ли уточнить или передоговориться — без копания в журнале заказов отдельно.
Автоматическая защита прав доступа
Разграничение доступа к остаткам по магазинам работает автоматически, без явных проверок в каждом разделе. Это критично для безопасности: даже если разработчик забудет добавить проверку в новый раздел — лишние данные не покажутся.
Алгоритм такой: при любом запросе к остаткам система автоматически дополняет его фильтром по доступным пользователю магазинам. Сотрудник одной точки видит только остатки своих магазинов. Директор сети или бэк-офис, у которых нет ограничений по точкам, видят всё.
Бонус для удобства: даже на странице с явным фильтром по магазину, если у пользователя нет прав на запрошенную точку, запрос вернёт пустой список, а не ошибку. Это правильнее, чем «нет доступа», потому что для безопасной системы само существование данных тоже секрет.
Та же логика применяется не только к остаткам, но и к заказам, позициям заказов, документам. Единый механизм даёт согласованное поведение во всей системе. Настройка — через список доступных пользователю магазинов, который может включать прямую привязку точек или вычисление через роль и регион.
Массовые операции, экспорт, ценники
Работа с остатками — один из самых нагруженных участков ERP. Поддерживаются десятки операций: посмотреть остатки одного склада, посмотреть остатки одного товара по всей сети, сгенерировать ярлык в нужном размере, сгенерировать полный ценник, посмотреть бронирующие заказы, поднять историю движений единицы, экспортировать в Excel, массово обнулить адреса при реорганизации, массово обновить поля у выборки, пометить группу для печати ценников, пересчитать бонусы продавцов, применить скидку, сменить цену, сменить признак, переключить флаг витринности, списать со склада, собрать комплект из нескольких единиц.
Массовые операции работают через выбор пачки единиц в списке. Удобно при сезонных перестановках, переоценках, переводе партии под новую организацию, подготовке к инвентаризации. Сотни строк обрабатываются за один заход без необходимости открывать каждую карточку.
Ценники — два варианта. Компактный ярлык в нужном размере для ленточного принтера и полноценный ценник с цветом фона и произвольным текстом. Можно сгенерировать одиночно или пачкой. Отдельная операция — пометить группу единиц для очередной печати (новый приход, смена цены, переразметка); после печати флаг переключается, и эти позиции уходят из очереди.
Экспорт устроен в два шага. Сначала пользователь видит список доступных колонок (артикул, закупочная, цена, адрес ячейки, дней лежит, признак и десятки других) и отмечает нужные. Применяется любой фильтр поиска — выгружается ровно то, что видно в списке. На выходе — Excel или CSV. Большие выгрузки идут в фоне и приходят на почту, когда готовы.
Готовы автоматизировать?
Покажем модуль на ваших данных и подключим за 1–2 недели.
