require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); global $USER; if (!$USER || !$USER->IsAdmin()) { http_response_code(403); die('Доступ только администратору.'); } if (!CModule::IncludeModule('iblock')) { die('Не удалось подключить модуль iblock.'); } $IBLOCK_ID = 12; $SKU_PROP_ID = 50; $fixes = [ 4556 => ['sku'=>'MFF-A12CS'], 4547 => ['sku'=>'MFF-B12C'], 4551 => ['sku'=>'MFF-C12C'], 4554 => ['sku'=>'MFF-D12C'], 4569 => ['sku'=>'MFP-H16C'], 4567 => ['sku'=>'MFP-K13C'], ]; function h($s) { return htmlspecialchars((string)$s, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } function get_item($id, $iblockId, $skuPropId) { $r = CIBlockElement::GetList( [], ['IBLOCK_ID'=>$iblockId, 'ID'=>$id], false, false, ['ID','NAME','ACTIVE','PROPERTY_'.$skuPropId] ); if ($row = $r->GetNext()) { return [ 'ID'=>(int)$row['ID'], 'NAME'=>$row['NAME'], 'ACTIVE'=>$row['ACTIVE'], 'SKU'=>(string)$row['PROPERTY_'.$skuPropId.'_VALUE'], ]; } return null; } $action = isset($_POST['action']) ? $_POST['action'] : ''; $message = ''; $errors = []; $rows = []; if ($action === 'update') { if (!check_bitrix_sessid()) { $errors[] = 'Ошибка сессии. Обновите страницу и попробуйте снова.'; } else { // Validate every product first. If anything unexpected is found, update nothing. foreach ($fixes as $id => $target) { $item = get_item($id, $IBLOCK_ID, $SKU_PROP_ID); if (!$item) { $errors[] = "ID {$id}: товар не найден."; continue; } if ($item['ACTIVE'] !== 'Y') { $errors[] = "ID {$id}: товар не ACTIVE."; } // Accept either the exact correct target or a visually-confusable Cyrillic variant. $normalized = strtr($item['SKU'], [ 'А'=>'A','В'=>'B','С'=>'C','Е'=>'E','Н'=>'H','К'=>'K','М'=>'M','О'=>'O','Р'=>'P','Т'=>'T','Х'=>'X', 'а'=>'a','в'=>'b','с'=>'c','е'=>'e','н'=>'h','к'=>'k','м'=>'m','о'=>'o','р'=>'p','т'=>'t','х'=>'x', ]); if (strcasecmp($normalized, $target['sku']) !== 0) { $errors[] = "ID {$id}: неожиданный текущий артикул «{$item['SKU']}», ожидалась визуальная версия {$target['sku']}."; } } // Ensure no other element already owns a target SKU. if (!$errors) { foreach ($fixes as $id => $target) { $r = CIBlockElement::GetList( [], ['IBLOCK_ID'=>$IBLOCK_ID, 'PROPERTY_'.$SKU_PROP_ID=>$target['sku'], '!ID'=>$id], false, ['nTopCount'=>1], ['ID','NAME'] ); if ($other = $r->GetNext()) { $errors[] = "Артикул {$target['sku']} уже используется другим товаром ID {$other['ID']}: {$other['NAME']}."; } } } if (!$errors) { $changed = 0; foreach ($fixes as $id => $target) { $item = get_item($id, $IBLOCK_ID, $SKU_PROP_ID); if ($item['SKU'] !== $target['sku']) { CIBlockElement::SetPropertyValuesEx($id, $IBLOCK_ID, [$SKU_PROP_ID => $target['sku']]); $changed++; } } $message = "Готово. Исправлено артикулов: {$changed}. Цены и другие поля не изменялись."; } } } foreach ($fixes as $id => $target) { $item = get_item($id, $IBLOCK_ID, $SKU_PROP_ID); $rows[] = [ 'id'=>$id, 'item'=>$item, 'target'=>$target['sku'], ]; } ?>
Меняется только свойство Артикул (PROPERTY 50). Только ACTIVE товары из IBLOCK 12. Цены, названия, описания и остальные свойства не меняются.
| ID | Товар | Текущий SKU | Нужный SKU | Состояние |
|---|