Как задача звучит тривиально...
Реальность:
\Bitrix\Main\Loader::includeModule('iblock');
$propertyValuesIdByXmlId = $elementPropertyValuesById = [];
$iblockId = 17;
$elementId = 176;
$propertyCode = 'HIT';
$deletePropertyValuesXmlId = ['NEW'];
$iterator = \Bitrix\Iblock\PropertyEnumerationTable::getList([
'select' => ['*'],
'filter' => ['PROPERTY.IBLOCK_ID' => $iblockId, 'PROPERTY.CODE' => $propertyCode]
]);
while($row = $iterator->fetch()) {
$propertyValuesIdByXmlId[$row['XML_ID']] = $row['ID'];
}
$dbRes = CIBlockElement::GetList([], ['IBLOCK_ID' => $iblockId, 'ID' => $elementId], false, false, ['IBLOCK_ID', 'ID', 'PROPERTY_'.$propertyCode]);
while($arRes = $dbRes->Fetch()) {
$value = $arRes['PROPERTY_'.$propertyCode.'_VALUE'];
$valueId = $arRes['PROPERTY_'.$propertyCode.'_ENUM_ID'];
$elementPropertyValuesById[$valueId] = $value;
}
if($elementPropertyValuesById) {
foreach($deletePropertyValuesXmlId as $xmlId) {
$deletePropertyValueId = $propertyValuesIdByXmlId[$xmlId];
if(isset($elementPropertyValuesById[$deletePropertyValueId])) {
unset($elementPropertyValuesById[$deletePropertyValueId]);
}
}
CIBlockElement::SetPropertyValuesEx($elementId, $iblockId, [$propertyCode => array_keys($elementPropertyValuesById)]);
}
P.S. все подписано конечно, но если что-то непонятно, спрашивай
UPD
перенес CIBlockElement::SetPropertyValuesEx выше в условие