Налаштування роботи з товарами на вагу у 1C-Bitrix
Товари на вагу продаються кілограмами або грамами, а кошик розрахований на цілі одиниці. Покупець хоче 0.75 кг сиру, форма приймає лише цілі числа, у замовленні з'являється "1 шт" замість "750 г". Це не проблема інтерфейсу — це проблема конфігурації товару в каталозі.
Дробова кількість у кошику
Bitrix підтримує дробову кількість через поле 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). Bitrix не обмежує кількість цілим числом на рівні 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 г, але Bitrix за замовчуванням бере WEIGHT як є та множить на кількість: 1000 * 0.75 = 750 — це працює правильно якщо вага задана як вага одиниці виміру.
Перевірка: якщо міра товару — грами, а WEIGHT також грами (за один грам = 1), то для 750 г вага = 1 * 750 = 750 г — правильно. Якщо міра — кілограми, а WEIGHT = 1000 г за кг, то 0.75 кг дає 750 г — теж правильно.
Штрихкоди для товарів на вагу
Товари на вагу у роздрібній торгівлі часто використовують EAN-13 з вагою у штрихкоді (формат PLU: префікс 2 + код товару + вага). Bitrix не декодує PLU-штрихкоди з коробки. Для інтеграції з касою потрібен обробник, який при сканування штрихкода:
- Визначає префікс
2— товар на вагу. - Витягує код товару (позиції 3-7 у стандарті EAN-13 PLU).
- Витягує вагу з позицій 8-12 (в грамах, поділених на 1000).
- Шукає товар за кодом у
b_catalog_product_barcode. - Додає в кошик з розрахованою кількістю.
Такий обробник реалізується як обробник події OnSaleBasketItemAdd або як окремий AJAX-ендпоінт для касового ПО.
Остатки товарів на вагу
QUANTITY у b_catalog_product для товарів на вагу зберігається в одиницях виміру товару. Якщо міра — кілограми, остаток 5.750 означає 5 кг 750 г. Синхронізація з 1C має передавати остатки в тій же одиниці — це потрібно явно узгодити при налаштуванні обміну.







