• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_product.php
  • Класс: \CCrmProduct
  • Вызов: CCrmProduct::Update
static function Update($ID, $arFields)
{
	global $USER;

	if (!Loader::includeModule('catalog'))
	{
		return false;
	}

	if (!self::CheckFields('UPDATE', $arFields, $ID))
	{
		return false;
	}

	$iblockElementUpdated = false;
	$needUpdateIblockElement = false;

	if(isset($arFields['NAME'])
		|| isset($arFields['CODE'])
		|| isset($arFields['SECTION_ID'])
		|| isset($arFields['SORT'])
		|| isset($arFields['ACTIVE'])
		|| isset($arFields['DETAIL_PICTURE'])
		|| isset($arFields['DESCRIPTION'])
		|| isset($arFields['DESCRIPTION_TYPE'])
		|| isset($arFields['PREVIEW_PICTURE'])
		|| isset($arFields['PREVIEW_TEXT'])
		|| isset($arFields['PREVIEW_TEXT_TYPE'])
		|| isset($arFields['ORIGINATOR_ID'])
		|| isset($arFields['ORIGIN_ID'])
		|| isset($arFields['XML_ID'])
		|| isset($arFields['PROPERTY_VALUES'])
		|| isset($arFields['DATE_CREATE'])
		|| array_key_exists('TIMESTAMP_X', $arFields)    // May be false or null
		|| isset($arFields['CREATED_BY'])
		|| isset($arFields['MODIFIED_BY']))
	{
		$element =  new CIBlockElement();
		$obResult = $element->GetById($ID);
		if($arElement = $obResult->Fetch())
		{
			unset($arElement['DATE_CREATE']);
			unset($arElement['CREATED_BY']);
			unset($arElement['MODIFIED_BY']);
			unset($arElement['TIMESTAMP_X']);
			if(isset($arFields['NAME']))
			{
				$arElement['NAME'] = $arFields['NAME'];
			}

			if(isset($arFields['CODE']))
			{
				$arElement['CODE'] = $arFields['CODE'];
			}

			if (isset($arElement['IN_SECTIONS']) && $arElement['IN_SECTIONS'] !== 'N')
			{
				$sections = [];
				$res = CIBlockElement::GetElementGroups($ID, true, ['ID']);
				while($row = $res->Fetch())
				{
					$sections[] = (int)$row['ID'];
				}
				if (count($sections) > 0)
				{
					$arElement['IBLOCK_SECTION'] = $sections;
				}
				unset($sections, $res, $row);
			}

			if(isset($arFields['SECTION_ID']))
			{
				$newSectionId = (int)$arFields['SECTION_ID'];
				if (is_array($arElement['IBLOCK_SECTION']) && isset($arElement['IBLOCK_SECTION_ID']))
				{
					$oldSectionId = (int)$arElement['IBLOCK_SECTION_ID'];
					$key = array_search($oldSectionId, $arElement['IBLOCK_SECTION'], true);
					if ($key !== false)
					{
						$arElement['IBLOCK_SECTION'][$key] = $newSectionId;
					}
					unset($oldSectionId, $key);
				}
				$arElement['IBLOCK_SECTION_ID'] = $newSectionId;
				unset($newSectionId);
			}

			if(isset($arFields['SORT']))
			{
				$arElement['SORT'] = $arFields['SORT'];
			}

			if(isset($arFields['ACTIVE']))
			{
				$arElement['ACTIVE'] = $arFields['ACTIVE'];
			}

			if(isset($arFields['DETAIL_PICTURE']))
			{
				$arElement['DETAIL_PICTURE'] = $arFields['DETAIL_PICTURE'];
			}
			else
			{
				unset($arElement["DETAIL_PICTURE"]);
			}

			if(isset($arFields['DESCRIPTION']))
			{
				$arElement['DETAIL_TEXT'] = $arFields['DESCRIPTION'];
			}

			if(isset($arFields['DESCRIPTION_TYPE']))
			{
				$arElement['DETAIL_TEXT_TYPE'] = $arFields['DESCRIPTION_TYPE'];
			}

			if(isset($arFields['PREVIEW_PICTURE']))
			{
				$arElement['PREVIEW_PICTURE'] = $arFields['PREVIEW_PICTURE'];
			}
			else
			{
				unset($arElement["PREVIEW_PICTURE"]);
			}

			if(isset($arFields['PREVIEW_TEXT']))
			{
				$arElement['PREVIEW_TEXT'] = $arFields['PREVIEW_TEXT'];
				$arElement['PREVIEW_TEXT_TYPE'] = 'text';
			}

			if(isset($arFields['PREVIEW_TEXT_TYPE']))
			{
				$arElement['PREVIEW_TEXT_TYPE'] = $arFields['PREVIEW_TEXT_TYPE'];
			}

			if(isset($arFields['XML_ID']))
			{
				$arElement['XML_ID'] = $arElement['EXTERNAL_ID'] = $arFields['XML_ID'];
			}
			else
			{
				if (isset($arFields['ORIGINATOR_ID']) || isset($arFields['ORIGIN_ID']))
				{
					if ($arFields['ORIGINATOR_ID'] <> '' && $arFields['ORIGIN_ID'] <> '')
					{
						$arElement['XML_ID'] = $arFields['ORIGINATOR_ID'].'#'.$arFields['ORIGIN_ID'];
					}
					else
					{
						$delimiterPos = mb_strpos($arElement['XML_ID'], '#');
						if ($arFields['ORIGINATOR_ID'] <> '')
						{
							if ($delimiterPos !== false)
							{
								$arElement['XML_ID'] = $arFields['ORIGINATOR_ID'].mb_substr($arElement['XML_ID'], $delimiterPos);
							}
							else $arElement['XML_ID'] = $arFields['ORIGINATOR_ID'];
						}
						else
						{
							if ($delimiterPos !== false)
							{
								$arElement['XML_ID'] = mb_substr($arElement['XML_ID'], 0, $delimiterPos).$arFields['ORIGIN_ID'];
							}
							else $arElement['XML_ID'] = '#'.$arFields['ORIGINATOR_ID'];
						}
					}
				}
			}

			if(isset($arFields['DATE_CREATE']))
			{
				$arElement['DATE_CREATE'] = $arFields['DATE_CREATE'];
			}

			// May be false or null
			if(array_key_exists('TIMESTAMP_X', $arFields))
			{
				$arElement['TIMESTAMP_X'] = $arFields['TIMESTAMP_X'];
			}

			if(isset($arFields['CREATED_BY']))
			{
				$arElement['CREATED_BY'] = $arFields['CREATED_BY'];
			}

			if(isset($arFields['MODIFIED_BY']))
			{
				$arElement['MODIFIED_BY'] = $arFields['MODIFIED_BY'];
			}
			else
			{
				if (isset($USER) && $USER instanceof \CUser)
				{
					$arElement['MODIFIED_BY'] = $USER->GetID();
				}
			}

			if(isset($arFields['PROPERTY_VALUES']) && is_array($arFields['PROPERTY_VALUES']))
			{
				$arElement['PROPERTY_VALUES'] = $arFields['PROPERTY_VALUES'];
			}

			if(!$element->Update($ID, $arElement))
			{
				self::$LAST_ERROR = $element->LAST_ERROR;
				return false;
			}

			$iblockElementUpdated = true;
		}
	}

	// update VAT
	$arCatalogProductFields = array();
	if (isset($arFields['VAT_INCLUDED']))
		$arCatalogProductFields['VAT_INCLUDED'] = $arFields['VAT_INCLUDED'];
	if (isset($arFields['VAT_ID']) && !empty($arFields['VAT_ID']))
		$arCatalogProductFields['VAT_ID'] = $arFields['VAT_ID'];
	if (isset($arFields['MEASURE']) && !empty($arFields['MEASURE']))
		$arCatalogProductFields['MEASURE'] = (int)$arFields['MEASURE'];
	if (!empty($arCatalogProductFields))
	{
		$arCatalogProductFields['ID'] = (int)$ID;
		if (!self::innerProductModify($arCatalogProductFields))
		{
			return false;
		}
		if (!$iblockElementUpdated)
		{
			$needUpdateIblockElement = true;
		}
	}

	if (isset($arFields['PRICE']) && isset($arFields['CURRENCY_ID']))
	{
		self::setPrice($ID, $arFields['PRICE'], $arFields['CURRENCY_ID']);
		if (!$iblockElementUpdated)
		{
			$needUpdateIblockElement = true;
		}
	}
	else
	{
		if (isset($arFields['PRICE']) || isset($arFields['CURRENCY_ID']))
		{
			$price = $currency = false;
			if (!isset($arFields['PRICE']))
			{
				$basePriceInfo = self::getPrice($ID);
				if ($basePriceInfo !== false && is_array($basePriceInfo) && isset($basePriceInfo['PRICE']))
				{
					$price = $basePriceInfo['PRICE'];
					$currency = $arFields['CURRENCY_ID'];
				}
			}
			elseif (!isset($arFields['CURRENCY_ID']))
			{
				$basePriceInfo = self::getPrice($ID);
				if ($basePriceInfo !== false && is_array($basePriceInfo) && isset($basePriceInfo['PRICE']))
				{
					$price = $arFields['PRICE'];
					$currency = $basePriceInfo['CURRENCY'];
				}
				else
				{
					$price = $arFields['PRICE'];
					$currency = CCrmCurrency::GetBaseCurrencyID();
					if ($currency === '')
						$currency = false;
				}
			}
			else
			{
				$price = $arFields['PRICE'];
				$currency = $arFields['CURRENCY_ID'];
			}
			if ($price !== false && $currency !== false)
			{
				CCrmProduct::setPrice($ID, $price, $currency);
				if (!$iblockElementUpdated)
				{
					$needUpdateIblockElement = true;
				}
			}
		}
	}

	if ($needUpdateIblockElement)
	{
		$element =  new CIBlockElement();
		$element->Update($ID, ['ID' => $ID], false, false, false, false);
	}

	CCrmEntityHelper::RemoveCached(self::CACHE_NAME, $ID);

	foreach (GetModuleEvents("crm", self::EVENT_ON_AFTER_UPDATE, true) as $arEvent)
		ExecuteModuleEventEx($arEvent, array($ID, $arFields));

	return true;
}