FAQ
Можно ли вести остатки без опций?
Да, если у товара нет опций, которые покупатель кладёт в корзину. Оставьте ms3remains_option_keys пустым и сохраните базовую строку на вкладке Остатки.
Пустое поле не значит «игнорировать опции». В корзине тогда в расчёт остатка войдут все опции, которые передал покупатель. На вкладке при этом не строятся комбинации, только база и варианты. Для каталога с цветом и размером укажите ключи явно. См. Системные настройки.
Товар продаётся без ограничений, хотя остаток нулевой
Проверьте, что у товара есть сохранённая строка остатка. Нулевой остаток и отсутствие строки — разные состояния: первое блокирует продажу, второе делает товар неотслеживаемым. Задайте остаток во вкладке Остатки, пусть даже 0.
На вкладке нет комбинаций цвета и размера
Проверьте ms3remains_option_keys. Пустой список не строит декартовы комбинации. Ключи должны совпадать с ключами опций товара, а значения — быть заполнены в msProductOption. Сетка обрезается после 200 комбинаций.
Остаток списался дважды
Чаще всего это конфликт с ms3Variants: у него включено собственное списание. Откройте раздел Настройки, там будет предупреждение и кнопка Отключить списание в ms3Variants. Второй источник — ms3_inventory_enabled = 1. Оставьте его в 0. Подробности: ms3Variants.
Заказ перевели в статус списания повторно. Списание удвоится?
Нет. Списание фиксируется в ms3remains_order_deductions по ключу (order_id, order_product_id, status_id). Повтор в тот же статус пропускается.
«Сохранить» на вкладке остановилось на середине
Цикл «сохранить все» прерывается на первой ошибке. Исправьте сообщение над таблицей и нажмите Сохранить ещё раз. Уже записанные строки не откатываются.
Как массово загрузить остатки из 1С?
Через CSV-импорт в разделе Остатки или через сервисный API из кастомного скрипта. Оба пути описаны в Обмене с внешними системами.
Почему в списке товаров остаток устарел?
Вы выводите точный остаток сниппетом в кэшированном шаблоне. Вызывайте сниппет некэшируемым или используйте проекцию [[+stock]]. Рецепты: Остатки.
Если вы только что записали то же число, что уже лежало в строке, сумма в поле stock товара всё равно пересчитывается. Так после первого сохранения нуля в каталоге не останется старое значение.
Как скрыть нулевые значения опций на карточке?
Один вызов:
{'!ms3Remains' | snippet : ['id' => $id, 'return' => 'options']}[[!ms3Remains? &id=`[[+id]]` &return=`options`]]В чанке или JS не рендерите значения с количеством 0. Рецепт: Остатки.
Как скрыть от покупателей точное число?
Включите ms3remains_hide_quantity для вывода «В наличии / Нет в наличии» или задайте ms3remains_moreless_count для порога «Много».
Поддерживаются ли дробные количества?
Да. Количество хранится как DECIMAL(12,3). В manager поле принимает до трёх знаков после запятой.
Где журнал изменений остатка?
Его нет по дизайну. Повесьте плагин на ms3remainsOnAfterRemainChange и пишите в свой журнал. Если setQuantity ставит то же число, что уже в строке, событие не вызывается. Пример: События.
Диагностика
Компонент не работает после установки
- Проверьте
ms3remains_enabled = true. Пакет ставится выключенным. - Проверьте dropin-фрагменты:
core/config/ms3.services.d/50-ms3remains.phpиcore/config/ms3.routes.d/manager/50-ms3remains.php. - Очистите кэш MODX.
Статус заказа не списывает остаток
- Проверьте
ms3remains_enabled = trueи что статус входит вms3remains_deduct_statuses. - Проверьте, что у товара есть строка остатка. Неотслеживаемые товары пропускаются.
- Прямое
$order->set('status_id')->save()не поддерживается. Смена статуса должна идти через OrderStatusService MiniShop3. - Если смена статуса блокируется с сообщением о нехватке или конфликте ms3Variants, срабатывает проверка до сохранения на
msOnBeforeChangeOrderStatus(см. События).
Проекция разъехалась
Нажмите Перестроить в карточке «Проекция в каталог» раздела Настройки или вызовите POST /api/mgr/ms3remains/sync/rebuild.
Корзина смотрит не ту строку остатка, что на вкладке
Проверьте ms3remains_option_keys. Пустой список не строит комбинации на вкладке, но все опции из корзины участвуют в подборе строки остатка. Укажите ключи явно.
