Разработка сайтов и интернет-магазинов на 1С-битрикс, порталы Битрикс24, seo продвижение, реклама, поддержка проектов
Заполнить или изменить коэффициент единицы измерения (MEASURE_RATIO) из свойства элемента при обмене с 1С

Заполнить или изменить коэффициент единицы измерения (MEASURE_RATIO) из свойства элемента при обмене с 1С

Логотип Liberty
Константин Либерман
Константин Либерман
Основатель компании «LIBERTY»
193 просмотра
На одном из наших проектов к нам пришла задача сделать миниальное кол-во товаров при покупке равное 2 шт. По умолчанию в 1С_Битрикс в торговом каталоге в каждом товаре есть свойство "Коэфициент единицы измерения" и он равен 1.



Каталог синхронизируется с 1С, но на "Коэфициент единицы измерения" это ни как не влияет. Решения этой задачи мы разбили на 2 подзадачи:
1) Массово изменить "Коэфициент единицы измерения" с 1 на 2.
2) Автоматическое обновление коэффициэнта из свойства при обмене с 1С

Для начала в 1С создали новой свойство "Кратность", потом всем товарам (в нашем случае шины) это свойство заполнилось значением равным 2. После обмена с 1С на сайте создалось новое свойство "Кратность" с сивольным кодом "KRATNOST".

Заполнить коэффициент единицы измерения из свойства используя D7

Для решения, в php консоли сайта выполнили следующий код:

use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Catalog\MeasureRatioTable;
Loader::includeModule('iblock');
Loader::includeModule('catalog');

$iblockId = 39;
$updateElements = ElementTable::getList([
    'select' => ['ID'],
    'filter' => ['IBLOCK_ID' => $iblockId],
]);
while ($arFields = $updateElements->fetch()) {
    $propertyValue = CIBlockElement::GetProperty(
        $iblockId,
        $arFields['ID'],
        [],
        [
                'CODE' => 'KRATNOST'
        ]
    );

    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,
            ]);
        }
    }
}


C помощью CIBlockElement::GetProperty - получили значение свойства KRATNOST из инфоблока с ID 39.
Значение коэффициента загнали в переменную $coeff.
Внутри цикла (каждого элемента), с помощью MeasureRatioTable::getList получили ID коэффициента конкретного товара (элемента).
С помощью MeasureRatioTable::update перезаписали/установили коэффициенты для конкретного товара.

Автоматическое обновление коэффициэнта из свойства при обмене с 1С

Для того чтобы сделать код срабатывающим на событии OnSuccessCatalogImport1C, мы зарегистрировали обработчик событий, используя следующий код в файле init.php:

/******************* Обновление коэффициентов  после импорта **************/
use Bitrix\Main\Config\Option;
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Catalog\MeasureRatioTable;
CModule::IncludeModule("iblock");
CModule::IncludeModule('catalog');
AddEventHandler( "catalog", "OnSuccessCatalogImport1C" , "UpdateElementRatio" );
function UpdateElementRatio( $arParams, $arFields ){
    tmpsave1(array($arParams, $arFields),"UpdateElementRatio_1");
        $updateElements = ElementTable::getList([
                    'select' => ['ID'],
                    'filter' => ['IBLOCK_ID' => 39],
                ]);
                while ($arFields2 = $updateElements->fetch()) {
                    $propertyValue = CIBlockElement::GetProperty(
                        39,
                        $arFields2['ID'],
                        [],
                        [
                                'CODE' => 'KRATNOST'
                        ]
                    );

                    if ($arProperty = $propertyValue->Fetch()) {
                        $coeff = $arProperty['VALUE'];

                        $curElementRatio = MeasureRatioTable::getList([
                            'filter' => [
                                '=PRODUCT_ID' => $arFields2['ID'],
                            ],
                        ]);
                        if ($arRatio = $curElementRatio->fetch()) {
                            MeasureRatioTable::update($arRatio['ID'], [
                                'RATIO' => $coeff,
                            ]);
                        }
                    }
                }
}
/******************* Обновление коэффициентов  после импорта **************/


Этот код предполагает, что коэффициент хранится в свойстве с кодом KRATNOST. Обработчик событий OnSuccessCatalogImport1C регистрируется для выполнения необходимых операций перед обновлением или добавлением элемента. Функция updateMeasureRatios обновляет коэффициент, если он присутствует.