Yandex Metrika
sanches.free 25 просмотров

Типы цен и цены на товары

Материал

Работа с типами цен модуля "Торговый каталог" при помощи классов "\Bitrix\Catalog\GroupTable", "\Bitrix\Catalog\GroupLangTable", "\Bitrix\Catalog\GroupAccessTable", "\Bitrix\Catalog\PriceTable".

"\Bitrix\Catalog\GroupTable": Таблица типов цен
"\Bitrix\Catalog\GroupLangTable": Таблица языковых параметров типов цен
"\Bitrix\Catalog\GroupAccessTable": Таблица прав доступа к типам цен
"\Bitrix\Catalog\PriceTable": Таблица непосредственно цен на товары, но использовать вместо него нужно "\Bitrix\Catalog\Model\Price", иначе в некоторых местах цена может не обновиться

Выборка всех типов цен:

$rsGroup = \Bitrix\Catalog\GroupTable::getList();

while($arGroup=$rsGroup->fetch())
{
    print_r($arGroup);
}

/*
Array
(
    [ID] => 1
    [NAME] => base_price
    [BASE] => Y
    [SORT] => 100
    [XML_ID] => base_price
    [TIMESTAMP_X] => Bitrix\Main\Type\DateTime Object
        (
            [value:protected] => DateTime Object
                (
                    [date] => 2018-09-13 01:27:38.000000
                    [timezone_type] => 3
                    [timezone] => Europe/Moscow
                )

        )

    [MODIFIED_BY] => 1
    [DATE_CREATE] => Bitrix\Main\Type\DateTime Object
        (
            [value:protected] => DateTime Object
                (
                    [date] => 2017-08-04 17:13:40.000000
                    [timezone_type] => 3
                    [timezone] => Europe/Moscow
                )

        )

    [CREATED_BY] => 1
)
Array
(
    [ID] => 2
    [NAME] => action_price
    [BASE] => N
    [SORT] => 1001
    [XML_ID] => action_price
    [TIMESTAMP_X] => Bitrix\Main\Type\DateTime Object
        (
            [value:protected] => DateTime Object
                (
                    [date] => 2017-12-27 16:40:30.000000
                    [timezone_type] => 3
                    [timezone] => Europe/Moscow
                )

        )

    [MODIFIED_BY] => 1
    [DATE_CREATE] => Bitrix\Main\Type\DateTime Object
        (
            [value:protected] => DateTime Object
                (
                    [date] => 2017-11-08 18:12:20.000000
                    [timezone_type] => 3
                    [timezone] => Europe/Moscow
                )

        )

    [CREATED_BY] => 1
)
*/

Фрагмент

Выборка языкозависимого названия типа цены с XML_ID='base_price' (дополнительно выбираем ID и XML_ID из основной таблицы типов цен):

$rsGroup = \Bitrix\Catalog\GroupLangTable::getList(array(
    'filter' => array('LANG'=>LANGUAGE_ID,'CATALOG_GROUP.XML_ID'=>'base_price'),
    'select' => array('NAME','XML_ID'=>'CATALOG_GROUP.XML_ID', 'CATALOG_GROUP_ID')
));

if($arGroup=$rsGroup->fetch())
{
    print_r($arGroup);
}

/*
Array
(
    [NAME] => Цена из 1С
    [XML_ID] => bace_price
    [CATALOG_GROUP_ID] => 1
)
*/

Фрагмент

Выбираем ID групп пользователей, которым доступна цена с XML_ID='base_price':

$rsGroup = \Bitrix\Catalog\GroupAccessTable::getList(array(
    'filter' => array('ACCESS'=>'Y','CATALOG_GROUP.XML_ID'=>'base_price'),
    'select' => array('GROUP_ID')
));

while($arGroup=$rsGroup->fetch())
{
    print_r($arGroup);
}

/*
Array
(
    [GROUP_ID] => 1
)
Array
(
    [GROUP_ID] => 2
)
Array
(
    [GROUP_ID] => 3
)
Array
(
    [GROUP_ID] => 4
)
*/

Фрагмент

Выборка цены типа XML_ID='base_price' товара с ID=15547:

$rsPrice = \Bitrix\Catalog\Model\Price::getList(array(
    'filter'=>array('CATALOG_GROUP.XML_ID'=>'base_price','PRODUCT_ID'=>15547)
));

while($arPrice=$rsPrice->fetch())
{
    print_r($arPrice);
}

/*
Array
(
    [ID] => 29146
    [PRODUCT_ID] => 15547
    [EXTRA_ID] => 
    [CATALOG_GROUP_ID] => 1
    [PRICE] => 1350.00
    [CURRENCY] => RUB
    [TIMESTAMP_X] => Bitrix\Main\Type\DateTime Object
        (
            [value:protected] => DateTime Object
                (
                    [date] => 2018-09-20 15:07:20.000000
                    [timezone_type] => 3
                    [timezone] => Europe/Moscow
                )

        )

    [QUANTITY_FROM] => 
    [QUANTITY_TO] => 
    [TMP_ID] => 
    [PRICE_SCALE] => 1350.000000000000
)
*/

Фрагмент

Функция обновления цены определенного типа у товара:

function savePrice($catalogGroupId,$price,$productId,$currency='RUB')
{
    if(!$catalogGroupId || !$productId || !$currency)
        return array("Неверно заданы параметры");

    $rsP = \Bitrix\Catalog\Model\Price::getList(array(
        'filter' => array('CATALOG_GROUP_ID'=>$catalogGroupId,'PRODUCT_ID'=>$productId),
    ));

    if($arP=$rsP->fetch())
    {
        if($price)
        {
            $result = \Bitrix\Catalog\Model\Price::update($arP['ID'],array(
                'PRICE'=>$price,
                'PRICE_SCALE'=>$price,
                'CURRENCY'=>$currency,
            ));
        }
        else
        {
            $result = \Bitrix\Catalog\Model\Price::delete($arP['ID']);
        }
    }
    else
    {
        $result = \Bitrix\Catalog\Model\Price::add(array(
            'CATALOG_GROUP_ID'=>$catalogGroupId,
            'PRODUCT_ID'=>$productId,
            'PRICE'=>$price,
            'PRICE_SCALE'=>$price,
            'CURRENCY'=>$currency,
        ));            
    }
    
    if($result->isSuccess()) 
    {
        return true;
    }
    else
    {
        return $result->getErrorMessages();
    }
}

Фрагмент

Выборка из таблицы цен с фильтром и выборкой по товару и элементу инфоблока:

$priceResult = \Bitrix\Catalog\PriceTable::getList([
    'order' => [
        'PRICE'=>'ASC'
    ],
    'filter' => [
        'ELEMENT.IBLOCK_ID' => 10,
        'ELEMENT.ACTIVE' => 'Y',
        'PRODUCT.AVAILABLE' => 'Y',
    ],
    'limit' => 1,
    'select' => [
        '*',
        'NAME' => 'ELEMENT.NAME',
        'XML_ID' => 'ELEMENT.XML_ID',
    ],
]);
        
$price = $priceResult->fetch();

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии