Настройка работы с весовым товаром на 1С-Битрикс
Весовой товар продаётся килограммами или граммами, а корзина рассчитана на целые штуки. Покупатель хочет 0.75 кг сыра, форма принимает только целые числа, в заказе появляется «1 шт» вместо «750 г». Это не проблема интерфейса — это проблема конфигурации товара в каталоге.
Дробное количество в корзине
Битрикс поддерживает дробное количество через поле MEASURE в b_catalog_product и параметр STEP в компоненте корзины. Но по умолчанию поле количества в корзине валидирует только целые числа.
Ключевые поля b_catalog_product для весового товара:
-
MEASURE— ID единицы измерения изb_catalog_measure(кг, г, л и т.д.) -
QUANTITY_TRACE— отслеживать ли остатки (Y/N) -
CAN_BUY_ZERO— продавать при нулевом остатке
Единицы измерения хранятся в b_catalog_measure: ID, SYMBOL_RUS (кг, г), SYMBOL_INTL (kg, g), CODE (числовой код ОКЕИ).
Разрешение дробного количества для товара:
\Bitrix\Catalog\ProductTable::update($productId, [
'MEASURE' => 6, // ID меры "кг" из b_catalog_measure
'STEP' => '0.1', // шаг изменения количества
]);
Компонент корзины и шаг количества
Компонент bitrix:catalog.element принимает параметр PRODUCT_QUANTITY_STEP. Для весового товара шаг задаётся в единицах меры товара. Если товар продаётся с шагом 100 грамм, а мера — килограммы, шаг равен 0.1.
В шаблоне компонента корзины (bitrix:sale.basket.basket) поле ввода количества нужно изменить с type="number" step="1" на step="0.001" и убрать атрибут pattern если он ограничивает ввод целых чисел. Это делается в шаблоне /bitrix/templates/[template]/components/bitrix/sale.basket.basket/[basket_template]/.
Серверная валидация количества — метод \Bitrix\Sale\BasketItem::setField('QUANTITY', $qty). Битрикс не ограничивает количество целым числом на уровне ORM, но компонент добавления в корзину bitrix:catalog.element может округлять переданное значение если в его коде есть intval() — это нужно проверить в шаблоне компонента.
Расчёт доставки по весу
При весовом товаре стоимость доставки считается по суммарному весу заказа. Вес товара хранится в b_catalog_product — поле WEIGHT в граммах. При добавлении в корзину вес копируется в b_sale_basket — поле WEIGHT.
Расчёт доставки через \Bitrix\Sale\Delivery\Services\Manager использует вес из корзины. Проблема возникает когда WEIGHT в b_catalog_product указан для целой единицы (1 кг = 1000 г), но покупатель добавляет 0.75 кг. В этом случае вес в корзине должен быть 750 г, но Битрикс по умолчанию берёт WEIGHT как есть и умножает на количество: 1000 * 0.75 = 750 — это работает правильно если вес задан как вес единицы меры.
Проверка: если мера товара — граммы, а WEIGHT указан тоже в граммах как масса одного грамма (то есть 1), тогда для 750 г вес = 1 * 750 = 750 г — корректно. Если мера — килограммы, а WEIGHT = 1000 г за кг, то 0.75 кг даст 750 г — тоже корректно.
Штрихкоды для весовых товаров
Весовые товары в розничной торговле часто используют EAN-13 с весом в штрихкоде (формат PLU: префикс 2 + код товара + вес). Битрикс не декодирует PLU-штрихкоды из коробки. Для кассовой интеграции нужен обработчик, который при сканировании штрихкода:
- Определяет префикс
2— весовой товар. - Извлекает код товара (позиции 3-7 в стандарте EAN-13 PLU).
- Извлекает вес из позиций 8-12 (в граммах, делённых на 1000).
- Ищет товар по коду в
b_catalog_product_barcode. - Добавляет в корзину с рассчитанным количеством.
Такой обработчик реализуется как обработчик события OnSaleBasketItemAdd или как отдельный AJAX-эндпоинт для кассового ПО.
Остатки весовых товаров
QUANTITY в b_catalog_product для весового товара хранится в единицах меры товара. Если мера — килограммы, остаток 5.750 означает 5 кг 750 г. Синхронизация с 1С должна передавать остатки в той же единице — это нужно явно согласовать при настройке обмена.







