Проверка на наличие существующего элемента в инфоблоке по свойству (Битрикс)

Друзья заранее прошу, отнестись к вопросу не очень строго, пишу скрипт первый раз.

Есть 2 инфоблока:

  1. Инфоблок (ID=2) с товарами, там собираю массив с артикулами на WB;
  2. Инфоблок (ID=7) туда добавляю сами отзывы (которые забираю по API).

Функция скрипта: По API получаю отзывы с WB по определенным товарам (по артикулу WB, которые указаны в инфоблоке с товарами) и добавляет элементы в инфоблок с отзывами.

Подскажите пожалуйста как сделать, чтобы при выполнении функции проверялось, на наличие этого отзыва (то есть при повторном запуске скрипта, те что уже есть не добавлялись), у каждого отзыва с WB есть уникальный ID (пример: kzgXM4MB65w5GC7j5vjK), вот по этому свойству элемента инфоблока с отзывами (ID 7) и проверять на существования отзыва.

Заранее всем благодарен за помощь!

<?php
// подключение функций пролога
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");

set_time_limit(60);

CModule::IncludeModule("main"); // CFile
CModule::IncludeModule("iblock"); // CIBlockElement

$PRODUCT_IBLOCK = '2';
$REVIEWS_IBLOCK = '7';

function getRequestResult($request)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $request);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $headers = array();
    $headers[] = 'Content-Type: application/json';
    $headers[] = 'Authorization: ........';
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $result = curl_exec($ch);
    if (curl_errno($ch)) { 
        echo 'Error:' . curl_error($ch);
    }
    curl_close($ch);
    return $result;
}

function parseAndAdd($artnum, $PRODUCT_IBLOCK) {
    $org_url = 'https://feedbacks-api.wildberries.ru/api/v1/feedbacks?isAnswered=true&nmId='. $artnum .'&take=5000&skip=0';
    $html = getRequestResult($org_url);
    
    $arr = json_decode($html, true);
    $counter = 0;
    
    foreach($arr['data']['feedbacks'] as $value){
    
        //Свойства
        $PROP = array();
        $i = 0;
        if (!empty($value['photoLinks'])) {
            foreach ($value['photoLinks'] as $morePhoto) {
                $arMorePhoto['n'.$i] = array("VALUE"=>CFile::MakeFileArray($morePhoto['fullSize']));
                $i++;
            }
        }
        $PROP['ART_WB'] = $value['productDetails']['nmId'];
        $PROP['RAITING'] = $value['productValuation'];
        $PROP['ISTOCHNIK'] = $value['state'];
        $PROP['PHOTO'] = $arMorePhoto;
        $PROP['REVIEWSID'] = $value['id'];
        
        //$photolinks[] = $value['photoLinks'];
        /*if (!empty($photolinks)) {
            foreach($photolinks as $photo){
                $photo = $photo['fullSize'];
            }
        }*/
        
        $el = new CIBlockElement;
        $fields = [
            'ACTIVE' => "Y",
            'IBLOCK_ID' => 7,
            "IBLOCK_SECTION_ID" => false,
            "NAME" => $value['userName'],
            "PREVIEW_TEXT" => $value['text'],
            "PREVIEW_PICTURE" => $imgUrl ? CFile::MakeFileArray($imgUrl) : CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/local/api/wb/avatar.png"),
            "PROPERTY_VALUES" => $PROP,
            //'ACTIVE_FROM' => $date, // Начало активности
            //'DATE_CREATE' => $date, // Дата создания
        ];
        
        if ($PRODUCT_ID = $el->Add($fields)) {
            echo 'Добавлен отзыв, ID: ' . $PRODUCT_ID . '<br />';
            $counter++;
        } else {
            echo "Error[" . $PRODUCT_ID . "]: " . $el->LAST_ERROR . '<br />';
        }
        
    }
    
    echo 'Отзывы по товару с артикулом '.$artnum . ' добавлены. Количество '. $counter. '<br>';
    
}

//print_r($photo);
//print_r(parseAndAdd(113509876, 6));

$places_ids = []; // Храню артикулы всех товаров, по которым будет забирать отзывы
$arSelect = ["NAME","PROPERTY_ART_WB"];
$arFilter = ["IBLOCK_ID" => $PRODUCT_IBLOCK,"ACTIVE" => "Y",];
$resp = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
while($ob = $resp->GetNextElement()) {
    $arFields = $ob->GetFields(); // Получаю значения полей элемента
    $places_ids[] = $arFields['PROPERTY_ART_WB_VALUE']; // Заполняю массив с артикулами
}

foreach ($places_ids as $arrwb) {
    if (!empty($arrwb)) {
        parseAndAdd($arrwb, 7);
    }
}
?>

Ответы (2 шт):

Автор решения: Виктор Карев

Вам не нужно проверять на существование элемента инфоблока по значению свойства.

У каждого элемента инфоблока как раз для такого случая есть специальное поле XML_ID. Это поле предназначено для хранения внешних индексов. Поэтому записывайте ваш value['id'] не в свойство REVIEWSID, а в поле XML_ID:

$fields = [
        'ACTIVE' => "Y",
        'IBLOCK_ID' => 7,
        "IBLOCK_SECTION_ID" => false,
        "NAME" => $value['userName'],
        "PREVIEW_TEXT" => $value['text'],
        "PREVIEW_PICTURE" => $imgUrl ? CFile::MakeFileArray($imgUrl) : CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/local/api/wb/avatar.png"),
        "PROPERTY_VALUES" => $PROP,
        "XML_ID" => value['id'],
        //'ACTIVE_FROM' => $date, // Начало активности
        //'DATE_CREATE' => $date, // Дата создания
    ];

Ну а проверять на существование по значению поля - это уже просто.

→ Ссылка
Автор решения: Валерий

Виктор, еще раз спасибо, но вы натолкнули меня на идею.

А именно вместо свойства и XML_ID, воспользовался символьным кодом "CODE".

$fields = [
        'ACTIVE' => "Y",
        'IBLOCK_ID' => 7,
        "IBLOCK_SECTION_ID" => false,
        "NAME" => $value['userName'],
        "PREVIEW_TEXT" => $value['text'],
        "PREVIEW_PICTURE" => $imgUrl ? CFile::MakeFileArray($imgUrl) : CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/local/api/wb/avatar.png"),
        "PROPERTY_VALUES" => $PROP,
        "CODE" => value['id'],
        //'ACTIVE_FROM' => $date, // Начало активности
        //'DATE_CREATE' => $date, // Дата создания
    ];

А в настройках инфоблока во вкладке "Поля", поставил галку в поле Символьный код: галочку на "Обязательное" и галочку на "Если код задан, то проверять на уникальность".

Тем самым при повторном запуске, не загружался. А выходила ошибка "Элемент с таким символьным кодом уже существует."

→ Ссылка