• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/controller/product.php
  • Класс: BitrixCatalogControllerProduct
  • Вызов: Product::updateAction
public function updateAction(int $id, array $fields): ?array
{
	$fields['IBLOCK_ID'] ??= $this->getProductIblockId($id);
	$r = $this->checkPermissionUpdate($id);
	if($r->isSuccess())
	{
		if (isset($fields['IBLOCK_SECTION_ID']) && (int)$fields['IBLOCK_SECTION_ID'] > 0)
		{
			$r = $this->checkPermissionIBlockElementSectionBindUpdate($fields['IBLOCK_SECTION_ID']);
		}
	}

	if($r->isSuccess())
	{
		$element = new CIBlockElement();

		$groupFields = $this->splitFieldsByEntity($fields);

		$productFields = $groupFields['productFields'];
		$propertyFields = $groupFields['propertyFields'];
		$elementFields = $groupFields['elementFields'];

		$productFields = $this->prepareProductFields($productFields);
		$propertyFields = $this->preparePropertyFields($propertyFields);

		$propertyFields = $this->fillPropertyFieldsDefaultPropertyValues($id, $fields['IBLOCK_ID'], $propertyFields);
		$propertyFields = $this->preparePropertyFieldsUpdate($propertyFields);

		$elementFieldsUpdate = count($propertyFields)>0 ? array_merge($elementFields, ['PROPERTY_VALUES'=>$propertyFields]):$elementFields;

		$r = $this->exists($id);
		if($r->isSuccess())
		{
			$r = $this->updateValidate($elementFieldsUpdate+['ID'=>$id]);
			if($r->isSuccess())
			{
				$element->Update($id, $elementFieldsUpdate);
				if($element->LAST_ERROR<>'')
				{
					$r->addError(new Error($element->LAST_ERROR));
				}
				elseif (!empty($productFields))
				{
					$r = BitrixCatalogModelProduct::update($id, $productFields);
				}
			}
		}
	}

	if($r->isSuccess())
	{
		return ['ELEMENT'=>$this->get($id)];
	}
	else
	{
		$this->addErrors($r->getErrors());
		return null;
	}
}