Продавать оборудование по всей стране мало - нужно ответить покупателю на вопрос "а оно есть?". В компании с партнёрской сетью и импортными поставками простого ответа не существует: он зависит от того, кто спрашивает.
Розничному клиенту важно, есть ли товар поблизости: он выбирает между "заберу сегодня" и "подожду доставку". Дилеру важно другое - сколько единиц он может законтрактовать и когда придёт следующая партия. Он планирует закупку на месяцы вперёд и продаёт в том числе то, что ещё в пути.
При этом точный остаток - коммерческая информация. Знать, что на складе осталось три единицы, - значит понимать переговорную позицию поставщика. Показывать это всем покупателям нельзя.
Одна витрина должна отвечать на один и тот же вопрос по-разному - и не ошибаться ни в одной цифре.
Почему это не решается стандартным остатком
Стандартный интернет-магазин показывает всем одно и то же: число на складе или ярлык "в наличии". В этой задаче оба варианта не работают - по трём причинам.
- →Ответ зависит от того, кто спрашивает. Рознице нужна география: есть ли товар в её городе. Дилеру география не важна - ему нужны точка входа товара в сеть и объём, который можно законтрактовать.
- →Точное число - переговорная позиция. Показать всем, что осталось три единицы, - значит раскрыть свои запасы. Показать всем ярлык "в наличии" - не дать дилеру данных для планирования закупки.
- →Дилер покупает не остаток, а план поставок. Он заказывает под будущие партии, которых на складе ещё нет. Стандартная витрина знает только "есть" и "под заказ" - без количеств и дат.
Решение
Один товар - два разных ответа
Вот один товар в один и тот же момент времени - глазами двух покупателей.
Розничный клиент видит географию: товар есть в двенадцати городах, где-то много, где-то мало. Этого достаточно, чтобы принять решение.
Дилер видит центральный склад в точных числах и, главное, график поставок: около 170 штук придёт в начале августа, ещё около 700 и около 250 - в сентябре. Поэтому он может заказать больше тысячи штук, хотя физически на складах лежат несколько десятков. Он покупает не остаток, а план поставок.
Это не выдача "под заказ" с неопределённым сроком: каждая партия названа количеством и датой. Всего в системе одновременно учитывается около шести миллионов единиц товара в пути - по 790 позициям. Горизонт планирования - до четырёх месяцев вперёд: дилер видит не только ближайшую поставку, но и весь график - когда придёт партия, которой хватит на квартал.
География: 17 складов
Семнадцать складов: Урал, Сибирь, Поволжье, Москва. Наличие по ним обновляется вместе с выгрузками из 1С, поэтому покупатель видит актуальные данные, а не вчерашние.
Распределение ассортимента объясняет, почему дилеру важнее центральный склад, чем география. Три четверти всех товарных позиций лежат в Екатеринбурге - через него товар входит в сеть и оттуда расходится по стране. Региональные склады держат ходовые позиции для розницы поблизости.
Города - это фасад
За "Москвой" в карточке товара стоит склад регионального партнёра, за "Волгоградом" - сразу два партнёрских юридических лица. Покупателю эта организационная структура не нужна и не показывается: он видит город и наличие в нём.
Внутри система ведёт три уровня: город на витрине, склады учётной системы под ним и детальные остатки - по каждому складу, товару и дате прихода. Остатки суммируются снизу вверх, и число в карточке всегда равно сумме того, что лежит на складах партнёров.
Такая развязка даёт компании свободу: партнёр в городе может смениться, склад - разделиться на два юридических лица, и витрина при этом не потребует изменений.
Кому что видно - решает 1С
Картину наличия задают два переключателя, и оба приходят из учётной системы.
Первый - набор складов: какие города видит сегмент покупателей. Это не настройка в административной панели сайта, а отдельная выгрузка из 1С: у коммерческой политики единственный источник истины, и сайт не может разойтись с ней.
Второй - право видеть поставки: показывать ли точные числа и даты будущих приходов. Его получают дилеры.
Показательно, что "больше прав" здесь означает не "больше складов". Рознице открыта вся география, но в качественной оценке - "много" или "мало". Дилеру открыты центральный склад и Нижний Тагил, зато в точных числах и с планом поставок. И это именно расширение возможностей: весь импорт входит в сеть через один центральный склад и уже оттуда расходится по стране, поэтому дилеру нужна точка входа товара, а не витрина городов. География важна рознице, центральный склад - профессиональному покупателю.
Сколько можно купить
Для каждого покупателя система считает максимум к заказу: сумма остатков на доступных ему складах плюс - если ему открыты поставки - всё, что уже в пути. Именно это число ограничивает корзину. Поэтому дилер добавляет в заказ больше тысячи штук при нескольких десятках на складе, а розничный клиент - около трёхсот: обе цифры верны, просто рассчитаны для разных условий.
Как это устроено внутри
| Решение | Как сделано |
|---|---|
| Модель складов | Три уровня: городской склад витрины → склад учётной системы (в том числе партнёрское юридическое лицо) → детальный остаток в разрезе "склад × товар × дата прихода". Связь по кодам из 1С, суммы сходятся на каждом уровне |
| Видимость складов | Множественное свойство сегмента покупателей со списком складов; заполняется выгрузкой из 1С, а не вручную. Гость и непрошедший модерацию клиент получают набор складов по умолчанию |
| Право на поставки | Признак на разделе справочника сегментов: сегмент наследует его принадлежностью к разделу - новый дилерский сегмент из 1С получает права автоматически |
| Качественный режим | Пороги "много / мало" задаются на вид номенклатуры, с общим значением по умолчанию: у крепежа и у подъёмников "много" - разные числа |
| Максимум к заказу | Сумма доступных остатков плюс товары в пути (для тех, кому они открыты); одно число ограничивает и карточку, и корзину |
| Поставки | Партии группируются по "товар + город + дата прихода": несколько складов учётной системы с приходом на одну дату сливаются в одну строку графика |
| Свежесть данных | Наличие рассчитывается вне кеша страницы, отдельным механизмом отложенного контента: страница отдаётся из кеша, а остаток остаётся актуальным |
| Нагрузка | В каталоге остатки для всей страницы считаются одним пакетным вызовом - несколько запросов на страницу независимо от числа товаров |
| Дата самовывоза | Если склад точки покрывает всю корзину - 3 дня; если корзину покрывает соседний склад сети - 5 дней (переброска); иначе - 15 дней (заказ у поставщика). Расчёт идёт по всем точкам сразу, покупателю показывается диапазон дат |
Почему "много / мало" - это ветка расчёта, а не отдельный шаблон. Сделать две версии карточки кажется проще, но тогда пришлось бы поддерживать две ветки вёрстки и следить, чтобы они не разошлись. Вместо этого режим переключается одним условием в расчёте наличия: на выходе либо числа, либо статусы, а шаблон один. Добавить сегмент с новыми правилами - значит изменить данные в 1С, а не код сайта.
Что это дало бизнесу
| Раньше | Стало |
|---|---|
| "Есть ли товар?" - вопрос менеджеру по телефону | Ответ в карточке, у каждого покупателя свой и всегда актуальный |
| Точные остатки видны всем или никому | Точные числа - только дилерам; рознице - "много / мало", без раскрытия переговорной позиции |
| О поставках дилер узнаёт у менеджера | График поставок в карточке: количество и дата каждой партии на месяцы вперёд |
| Продать можно только то, что лежит на складе | Дилер заказывает под будущую поставку: больше тысячи штук при нескольких десятках на складе |
| Партнёрская сеть видна покупателю | Покупатель видит города; смена партнёра или разделение склада на юридические лица витрину не меняют |
| Правила видимости - настройки на сайте, живущие своей жизнью | Правила приходят из 1С: новый сегмент и его права появляются на сайте без участия разработчика |
В цифрах
| Показатель | Значение |
|---|---|
| Складов на витрине | 17 городов: от Москвы до Красноярска |
| Складов в учётной системе за ними | 22, включая партнёрские юридические лица |
| Записей о наличии | 11 086 по 8 538 товарам |
| Детальных остатков | 14 636 записей в разрезе "склад × товар × дата" |
| Товаров в пути | 790 позиций, около 6 млн единиц |
| Горизонт планирования поставок | до 4 месяцев вперёд |
| Сегментов покупателей | 19, из них 11 видят точные числа и график поставок |
| Обновление наличия | вместе с выгрузками из 1С; очередь проверяется каждые ~10 секунд |
| Расчёт наличия на странице каталога | один пакетный вызов независимо от числа товаров |
Картина наличия - часть большой B2B-платформы: каталог, дилерский кабинет и двусторонний обмен с 1С. Что вошло в проект целиком - в кейсе B2B e-commerce платформы.



