egvimar
@egvimar
Истины нет, существуют только версии...

Как в Битрикс через SQL запрос, нескольким товарам записать свойство?

Как в Битрикс через SQL запрос, нескольким товарам записать свойство? То есть свойство уже есть, нужно записать корректное значение из списка, как это сделать, вроде как можно и не должно быть сложно!
  • Вопрос задан
  • 1130 просмотров
Пригласить эксперта
Ответы на вопрос 4
gromdron
@gromdron
Работаю с Bitrix24
TLDR; Делайте в цикле по элементам изменение свойства.

не должно быть сложно!


Вообще-то образно говоря - никак.
Можно написать конкретное решение под вашу структуру, но уместить это в запрос нет (минимум процедура).

Дело в том, что в зависимости от типа инфоблока у вас может быть хранение значений свойства либо в одной таблице либо в отдельных.
В случае если запись в одной таблице, то нужно будет сначала искать ID свойства, а уже потом выполнять обновление у нескольких элементов и добавление у элементов где этого свойства нет.

В случае хранение в отдельной таблице алгоритм почти такой же, за исключением того что искать нужно не значение свойства, а запись элемента в таблице при учете что это не множественные свойства.
Ответ написан
Комментировать
Добавлю к ответу Андрея (в принципе полностью верному), что вообще не стоит даже пытаться это сделать - используйте API и вы застрахуете себя от многих проблем в будущем.
Если вам необходимо действие как транзакция - этом можно организовать: гуглите "StartTransaction"
Ответ написан
@anton99zel Куратор тега 1С-Битрикс
29а класс средней школы №7
Через SQL нельзя делать, да хотя бы потому, что в разных таблицах могут быть зависимости. Получите потом ошибки и глюки.
Свойство можно присвоить так:
https://dev.1c-bitrix.ru/api_help/iblock/classes/c...
Прогнать выше код можно циклом через ГетЛист, сделав отбор нужных вам элементов
https://dev.1c-bitrix.ru/api_help/iblock/classes/c...

Вот *овнокод как изменить цену у некоторых товаров, со свойством тот же принцип:
<?
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
//это просто нужно
CModule::IncludeModule("catalog");
// подключаем модуль каталога
$arSelect = Array("ID", "IBLOCK_ID", "CATALOG_PRICE_1");
// выбираем поля
$arFilter = Array("IBLOCK_ID"=>8, "CATALOG_PRICE_1" => '9000');
// фильтруем, выбирая инфоблок и товары с ценой в 9000 рублей, сюда же можно вписать свойства
$resw = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>1000000), $arSelect);
while($ob = $resw->GetNextElement()){ 
 $arFields = $ob->GetFields();  
 $arProps = $ob->GetProperties(); 
{
//echo $arFields[ID].' - '.$arFields['CATALOG_PRICE_1'].'</br>';
$PRODUCT_ID = $arFields[ID];
$PRICE_TYPE_ID = 1;
$arFields = Array(
    "PRODUCT_ID" => $PRODUCT_ID,
    "CATALOG_GROUP_ID" => $PRICE_TYPE_ID,
    "PRICE" => '9500', //повысим цены с 9000 до 9500
    "CURRENCY" => "RUB"
);

$res = CPrice::GetList(
        array(),
        array(
                "PRODUCT_ID" => $PRODUCT_ID,
                "CATALOG_GROUP_ID" => $PRICE_TYPE_ID
            )
    );
if ($arr = $res->Fetch())
{
CPrice::Update($arr["ID"], $arFields); //апдейт цен
}
else
{
CPrice::Add($arFields);
};
}
};
Ответ написан
на любой CMS в любой документации вы увидите " используйте API методы"
тем более с БД в которой есть зависимость таблиц.
ПО этому если вы хотите сделать прямой запрос в БД вы или пытаетесь сделать какую-то дичь
или вы неправы.
Для этого у вас есть стандартные апи методы битрикс, работа с ними гарантирует вам что при обновление движка ваше художество продолжет работать ( тут гы-гы и большая звездочка в мелком тексте)
Так же не забывайте что битрикс развивается вместе с этим и меняется структура самой БД.
Так-что ответ никак
Поскольку вы не смогли мотивировать причину таких действий.

ну и если вам прям уж так совсем кастома используются hiload блоки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы