Дробное количество и единицы измерения товаров в Shop-Script
В версии Shop-Script 9.0.0 мы планируем добавить поддержку новых возможностей:
- дробное количество товаров;
- единицы измерения количества товаров;
- минимальное количество товаров для заказа;
- шаг добавления товаров в корзину;
- размер изменения количества товаров в корзине кнопками «+/-».

Расскажем, как это устроено, чтобы вы могли подготовить свои плагины к работе с новой версией Shop-Script.
Подробная статья об этих изменениях опубликована в документации разработчика.
Можно посмотреть работу Shop-Script с новыми возможностями в демоверсии:
Для использования новых возможностей в своих продуктах вам потребуется обновлённый исходный код продуктов Webasyst — мы опубликовали его на «ГитХабе»:
Дробное количество товаров
Дробное количество может быть полезно для того, чтобы было удобно продавать, например, 1,35 кг или 2,9 л товара, а не только целые штуки или одинаковые упаковки.
После обновления интернет-магазины пользователей продолжат работать, как обычно, — для них автоматически ничего не изменится, и количество товаров везде будет считаться, как и прежде, в виде целых чисел — штук.
Чтобы что-то изменилось, нужно включить общую поддержку дробного количества товаров в настройках магазина.
В этот момент приложение покажет предупреждение о том, что нужно проверить поддержку дробного количества товаров установленными плагинами и темами дизайна — в специальном разделе настроек магазина. У пользователя есть возможность (на свой страх и риск) включить общую поддержку дробного количества товаров в магазине, даже если есть темы и плагины, не поддерживающие эту возможность, или если нет информации о такой поддержке.
После этого можно включить поддержку дробного количества для отдельных типов товаров. Когда поддержка дробного количества включена для какого-то типа товаров, можно включать или выключать её при редактировании каждого из товаров этого типа.
Шаг добавления товаров в корзину
Доступность поддержки дробного количества товара определяется указанным в настройках значением шага добавления в корзину. Это то минимальное количество, которому всегда должно быть кратно количество товара в корзине и в заказе. Количество каждого товара при этом округляется до ближайшего числа, кратного шагу, заданному для этого товара. Если шаг дробный, то для товара появляется возможность заказа дробного количества.
Например, если шаг добавления в корзину установить равным 0,15, то покупатели смогут добавлять в корзину такие количества, как, например, 0,15, 0,3, 0,45, 0,9, 1,5 и т. п. и не смогут добавлять количества вроде 1,01, 2,35 или 9,99 — потому что эти значения не кратны установленному шагу 0,15.
Степень точности складских остатков
В остатках на складе администратор магазина может указать число, необязательно кратное указанному шагу. Достаточно только, чтобы точность остатков не превышала точность шага добавления в корзину.
Степень точности шага добавления в корзину соответствует количеству знаков после запятой в его значении. Например, у шага 0,5 точность равна 0,1, у шага 0,015 — 0,001, а у шага 10 — 1.
Если шаг установлен равным 0,15, то складские остатки могут быть равны, например, 0,01, 0,1 или 1, но не 0,009 или 0,0009, потому что у этих значений большая точность (количество знаков после запятой), чем у шага добавления в корзину.
Если шаг добавления в корзину выражен любым целым числом, то его точность равна 1. Например, если шаг равен 1, 2, 5, 20 или 100, то его точность во всех этих случаях одинаковая — 1, поэтому в таком случае в остатках на складе можно ввести любое целое число.
Минимальное количество в заказе и размер изменения количества в корзине кнопками «+/-»
Пользователю доступны ещё две настройки, связанные с дробным количеством товаров:
- минимальное количество товара в заказе;
- размер изменения количества товара в корзине кнопками «+/-».
Их можно задать в свойствах типов товаров. А в свойствах отдельных товаров этих типов можно при необходимости указать индивидуальные значения для этих товаров.
Значения этих двух настроек могут быть только кратными шагу добавления товара в корзину. Поэтому, если шаг добавления в корзину является целым числом, то и минимальное количество в заказе, и размер изменения количества в корзине тоже могут быть только целочисленными.
Поля таблиц базы данных для поддержки дробного количества
Для поддержки дробного количества товаров изменится тип нескольких полей в таблицах базы данных и будут добавлены новые поля. В эти поля можно будет сохранять и целочисленные, и дробные количества товаров.
Таблица | Поле | Версия 8 | Версия 9 | Описание |
---|---|---|---|---|
shop_product
|
count
|
int, NULL
|
DECIMAL(15,3), NULL
|
Сумма складских остатков всех артикулов товара на всех складах. |
shop_product_skus
|
count
|
int, NULL
|
DECIMAL(15,3), NULL
|
Сумма складских остатков артикула на всех складах. |
shop_product_stocks
|
count
|
int, NOT NULL
|
DECIMAL(15,3), NOT NULL
|
Остатки артикула на конкретном складе, если ведётся складской учёт по складам. Пустое значение означает бесконечные остатки на этом складе. |
shop_product_stocks_log
|
before_count after_count diff_count
|
int, NULL
|
DECIMAL(15,3), NULL
|
История изменения складских остатков. |
shop_transfer_products
|
count
|
int, NOT NULL
|
DECIMAL(15,3), NOT NULL
|
Трансфер со склада на склад. |
shop_cart_items
|
quantity
|
int, NOT NULL
|
DECIMAL(15,3), NOT NULL
|
Количество товара в корзине. |
shop_order_items
|
quantity
|
int, NOT NULL
|
DECIMAL(15,3), NOT NULL
|
Количество отдельной позиции в заказе. |
shop_product
|
count_denominator
|
- |
int, NOT NULL
|
Доступная точность указания складских остатков товара. Возможные значения: 1 (целые штуки), 10 (точность до десятых), 100 (точность до сотых), 1000 (точность до тысячных). Минимальное доступное значение для поля count представляет собой число, обратное значению поля count_denominator. |
shop_order_items
|
quantity_denominator
|
- |
int, NOT NULL
|
Доступная точность количества позиции заказа, которую можно указать в поле quantity. Список доступных значений см. в описании поля count_denominator. Значение в этом поле сохраняется для истории на случай, если свойства товара в заказе изменятся или если товар будет удалён. |
shop_product
|
order_multiplicity_factor
|
- |
DECIMAL(9,3), NOT NULL
|
Шаг добавления товара в корзину. Количество товара во всех заказах, оформленных покупателями на витрине, всегда принудительно округляется вверх — так, чтобы быть кратным значению шага в этом поле. |
shop_product_skus
|
order_count_min*
|
- |
DECIMAL(15,3), NULL
|
Минимальное количество товара в заказе. Покупатель на витрине не может оформить заказ с меньшим количеством этого товара. Должно быть кратным значению поля order_multiplicity_factor. |
shop_product_skus
|
order_count_step*
|
- |
DECIMAL(15,3), NULL
|
Шаг добавления товара в корзину. При нажатии на кнопки «+» и «-» на витрине в корзину добавляется или из корзины удаляется количество, указанное в этом поле. Должно быть кратным значению поля order_multiplicity_factor. |
* Поля order_count_min
и order_count_step
не связаны с поддержкой дробного количества. Их можно заполнять и использовать, даже когда поддержка дробного количества выключена.
В таблицу shop_type
также добавлены несколько новых — парных — полей. В каждой паре значение в поле с суффиксом _fixed
указывает то, можно ли изменять соответствующее значение в отдельных товарах этого типа или оно включено сразу для всех товаров этого типа.
order_multiplicity_factor order_multiplicity_factor_fixed
|
См. описание поля shop_product.order_multiplicity_factor . |
count_denominator count_denominator_fixed
|
См. описание поля shop_product.count_denominator . |
order_count_min order_count_min_fixed
|
См. описание поля shop_product_skus.order_count_min . |
order_count_step order_count_step_fixed
|
См. описание поля shop_product_skus.order_count_step . |
Смысл значений в полях с суффиксом _fixed
:
- 0: значение можно изменять отдельно в каждом товаре.
- 1: значение включено сразу для всех товаров этого типа, и его нельзя изменять отдельно для каждого товара этого типа.
- 2: значение выключено для всех товаров этого типа, и его нельзя включить отдельно для каждого товара этого типа.
Единицы измерения товаров
Вместо стандартных штук можно будет продавать товары также в метрах, литрах, килограммах или в любых собственных единицах.
Так же, как и поддержку дробного количества, поддержку единиц измерения товаров нужно включить на разных уровнях:
- Для всех товаров магазина.
- Для выбранных типов товаров.
- Для отдельных товаров выбранных типов.
Каждый из вышестоящих уровней влияет на доступность нижестоящего.
Складская и базовая единицы измерения
Для измерения количества товаров используются два вида единиц:
- Складская — это та единица измерения, в которой владелец магазина сохраняет количество товаров на складе. Например, для обоев такой единицей будет рулон.
- Базовая — это дополнительная единица измерения, заданная пользователем для более удобного отображения цены товара. Например, если покупатель хочет сравнить цены разных видов обоев, ему удобнее сравнивать цены за квадратный метр, а не за рулон, потому что в разных рулонах может быть разное количество квадратных метров. В этом примере квадратный метр — базовая единица измерения.
Оба вида единиц могут использоваться покупателями на витрине:
- для просмотра цен товаров в каждой из единиц — на странице товара, в списках товаров, в корзине;
- для фильтрации, сортировки и сравнения товаров.
Как проверить в PHP-коде, разрешено ли включать для типов товаров базовые и складские единицы:
// Базовые wa()->getSetting('base_units_enabled', '', 'shop') // Складские wa()->getSetting('stock_units_enabled', '', 'shop')
По умолчанию Shop-Script использует целочисленную единицу измерения штуки. Если необходимо добавить другие единицы, то администратор магазина может выбрать в настройках одну из доступных в списке стандартных единиц или добавить свои собственные.
Информация о единицах измерения хранится в таблице shop_unit
.
Поля base_unit_id
и stock_unit_id
в таблицах shop_product
и shop_type
связаны со значением поля id
таблицы shop_unit
(кроме значения 0, которое означает системную единицу измерения по умолчанию —
штуки).
Поля таблиц базы данных для поддержки единиц измерения
Таблица | Поле | Описание |
---|---|---|
shop_product
|
stock_unit_id
|
Информация о складской единице измерения товара — значение поля id из таблицы shop_unit . Значение 0 означает штуки.В полях со складскими остатками ( shop_product.count , shop_product_stocks.count и других) должно храниться количество именно в этой единице. В корзину и в заказ товар добавляется в этой единицах, она указываются в печатных формах документов.Например, если магазин продаёт обои рулонами, то на складе будет указано количество рулонов, и купить можно только целое количество рулонов. Нельзя купить любое количество квадратных метров обоев — только какое-то количество целых рулонов. |
shop_product
|
base_unit_id
|
Информация о базовой единице измерения товара — значение поля id из таблицы shop_unit . Значение 0 означает штуки.В этих единицах может более удобно сравнивать товары на витрине. Базовые единицы используются только для удобства пользователей — они не сохраняются в свойствах корзины и заказа и не используются для формирования печатных форм документов. В примере с обоями базовая единица измерения — квадратный метр. Покупателю на витрине удобнее сравнивать разные по размеру рулоны по цене за квадратный метр, а не за рулон. |
shop_product_skus
|
stock_base_ratio
|
Соотношение между складской и базовой единицами для артикула (сколько базовых в одной складской). В примере с обоями это количество квадратных метров в одном рулоне. |
shop_product
|
base_price
|
Базовая цена главного артикула товара в основной валюте магазина. Используется для оптимизации сортировки по базовой цене, когда в запросе не используется JOIN с таблицей артикулов. |
shop_product
|
min_base_price max_base_price
|
Границы базовой цены артикулов товара в основной валюте магазина. Используются для фильтрации по базовой цене, когда в запросе не используется JOIN с таблицей артикулов. |
shop_order_items
|
stock_unit_id
|
Складская единица позиции заказа, id из таблицы shop_unit . 0 означает штуки.Сохраняется в заказе для истории — на случай, если товар удалят или отредактируют после создания заказа. |
В таблицу shop_type
добавлено несколько новых — парных — полей; в каждой паре есть поле с суффиксом _fixed
.
Смысл значений в полях с суффиксом _fixed
:
- 0: значение можно изменять отдельно в каждом товаре.
- 1: значение включено сразу для всех товаров этого типа, и его нельзя изменять отдельно для каждого товара этого типа.
- 2: значение выключено для всех товаров этого типа, и его нельзя включить отдельно для каждого товара этого типа.
stock_unit_id stock_unit_fixed
|
Складская единица для типа товаров. См. описание поля shop_product.stock_unit_id . |
base_unit_id base_unit_fixed
|
Базовая единица для типа товаров. См. описание поля shop_product.base_unit_id . |
stock_base_ratio stock_base_ratio_fixed
|
Коэффициент конвертации единиц измерения: количество базовых единиц в одной складской единице. См. описание поля shop_product_skus.stock_base_ratio . |
Проверка поддержки дробного количества и единиц измерения товаров в установленных приложениях, плагинах, виджетах и темах дизайна
При каждом включении поддержки новых возможностей магазин проверяет, есть ли среди установленных программных продуктов те, которые потенциально могли бы использовать эти возможности, но для которых эта поддержка пока не подтверждена их разработчиками. Разработчики должны будут маркировать поддержку новых возможностей в своих продуктах — о том, как именно это нужно будет делать, мы объявим позднее.
Если установлены продукты без заявленной поддержки дробного количества и единиц измерения, то пользователь увидит их список и ему будет предложено либо отказаться от включения новых возможностей, либо подтвердить их включение — на свой страх и риск.
18 ответов
Мы так долго этого ждали, и вот дождались! Ура! Ура! Ура!
Только они умолчали что эта фишка будет стоить дороже чем весь SS )))
? надеюсь вы предусмотрели поддержку старых плагинов не заточенных под дробное кол-во?
Если плагин не поддерживает новые возможности, он с какой-то вероятностью станет работать с ошибками. Это обычная судьба плагинов, разработчики которых не адаптировали свои продукты к обновлённой системе.
В интерфейсе пользователя Shop-Script мы добавим раздел для пользователей, который позволит им проверять, насколько хорошо каждый из установленных плагинов поддерживает новые возможности.
когда планируется релиз, хотя бы примерный месяц
Такой информации пока нет. Сроки будут зависеть от того, как быстро разработчики плагинов и тем дизайна будут адаптировать свои продукты к обновлённому Shop-Script.
Ссылка на обновленный шопскрипт 404 отдает, не могли бы Вы поправить?
Shop-script
Ссылка рабочая. Возможно, вы не авторизованы на «ГитХабе» — он в этом случае показывает ошибку 404 для приватного репозитория. Или у вас нет доступа к репозиторию Shop-Script — запросите его на странице https://developers.webasyst.ru/download/.
Михаил, извините, не удержался. Как понять что вы ответили конкретно на этот вопрос?
Извиняю, но впредь держите себя в руках...
По внешнему виду и расположению ответа на странице.
Не уверен, что понял вас. Поясните, пожалуйста, если это ещё актуально.
Подробную статью об этих изменениях мы опубликовали в документации разработчика.
Михаил, какая бесплатная тема сейчас полноценно работает на версии 9? Судя по ветке master конечный пользователь пока не может пользоваться дробным количеством? Вижу тему default, но там почему-то только частично обновлен фильтр...
Для работы с возможностями лицензии «ПРЕМИУМ» мы адаптировали тему дизайна «Гипермаркет».
Как отключить дробное количество. Мой магазин не использует дробное количество, а после обновления количество стало вместо например 3, теперь 3,000 Как убрать эти 000
Актуально и для меня, в кабине пользователя в заказах Х,000 как вернуть до целых цисел?
Как указать метры вместо шт?
Как разработчику получить доступ без покупки?
тут доступ получен https://developers.webasyst.ru...
тут все равно 404
Эти ссылки были устаревшими, потому что указывали на временные ветки репозитория. Обновили ссылки на актуальные ветки в тексте статьи — проверьте, пожалуйста.