Как реализовать выбор склада самовывоза в карточке товара из МойСклад
Интеграция интернет-магазина с системой учёта «МойСклад» (МойСклад) позволяет автоматически подгружать остатки товаров на разных складах. Чтобы покупатель мог выбрать только тот склад, где товар есть в наличии, необходимо настроить выпадающий список в карточке товара. В этой статье разберём пошаговую реализацию с использованием API МойСклад и клиентского JavaScript.
Принцип работы выбора склада самовывоза
Покупатель видит в карточке товара выпадающий список (select) с названиями складов. Доступны для выбора только те склады, на которых количество товара больше нуля. После выбора склада информация передаётся в корзину и далее в оформление заказа как пункт самовывоза.
Шаг 1. Получение данных о складах и остатках через API МойСклад
Для получения списка складов используйте запрос к эндпоинту /api/remap/1.2/entity/store. Ответ содержит массив складов с их идентификаторами (id) и названиями (name).
Для получения остатков конкретного товара по складам используйте запрос к /api/remap/1.2/entity/assortment/{productId}/stock. В ответе будет массив stockByStore, где для каждого склада указано количество (quantity).
Шаг 2. Формирование выпадающего списка на стороне клиента
После загрузки страницы карточки товара выполните AJAX-запрос к вашему серверному скрипту (прокси), который объединяет данные о складах и остатках. Пример структуры ответа:
{
"stores": [
{"id": "store1", "name": "Склад на Ленина", "quantity": 5},
{"id": "store2", "name": "Склад на Гагарина", "quantity": 0}
]
}Затем динамически создайте элементы <option> для каждого склада, устанавливая атрибут disabled для складов с quantity = 0. Пример на JavaScript:
const select = document.getElementById('store-select');
stores.forEach(store => {
const option = document.createElement('option');
option.value = store.id;
option.text = store.name;
if (store.quantity === 0) {
option.disabled = true;
}
select.appendChild(option);
});Это гарантирует, что покупатель сможет выбрать только склад с наличием товара.
Шаг 3. Передача выбранного склада в корзину и оформление заказа
При изменении значения в выпадающем списке (событие change) сохраняйте выбранный ID склада в скрытое поле формы или в localStorage. При добавлении товара в корзину отправляйте этот ID вместе с остальными данными (количество, товарный ID).
На стороне сервера (например, PHP или Node.js) при создании заказа передайте выбранный склад как пункт самовывоза. В МойСклад это можно сделать через поле shipmentStore в объекте заказа (order) при использовании API.
Часто задаваемые вопросы (FAQ)
Как обновлять остатки в реальном времени?
Настройте периодический опрос API МойСклад (например, каждые 5 минут) или используйте вебхуки для получения уведомлений об изменении остатков. Обновляйте данные на странице без перезагрузки через setInterval или WebSocket.
Что делать, если товар есть на нескольких складах?
В выпадающем списке отобразятся все склады с ненулевым остатком. Покупатель сможет выбрать любой из них. При этом можно отсортировать склады по близости к адресу доставки, если передать координаты.
Как скрыть склады с нулевым остатком полностью?
Вместо атрибута disabled просто не добавляйте option для складов с quantity = 0. Список будет содержать только доступные варианты.
Как передать выбранный склад в CRM или 1С?
При создании заказа через API МойСклад укажите ID склада в поле store для каждой позиции товара. Это обеспечит корректное списание остатков.
Можно ли использовать готовые плагины для CMS?
Да, для популярных CMS (WordPress, OpenCart, 1С-Битрикс) существуют готовые модули интеграции с МойСклад, которые уже включают функционал выбора склада. Однако для нестандартных требований лучше написать собственную реализацию через API.