Телеграм: @camouf_ru Почта: mihail@bazarow.ru

Массово: применить наценку ко всем товарам каталога с пересчетом от базовой.

Рассмотрим как, в магазине работающем на 1С-Битрикс, массово применить наценку на все товары каталога. Устанавливать будем для не базовой цены. При каждом обновлении базовой цены (например при обновлении товаров импортом), наша цена будет пересчитываться согласно наценке.

Для начала: в настройках магазина, создаем новый тип цены "Цена продажи" и выставляем права на просмотр и покупку нужной группе пользователей (в моем случае для всех). Также, запрещаем всем пользователям просмотр и покупку по Базовой цене

применить наценку ко всем товарам каталога

Здесь же, в настройках магазина, создаем наценку: называем как удобно и выставляем процент наценки.

применить наценку ко всем товарам каталога

Запоминаем:
- ID типа цены, на которую нужно установить наценку: в моем случае 4
- ID наценки, которую нужно применить к этому типу цен: у меня опять 1
- ID инфоблока с которым работаем: у меня 5-ый

Применяем наценку методом CPrice::Update

Дальше все просто: нам нужно перебрать все товары каталога методом CIBlockElement::GetList и методом CPrice::Update обновить параметры нужного типа цен.

Запускаем выполнение вот этого кода:
Обратите внимание, в методе CIBlockElement::GetList используем Fetch, вместо GetNext - так как нужны только ID элементов (товаров). Fetch - отрабатывает быстрее, не содержит всех данных о элементе.

Cmodule::IncludeModule('iblock');
Cmodule::IncludeModule('catalog');

$IBLOCK_ID = 5; // Инфоблок
$EXTRA_ID = "1"; // Наценка
$PRICE_ID = "4"; // Тип цены

$getElementId = CIBlockElement::GetList(
    Array("ID" => "ASC"),
    Array("IBLOCK_ID" => $IBLOCK_ID),
    false, false,
    Array('ID',)
);
while ($arID = $getElementId->Fetch()) {
    $arFields = Array(
        "PRODUCT_ID" => $arID['ID'],
        "CATALOG_GROUP_ID" => $PRICE_ID,
        "EXTRA_ID" => $EXTRA_ID,
        "CURRENCY" => "RUB",
    );
    $res = CPrice::GetList(
        array(),
        array(
            "PRODUCT_ID" => $PRODUCT_ID,
            "CATALOG_GROUP_ID" => $PRICE_TYPE_ID
        )
    );
    if ($arr = $res->Fetch()) {
        CPrice::Update($arFields);
    } else {
        CPrice::Add($arFields);
    }
}

И проверяем результат, зайдя в любой товар. Должна установиться наценка на выбранный тип цены и расчитаться сама цена на основе базовой. При изменении цены товара, автоматически пересчитывается наша цена.

применить наценку ко всем товарам каталога

Если потребуется изменить величину наценки. Просто заходите в ее (наценки) настройки, меняете величину и ставите чекбокс на Пересчитать цены. Автоматически перезапишутся цены, с этой наценкой.

применить наценку ко всем товарам каталога

Таким образом, можно устанавливать наценки для разных типов цен. например: для разных групп пользователей или разных сайтов в системе.

Если нужно устанавливать наценку для новых товаров, которых не было до запуска скрипта, можно сделать обработчик в init.php срабатывающий на событие добавление элемента OnAfterIBlockElementAdd

Просмотров: 3034 | Комментариев: 8

Комментарии

Внимание! все сообщения проходят премодерацию. Ваше сообщение появится после проверки
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Защита от автоматических сообщений
Загрузить файл
Нажимая кнопку "Отправить", Вы принимаете условия
Политики конфиденциальности и обработки персональных данных
sinilnikov@principcomp.ru
Пардон, а куда вставлять код с методом CPrice::Update? :)
Имя Цитировать
Михаил Базаров
Цитата
sinilnikov@principcomp.ru пишет:
Пардон, а куда вставлять код с методом CPrice::Update?  
Просто на любую страницу и открыть ее в браузере
Имя Цитировать
Константин Синильников
Цитата
Михаил Базаров пишет:
можно сделать обработчик в init.php срабатывающий на событие добавление элемента OnAfterIBlockElementAdd
А есть код такого обработчика?
Имя Цитировать
Михаил Базаров
Цитата
Константин Синильников написал:
Цитата
Михаил Базаров пишет:
можно сделать обработчик в init.php срабатывающий на событие добавление элемента OnAfterIBlockElementAdd
А есть код такого обработчика?

Примерно так (сделал не проверяя, возможны ошибки - но должно сработать):
Скрытый текст
Имя Цитировать
Guest
а возможно ли установить наценку не процент а допустим плюс 100 р на весь товар
Имя Цитировать
Михаил Базаров
Цитата
Guest написал:
а возможно ли установить наценку не процент а допустим плюс 100 р на весь товар
Именно через наценки, думаю, не получится
Но можно, просто изменить цену, пробежавшись по всем товарам циклом и этим же методом ( CPrice::Update)  обновить цены.
Эта заметка поможет
https://camouf.ru/blog-note/6554/
Там цена копируется из свойства- вам, вместо получения свойства, достаточно просто получать текущую цену (любую), прибавлять к ней 100 и сохранять в любую другую цену (или эту же)
Имя Цитировать
Guest
Я правильно понял, можно пустую страницу создать .php закинуть туда код, и открыть в браузере?
Если да, то у меня не срабатывает, показывает код
Имя Цитировать
Михаил Базаров
Цитата
Guest пишет:
Я правильно понял, можно пустую страницу создать .php закинуть туда код, и открыть в браузере?
Если да, то у меня не срабатывает, показывает код
Да, код не забудте взять в <? тут код ?>
Имя Цитировать
Поделиться страницей Спасибо, это помогает развивать сайт.
Мой youtube канал. Сюда я выкладываю видео уроки по разработке сайтов и не только. Подписывайтесь, скоро будет серия свежих видео-инструкций:
Перейти на канал
Заметки разработчика

Примерно с 2013-го года пишу, короткие и не очень, заметки по разработке сайтов на Битрикс. Возможно, будут полезны кому-то еще. Во всех заметках есть возможность комментирования и обсуждения. Вы можете задавать уточняющие вопросы прямо там- отвечаю или дополняю заметки по возможности.

Заказaть разработку attention