Привет, я Максим — веб-разработчик. Если бы меня спросили, из-за чего чаще всего ругаются покупатели интернет-магазинов — я бы ответил: из-за неактуальных остатков. Человек оформляет заказ, оплачивает — а через день ему звонит менеджер и говорит: «Извините, товара нет, будете ждать или вернём деньги?» Это убивает доверие. В этой статье расскажу, как технически организовать учёт товаров в интернет-магазине, настроить автоматическое обновление остатков и избежать ситуации, когда сайт живёт отдельно от склада.
Почему остатки на сайте не совпадают с реальностью
Прежде чем говорить о решениях, давайте разберёмся с причинами проблемы. Вот типичные ситуации, которые я наблюдаю у своих заказчиков.
Ручное обновление. Менеджер заносит остатки в 1С и отдельно — на сайт. При 500+ позициях в каталоге ошибки неизбежны. Забыл обновить, перепутал количество, не учёл возврат — и на сайте появляется фантомный товар.
Редкая синхронизация. Обмен данными между 1С и сайтом настроен, но происходит раз в сутки — ночью. За день в рознице продали 20 единиц, а сайт об этом узнает только утром. Весь день покупатели видят неактуальные остатки.
Нет учёта резервов. Товар числится на складе, но уже зарезервирован под оффлайн-заказ или под другой онлайн-заказ, который ещё не отгружен. На сайте показывается полный остаток, а реально доступного товара меньше.
Несколько каналов продаж. Магазин продаёт через сайт, Wildberries и Ozon. Остатки не синхронизируются между каналами — и один и тот же товар продаётся дважды.
Главный принцип: один источник правды
Первое и самое важное — определите, где ведётся мастер-база остатков. Это может быть 1С (самый распространённый вариант в России), МойСклад, EKAM или другая система учёта. Сайт всегда получает данные оттуда и никогда не является первичным источником.
Если менеджер вносит изменения в остатки на сайте напрямую, минуя учётную систему — рано или поздно данные разъедутся. Правило железное: все операции с товарами (приход, расход, списание, возврат) фиксируются в учётной системе, а сайт автоматически подтягивает актуальные остатки.
Как настроить интеграцию склада с сайтом
Вариант 1: Обмен через CommerceML (стандарт для 1С)
CommerceML — это протокол, разработанный компанией 1С специально для обмена данными между учётными системами и сайтами. Его поддерживают все основные CMS: 1С-Битрикс, InSales, CS-Cart, Tilda (в режиме магазина), WooCommerce (через модули).
Как это работает: 1С формирует XML-файлы с каталогом товаров (import.xml) и ценами/остатками (offers.xml). Сайт принимает эти файлы и обновляет свою базу. Обратно — сайт отдаёт в 1С новые заказы.
Обмен можно запускать по расписанию (каждые 15 минут, каждый час, раз в день) или вручную по кнопке. Для большинства магазинов с оборотом до 100 заказов в день обмен раз в 15–30 минут — оптимальный баланс между актуальностью и нагрузкой на сервер.
Важно: при большом каталоге (10 000+ товаров) полная синхронизация может занимать значительное время. Настройте частичное обновление — передавать только те позиции, остатки которых изменились с момента последнего обмена.
Вариант 2: REST API
Если учётная система предоставляет REST API (МойСклад, некоторые конфигурации 1С через OData), сайт может запрашивать остатки в реальном времени. Это быстрее и гибче, чем CommerceML, но требует более сложной разработки.
На кастомных проектах (Next.js, Laravel) я обычно строю микросервис-прослойку: он с заданной частотой опрашивает API учётной системы, получает изменения остатков и обновляет кэш на сайте. Покупатель видит данные из кэша (быстро), а кэш обновляется каждые 5–10 минут (актуально).
Вариант 3: Webhook / событийная модель
Самый продвинутый вариант: учётная система отправляет уведомление на сайт каждый раз, когда остаток какого-то товара меняется. Сайт мгновенно обновляет данные. Задержка — секунды.
МойСклад поддерживает вебхуки. Для 1С такое решение требует кастомной доработки (обработчик событий, который отправляет HTTP-запрос на сайт при проведении документов).
Что показывать покупателю
Есть несколько стратегий отображения остатков на сайте, и выбор зависит от вашей ниши.
Точное количество. «Осталось 3 шт.» — подходит для ограниченных коллекций, эксклюзивных товаров. Создаёт эффект срочности (FOMO) и мотивирует купить быстрее.
Ступенчатое отображение. «Много» (больше 10), «Мало» (от 1 до 10), «Нет в наличии» (0). Подходит для большинства магазинов. Не раскрывает точные складские данные, но даёт покупателю понимание ситуации.
Бинарное. «В наличии» / «Нет в наличии». Самый простой вариант, подходит для магазинов с большими остатками.
С опцией «Под заказ». Если товара нет на складе, но его можно заказать у поставщика — показывайте «Под заказ, 5–7 дней» вместо «Нет в наличии». Это спасает продажу.
Я рекомендую комбинированный подход: если остаток больше 10 — показывать «В наличии». Если от 1 до 10 — «Осталось мало» или точное количество. Если 0 — «Нет в наличии» или «Под заказ».
Резервирование: как не продать один товар дважды
Когда покупатель оформляет заказ на сайте, товар должен быть зарезервирован — вычтен из доступного остатка, но ещё не списан со склада (списание произойдёт после отгрузки).
На 1С-Битрикс механизм резервирования есть из коробки: при создании заказа товар автоматически резервируется на складе. На WooCommerce — при оплате или при оформлении заказа (настраивается). На кастомных решениях — реализую через отдельное поле `reserved` в таблице остатков.
Важный нюанс: если заказ отменяется или истекает время ожидания оплаты — резерв должен автоматически сниматься. Иначе «зависшие» резервы постепенно обнулят доступные остатки, хотя товар физически лежит на складе.
Работа с несколькими каналами продаж
Если вы продаёте одновременно через свой сайт и маркетплейсы — синхронизация остатков становится сложнее. Вот как я решаю эту задачу.
Единый источник — 1С или WMS. Все каналы получают остатки из одного места. При продаже на любом канале остаток уменьшается в учётной системе и автоматически обновляется на всех остальных.
Разделение остатков. Для каждого канала можно выделить отдельный «виртуальный склад» в 1С. Например: 100 единиц на складе «Сайт», 50 на складе «Wildberries FBS», 200 на складе «Ozon FBO». Это предотвращает ситуацию, когда маркетплейс «съедает» весь остаток и на сайте товар заканчивается.
Буфер безопасности. Показывайте на сайте остаток минус 5–10% — как страховку от ситуации, когда два канала одновременно продают последние единицы.
Что делать, когда товар заканчивается
Нулевой остаток — это не конец. Вот что можно сделать на сайте.
Кнопка «Сообщить о поступлении». Покупатель оставляет email и получает уведомление, когда товар снова появится. Простая, но эффективная механика — часть людей реально возвращается и покупает.
Предложение аналогов. Блок «Похожие товары в наличии» на карточке отсутствующего товара перенаправляет покупателя к альтернативам.
Не удаляйте страницы товаров. Если товар временно отсутствует — не скрывайте его и тем более не удаляйте страницу. Это SEO-самоубийство: страница уже проиндексирована, на неё могут быть внешние ссылки. Оставьте страницу, покажите «Нет в наличии», предложите аналоги или подписку на поступление.
Типичные ошибки
Обновление остатков раз в сутки при высоком обороте. Если у вас 50+ заказов в день — ежедневная синхронизация не годится. Минимум — раз в 30 минут, в идеале — каждые 5–15 минут или в реальном времени.
Нет валидации при оформлении заказа. Покупатель добавил товар в корзину час назад, а за это время его купил кто-то другой. При нажатии «Оформить» система должна проверить актуальный остаток и предупредить, если товар закончился.
Показывают отрицательные остатки. Бывает, что при сбое синхронизации на сайте отображается «-2 шт.» или другие абсурдные значения. Добавьте в шаблон проверку: если остаток <= 0, показывать «Нет в наличии».
Не учитывают характеристики. У футболки размер M есть, а размера XL нет. Но на сайте показывается общий остаток по всем размерам. Покупатель выбирает XL, оформляет — и получает отказ. Остатки должны учитываться с точностью до варианта (размер, цвет, комплектация).
Что я рекомендую
Наведите порядок с учётом. Если остатки в 1С не совпадают с реальностью на складе — никакая интеграция не поможет. Начните с инвентаризации.
Настройте автоматическую синхронизацию. CommerceML для 1С + любая популярная CMS — проверенная связка. Частота обмена — от 15 минут для активных магазинов.
Внедрите резервирование. Это защищает от двойных продаж и конфликтов между каналами.
Настройте мониторинг. Если синхронизация сломалась — вы должны узнать об этом первым, а не от разгневанного покупателя. Простой скрипт, который проверяет время последнего обмена и отправляет алерт в Telegram, если прошло больше часа — спасает нервы и репутацию.
Нужна помощь с настройкой обмена остатками между 1С и сайтом — пишите. Разберёмся с вашей конфигурацией и настроим всё под ваш бизнес-процесс.