E-commerce и бизнес

Несколько складов — одна цена товара не работает: почему движки магазинов это не считают

Типовой движок интернет-магазина хранит цену товара как одно число. Как только появляется второй склад со своей закупочной ценой или оптовый уровень для постоянного клиента, эта модель ломается. Разбираем, почему так, и что пришлось посчитать в ядре собственного движка LiteShop.

9 сентября 2026 г.
3 мин чтения

В большинстве движков интернет-магазинов цена товара — это одно число в одном поле базы данных. Работает безупречно, пока магазин имеет один склад и продаёт всем по одной цене. Проблема возникает, как только появляется второй склад со своей закупочной стоимостью или оптовый покупатель, которому нужна другая цена за тот же товар.

Эта статья о том, почему «один товар — одна цена» ломается именно в этой точке, и что пришлось посчитать в ядре собственного движка LiteShop, чтобы этого избежать.

Где именно ломается модель с одной ценой

Представим магазин с двумя складами: один в Киеве, товар туда завезли по старой закупочной цене, второй во Львове — та же позиция, но завезённая позже и дороже. Классический движок, в котором цена привязана к товару, а не к паре «товар + склад», заставляет выбирать: либо держать две разные товарные записи для одной и той же позиции (и путать покупателя выбором «одинакового» товара дважды), либо продавать с одного склада себе в убыток, пока не выровняется средняя закупочная.

Та же проблема с оптовыми уровнями: постоянный клиент с заказами на сумму выше определённого порога должен получать другую цену за тот же артикул, чем розничный покупатель. Если цена — одно поле, это требует либо ручной системы скидок поверх стандартного движка, либо отдельного прайса, который синхронизируется вручную и расходится с основным каталогом за первую же неделю.

Что это значит для архитектуры, а не только для интерфейса

Правильное решение — не косметическое (добавить поле «скидка» в карточку товара), а структурное: цена должна принадлежать паре «товар + склад» и дополнительно модифицироваться уровнем покупателя. Это означает отдельную таблицу цен, а не одно поле, и логику выбора правильной строки цены при каждом просмотре карточки товара и каждом расчёте корзины — без замедления страницы, потому что этот расчёт происходит на каждом запросе.

Мы строили эту логику в ядре собственного движка LiteShop: несколько складов с разной закупочной ценой одного товара, уровни оптовых цен и складской учёт — не надстройка поверх типового движка, а часть того, как построена модель товара с самого начала. 42 модуля ядра (доставка, оплата, склад, лояльность, SEO) включаются переключателем в админке, а не устанавливаются отдельными плагинами, которые потом конфликтуют друг с другом.

Не замедляет ли это магазин

Дополнительная логика расчёта цены на каждый просмотр — естественный вопрос о скорости. На проде одного из магазинов, построенных на этом движке (Hetzner cx43), первый ответ главной страницы холодный равен тёплому — 167 мс, замер 19.05.2026. Это возможно именно потому, что расчёт цены по складу и уровню клиента кешируется в Redis: замеры 12.06.2026 показали 98,3% попаданий в кеш при нуле вытесненных ключей — то есть кеш не успевает переполняться и удалять актуальные данные даже под живой нагрузкой.

Чего движок пока не делает — честно

Резервирование товара с таймером в корзине отсутствует: остаток списывается во время оформления заказа, не в момент добавления в корзину. Импорта каталога напрямую из OpenCart нет. Интеграции с Rozetka Delivery и Meest пока заглушки, не рабочая функция. Эти ограничения — не спрятаны мелким шрифтом, а прямо озвучены: движок молодой, и множественные склады с оптовыми уровнями — это та часть, которую сделали крепкой с первого дня, а остальное достраивают последовательно.

Кому это вообще нужно

Если у вас один склад, несколько сотен товаров и нет планов на оптовые уровни или доработки — типовой движок или аренда конструктора обойдутся дешевле, и честный разбор задачи скажет это первым письмом, а не после оплаты. Потребность в структурном решении возникает от двух складов или поставщиков, от необходимости в оптовых уровнях цен, или когда типовой конструктор уже упирается в собственные ограничения.

Теги

E-commerce

🤔Вам понравилась статья?

Ваше мнение помогает нам создавать лучший контент

Поделитесь с друзьями

Нашли что-нибудь полезное? 🚀

Помогите другим узнать это — поделитесь статьей в социальных сетях

https://lionex.com.ua/blog/kilka-skladiv-odna-cina-tovaru-ne-pracyuye

💚 Спасибо, что помогаете нам расти

Владислав Чистяков

Пишет о том, что делает руками: интернет-магазины на OpenCart, приложения на Next.js, интеграции и скорость сайтов. В статьях — замеры и проверки, которые читатель может повторить на своём проекте, а не общие советы. Коммерческая разработка с 2015 года.

Частые вопросы

Ответы на популярные вопросы по теме

Поле «скидка» решает только одну ситуацию — одну скидку для всех. Как только нужна разная цена в зависимости от склада (из-за разной закупочной стоимости) и одновременно разная цена в зависимости от уровня клиента (розница/опт), одного числа-скидки не хватает: нужна таблица, учитывающая оба фактора одновременно, а не одно поле поверх другого.

На проде одного из магазинов на этом движке первый ответ главной страницы — 167 мс, холодный равен тёплому (19.05.2026), а Redis-кеш даёт 98,3% попаданий при нуле вытесненных ключей (12.06.2026). Расчёт кешируется, поэтому повторные просмотры не пересчитывают цену каждый раз заново.

Сейчас прямого импорта из OpenCart нет — это честно указанная граница текущей версии движка, не спрятанная мелким шрифтом.

Нет, резервирования с таймером в корзине нет: остаток списывается в момент оформления заказа, а не при добавлении в корзину.

Если склад один, товаров несколько сотен и оптовых уровней или доработок не планируется — типовой движок или аренда конструктора обойдутся дешевле. Структурное решение имеет смысл от двух складов или поставщиков либо от потребности в оптовых уровнях цен.

Получайте лучшие статьи на почту

Подпишитесь на нашу рассылку и получайте полезные советы, инсайты и новости о веб-разработке, маркетинге и бизнесе.

Мы уважаем вашу конфиденциальность. Отписаться можно в любой момент.

Похожие статьи

Все статьи
154 ошибки типов, которые выбрасывала сборка: что в них нашлось
Веб-разработка

154 ошибки типов, которые выбрасывала сборка: что в них нашлось

21 сентября 2026 года проверка типов на нашем сайте показала 154 ошибки, хотя сборка каждый раз была зелёной: результат проверки просто выбрасывался. Внутри нашлись нули в статистике ссылок и в экспорте аналитики, сортировка, которая не сортировала, и тесты, которые не запускались. Рассказываем, как разбирали, что изменили и как проверить свой проект.

9 мин
22 сент.
Читать дальше
Сертификаты продлеваются сами: TLS на 116 сайтах и один, который не продлился
Веб-разработка

Сертификаты продлеваются сами: TLS на 116 сайтах и один, который не продлился

22 сентября 2026 года мы проверили HTTPS-сертификаты на 116 сайтах, которые уже измеряли для рыночных исследований, и для 104 из них сравнили состояние с августовским. Все 116 прошли проверку, 108 стоят на 89- и 90-дневных бесплатных сертификатах, и только у одного сайта сертификат до сих пор не продлился, хотя при типичных настройках уже должен был. Разбираем замеры, границы метода и показываем, как проверить свой сайт одной командой.

9 мин
22 сент.
Читать дальше
Healthcheck дал 60 % запросов приложения: что показали первые сутки метрик
Веб-разработка

Healthcheck дал 60 % запросов приложения: что показали первые сутки метрик

21 сентября 2026 года, в первые сутки учёта запросов по маршрутам, служебный /api/health получил 13 666 запросов — 60 % трафика приложения, и каждый шёл в общую базу. Рассказываем, какие две настройки это убрали, какую цену мы за них платим и как проверить свой healthcheck.

9 мин
22 сент.
Читать дальше