Еще раз сам вопрос на всякий случай: имеем торговый каталог с указаной базовой ценой. Задача - изменить цену2 для всех элементов каталога путем прибавления наценки к базовой цене. Вариант правки каждого элемента ручками не катит.
Друзья, решил проблему небольшим скриптом. Скрипт проходит по всем товарам с заданным фильтром и устанавливает для них наценку. Далее необходимо лишь штатными средствами Битрикс пересчитать цену с наценкой - и всё получается красиво. Если интересно - сам скрипт могу выложить.
Михаил Гущин пишет: Друзья, решил проблему небольшим скриптом. Скрипт проходит по всем товарам с заданным фильтром и устанавливает для них наценку. Далее необходимо лишь штатными средствами Битрикс пересчитать цену с наценкой - и всё получается красиво. Если интересно - сам скрипт могу выложить.
Спасибо, уже сам справился после ковыряния в бд. собственно, там не только необходимо изменить ID наценки. в таблице b_catalog_price добавляется дублирующая строка для определенного элемента каталога, в которой и указывается ID наценки и новая цена. Т.е. имеем по 2 записи на каждый элемент каталога - одна запись с базовой ценой, без наценки, вторая с наценкой и ценой_2. Само собой, после пересчета цен в разделе наценок, вторая запись правится, как должно. В целом - несколько странный механизм установки наценок. Хотя, мне сложно судить, я - не профессиональный разработчик ))
господа, вопрос очень актуален, я прекрасно знаю апи, но писать скрипты в апи кмс не проще, чем писать их в гольном пхп.
везде написано что в торговом каталоге есть масс апдейт цен от базовой, а на деле надо сперва прикрутить к сотне тысяч позиций наценку и только потом ты сможешь обновить их. бред, причём полнейший
Позволю себе привести несколько прилизанный вариант скрипта Михаила Гущина. Добавил вывод сообщений об ошибках и пересчёт цен (CPrice::Update(..., true), CPrice:: Add (..., true)).
Код
if(CModule::IncludeModule("iblock") && CModule::IncludeModule("catalog")) {
echo "Скрипт запущен...<br />";
$newExtraId = 1; // ID нашей наценки
$newPriceId = 2; // ID типа цены, для которого задаём эту наценку
$catalogIblockType = "products"; // код типа инфоблока, для которого проводим обработку
$count = 0;
$rsProducts = CCatalogProduct::GetList(
array("ID" => "ASC"),
array("IBLOCK_TYPE" => $catalogIblockType),
false,
false
);
while (($arProduct = $rsProducts->Fetch())/* && $count < 10*/) {
$arPriceFields = Array(
"PRODUCT_ID" => $arProduct["ID"],
"CATALOG_GROUP_ID" => $newPriceId,
"EXTRA_ID" => $newExtraId,
"CURRENCY" => "RUR",
);
$rsProductPrices = CPrice::GetList(
array(),
array(
"PRODUCT_ID" => $arProduct["ID"],
"CATALOG_GROUP_ID" => $newPriceId
)
);
if ($arProductPrice = $rsProductPrices->Fetch()) {
if (CPrice::Update($arProductPrice['ID'], $arPriceFields, true) !== false) {
print "Обновлена цена ".$arProductPrice['ID']." для товара ".$arProduct["ID"]."<br />";
}
else {
print "Ошибка при обновлении цены ".$arProductPrice['ID']." для товара ".$arProduct["ID"].": ";
if ($ex = $APPLICATION->GetException())
echo $ex->GetS tring();
echo "<br />";
}
}
else {
$priceId = CPrice::Add($arPriceFields, true);
if ($priceId !== false) {
print "Добавлена новая цена для товара ".$arProduct["ID"]." ".$priceId."<br />";
}
else {
print "Ошибка при добавлении цены для товара ".$arProduct["ID"].": ";
if ($ex = $APPLICATION->GetException())
echo $ex->GetS tring();
echo "<br />";
}
}
$count++;
}
echo "Скрипт завершён. Обработано ".$count." товаров.";
}
Настроечные переменные $newExtraId, $newPriceId и $catalogIblockType задаются в начале скрипта.
mbbo, этот скрипт можно выполнить, например, из командной строки PHP в админке (Рабочий стол > Настройки > Инструменты > Командная PHP-строка)
alexmayants, выполняю данный скрипт в Рабочий стол > Настройки > Инструменты > Командная PHP-строка, подставив свои значения $newExtraId, $newPriceId и $catalogIblockType, в результатах выполнения команды ничего и на деле ничего не меняется, как быть?