Как правило, при продаже минимальными партиями необходимо, чтобы у товаров были добавлены значения "Коэффициент единицы измерения". Это, например, если в корзину необходимо добавить по две, пять, десять единиц товара. Дорабатывать шаблон на Битриксе в таком случае неразумно, так как после пары обновлений всё может слететь. Как быть в этом случае?
Можно автоматизировать выгрузку из 1С и добавления "Коэффициент единицы измерения" в товары и торговые предложения.
В сети попадаются решения, когда из свойства 1С "Минимальная партия" переносятся значения в "Коэффициент единицы измерения" для отдельных товаров, но для торговых предложений таких решений нет.
Здесь основная проблема в том, что свойство добавлено у товаров (есть в инфоблоке товаров), но его нет у торговых предложений, потому что неудобно добавлять значение партии для каждой вариации.
Следовательно, необходимо взять значение минимальной партии у сущности товара и добавить всем его торговым предложениям в "Коэффициент единицы измерения":
- Создаём свойство в 1С (дополнительный реквизит для товаров), например, "Минимальная партия" или используем любое другое свойство из 1С.
- Далее делаем полную выгрузку из 1С на сайт и смотрим ID нашего реквизита "Минимальная партия", у нас на примере 969.
- Смотрим ID инфоблока, действующего на сайте (товаров и торговых предложений), у нас на примере 46 и 51.
<?php
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Catalog\MeasureRatioTable;
Loader::includeModule('iblock');
Loader::includeModule('catalog');
$iblockId = 46; // ID инфоблока товаров
$offersIblockId = 51; // ID инфоблока торговых предложений
$propertyId = 969; // ID свойства MINIMALNAYA_PARTIYA у товаров
// Получаем список элементов инфоблока товаров
$updateElements = ElementTable::getList([
'select' => ['ID'],
'filter' => ['IBLOCK_ID' => $iblockId],
]);
while ($arFields = $updateElements->fetch()) {
// Получаем значение свойства 'MINIMALNAYA_PARTIYA' у товара
$propertyValue = CIBlockElement::GetProperty(
$iblockId,
$arFields['ID'],
[],
['ID' => $propertyId]
);
if ($arProperty = $propertyValue->Fetch()) {
$coeff = $arProperty['VALUE'];
// Обновляем текущий коэффициент единицы измерения товара
$curElementRatio = MeasureRatioTable::getList([
'filter' => ['=PRODUCT_ID' => $arFields['ID']],
]);
if ($arRatio = $curElementRatio->fetch()) {
MeasureRatioTable::update($arRatio['ID'], ['RATIO' => $coeff]);
}
// Получаем список торговых предложений для товара
$offerElements = CIBlockElement::GetList(
[],
['IBLOCK_ID' => $offersIblockId, 'PROPERTY_CML2_LINK' => $arFields['ID']],
false,
false,
['ID']
);
while ($offer = $offerElements->Fetch()) {
// Обновляем коэффициент единицы измерения для торгового предложения
$curOfferRatio = MeasureRatioTable::getList([
'filter' => ['=PRODUCT_ID' => $offer['ID']],
]);
if ($arOfferRatio = $curOfferRatio->fetch()) {
MeasureRatioTable::update($arOfferRatio['ID'], ['RATIO' => $coeff]);
} else {
MeasureRatioTable::add([
'PRODUCT_ID' => $offer['ID'],
'RATIO' => $coeff,
]);
}
}
}
}
?>
Это решение протестировано и работает на нескольких проектах, доработки добавляются в init.php, следовательно, вы всегда сможете легко их убрать.