В оптовой торговле оборудованием запрошенное количество регулярно превышает остаток: клиенту нужно 500 домкратов, а на складах сейчас 309. Типовой интернет-магазин в этой ситуации предлагает купить столько, сколько есть, - и молча теряет остальной спрос. Клиент уходит договариваться по телефону, а магазин даже не узнаёт, что у него только что спросили ещё 191 штуку.
Вторая особенность оптовой покупки - её длительность. Корзину собирают днями, согласовывают с руководителем, возвращаются к ней через неделю. За это время цены и остатки успевают измениться, и типовой магазин принимает заказ по устаревшим данным - а менеджеру потом приходится обзванивать клиентов и извиняться.
Требовалось решение, при котором ни спрос, ни доверие клиента не теряются.
Решение
Два контура: наличие и предзаказ
Корзина состоит из двух контуров. "В наличии" - то, что можно купить и оформить заказом прямо сейчас. "Предзаказ" - то, чего сейчас нет: он уходит в 1С отдельной заявкой, и с клиентом связывается менеджер.
Граница между контурами проводится автоматически. Клиент запросил 500 - система сама отнесла 309 к контуру "в наличии", 191 - к предзаказу, и сообщила об этом покупателю. Ни одна единица запрошенного не потерялась: весь спрос, включая неудовлетворённый, передан в 1С и виден отделу продаж.
Причём "доступно" - это склад плюс товары в пути: граница между контурами проходит не по остатку на полке, а по всей цепочке поставки. Под будущие приходы можно покупать - это продолжение решения из разбора про склады и поставки.
Корзина, которой можно верить
Сверка цен и остатков стоит на трёх рубежах: при каждом открытии корзины, при входе в оформление и в момент создания заказа. Заказ физически не может уйти в 1С с устаревшей ценой или несуществующим остатком - даже если корзину собирали неделю.
На каждом рубеже к каждой позиции применяются четыре правила:
Правила сформулированы в пользу покупателя. Цена изменилась - обновляется без лишнего шума: покупатель всегда платит по действующему прайс-листу. Товар временно недоступен - позиция целиком переносится в предзаказ с понятным объяснением: намерение купить сохраняется, и когда товар вернётся, менеджер свяжется с клиентом первым. Остатка не хватает - в корзине остаётся доступное количество, излишек переносится в предзаказ, причём к уже лежащему там количеству он прибавляется, а не создаёт дубль.
Продажа начинается до регистрации
Предзаказ доступен гостю: посетитель собирает заявку без единой формы регистрации. При входе в личный кабинет накопленное сливается с личным предзаказом - по каждому товару количества складываются, ничего не теряется и не дублируется.
Насколько это востребовано, показывают данные рабочего сервера: из 526 позиций контура предзаказа 344 - примерно две трети - добавлены гостями, до входа в личный кабинет. Если бы предзаказ требовал регистрации, большая часть этого спроса не дошла бы до отдела продаж вовсе.
Отправка предзаказа устроена как финансовая операция: документ и все его позиции создаются одной транзакцией - либо целиком, либо никак, половинчатых состояний не существует. Каждый шаг фиксируется в журнале, а созданный документ немедленно помечается к передаче в 1С.
Excel вместо ручного набора
Снабженцы ведут заявки в своих учётных системах, и заставлять их перебивать 30 позиций руками - значит терять заказы. Поэтому корзина понимает Excel в обе стороны.
Файл "артикул - наименование - количество" загружается в корзину целиком: строки распознаются по артикулу, затем по названию, найденное добавляется с проверкой цены и остатков, по нераспознанным строкам выдаётся понятный отчёт. Выгрузка корзины обратно даёт файл того же формата - его можно править в Excel и загружать снова, круг замыкается.
Для длинных согласований есть сохранённые корзины: снимок текущей корзины с собственным именем хранится три месяца - к нему можно вернуться, пересчитать по актуальным ценам и оформить.
Как это устроено внутри
Общая картина - на схеме: сервис сверки стоит в центре, оба контура сходятся в 1С.
| Решение | Как сделано |
|---|---|
| Два контура | "В наличии" - штатная корзина платформы с зафиксированными ценами; предзаказ - собственное хранилище (документ + позиции), не зависящее от механики заказов |
| Три рубежа | Один сервис пересчёта вызывается из корзины, из оформления и непосредственно перед созданием заказа - последний вызов делает устаревшие данные в заказе невозможными |
| Правила сверки | Цена из собственного прайс-слоя (персональные цены сегмента покупателя), остаток - склад плюс товары в пути; четыре исхода: оставить, обновить цену, перенести излишек, перенести позицию целиком |
| Перенос излишка | Излишек прибавляется к существующей позиции предзаказа, а не дублирует её; после слияния при входе первый пересчёт пропускается - защита от задвоения |
| Гостевой контур | Позиции живут на анонимном идентификаторе покупателя; при авторизации сливаются в личный кабинет с суммированием по товарам |
| Отправка предзаказа | Транзакция БД: создание документа и деактивация позиций - атомарно; пошаговый журнал; событийная пометка к экспорту в 1С срабатывает на уровне ядра при любом способе создания документа |
| Excel-импорт | До 10 МБ, распознавание по точному артикулу с запасным поиском по названию, проверка доступности каждой строки, отчёт "всего / найдено / добавлено / ошибки" |
| Excel-выгрузка | Формат выгрузки полностью совпадает с форматом загрузки - файл проходит цикл "сайт → Excel → сайт" без преобразований |
Что это дало бизнесу
| Раньше | Стало |
|---|---|
| Спрос сверх остатка терялся молча | Весь запрошенный объём уходит в 1С: доступное - заказом, остальное - предзаказом |
| Заказ мог уйти по устаревшей цене | Три рубежа сверки: заказ не может уйти в 1С с устаревшей ценой или несуществующим остатком |
| Предзаказ - только звонком менеджеру | Клиент собирает заявку сам; две трети позиций предзаказа появляются ещё до регистрации |
| Гостевая корзина пропадала при входе | Слияние с суммированием по товарам: ничего не теряется и не дублируется |
| 30 позиций - 30 раз "добавить в корзину" | Заявка загружается из Excel одним файлом - и выгружается обратно в том же формате |
| Долгое согласование - пересбор корзины заново | Сохранённые корзины хранятся три месяца - с пересчётом по актуальным ценам при возврате |
В цифрах
| Показатель | Значение |
|---|---|
| Позиций в контуре предзаказа | 526, из них 423 активны прямо сейчас |
| Позиций предзаказа, созданных гостями до регистрации | 65% |
| Оформленных предзаказов | 32, до 21 позиции в заявке |
| Рубежей сверки цен и остатков | 3: корзина, оформление, создание заказа |
| Позиций в активных корзинах | 749 у 231 покупателя |
| Хранение сохранённых корзин | 3 месяца, с пересчётом цен при возврате |
| Размер Excel-файла заявки | до 10 МБ |
Двухконтурная корзина - часть большой B2B-платформы: каталог, дилерский кабинет и двусторонний обмен с 1С. Что вошло в проект целиком - в кейсе B2B e-commerce платформы.



