• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockdocument.php
  • Класс: CIBlockDocument
  • Вызов: CIBlockDocument::CreateDocument
static function CreateDocument($parentDocumentId, $arFields)
{
	if (!array_key_exists("IBLOCK_ID", $arFields) || intval($arFields["IBLOCK_ID"]) <= 0)
		throw new Exception("IBlock ID is not found");

	$arFieldsPropertyValues = array();
	$complexDocumentId = ['iblock', get_called_class(), $parentDocumentId];

	$arDocumentFields = static::GetDocumentFields("iblock_".$arFields["IBLOCK_ID"]);

	$arKeys = array_keys($arFields);
	foreach ($arKeys as $key)
	{
		if (!array_key_exists($key, $arDocumentFields))
			continue;

		$arFields[$key] = (is_array($arFields[$key]) &&
			!CBPHelper::IsAssociativeArray($arFields[$key])) ? $arFields[$key] : array($arFields[$key]);
		$realKey = ((mb_substr($key, 0, mb_strlen("PROPERTY_")) == "PROPERTY_")? mb_substr($key, mb_strlen("PROPERTY_")) : $key);

		if ($arDocumentFields[$key]["Type"] == "user")
		{
			$arFields[$key] = CBPHelper::extractUsers($arFields[$key], $complexDocumentId);
		}
		elseif ($arDocumentFields[$key]["Type"] == "select")
		{
			$arV = array();
			$db = CIBlockProperty::GetPropertyEnum($realKey, false, array("IBLOCK_ID" => $arFields["IBLOCK_ID"]));
			while ($ar = $db->GetNext())
				$arV[$ar["XML_ID"]] = $ar["ID"];

			$listValue = array();
			foreach ($arFields[$key] as &$value)
			{
				if(CBPHelper::isAssociativeArray($value))
				{
					$listXmlId = array_keys($value);
					foreach($listXmlId as $xmlId)
					{
						$listValue[] = $arV[$xmlId];
					}
				}
				else
				{
					if (array_key_exists($value, $arV))
						$value = $arV[$value];
				}
			}
			if(!empty($listValue))
			{
				$arFields[$key] = $listValue;
			}
		}
		elseif ($arDocumentFields[$key]["Type"] == "file")
		{
			$files = array();
			foreach ($arFields[$key] as $value)
			{
				if (is_array($value))
				{
					foreach($value as $file)
					{
						$files[] = CFile::MakeFileArray($file);
					}
				}
				else
					$files[] = CFile::MakeFileArray($value);
			}
			$arFields[$key] = $files;
		}
		elseif ($arDocumentFields[$key]["Type"] == "S:DiskFile")
		{
			foreach ($arFields[$key] as &$value)
			{
				if(!empty($value))
				{
					$value = "n".$value;
				}
			}
			$arFields[$key] = array("VALUE" => $arFields[$key], "DESCRIPTION" => "workflow");
		}
		elseif ($arDocumentFields[$key]["Type"] == "N:Sequence")
		{
			$queryObject = CIBlockProperty::getByID($realKey, $arFields["IBLOCK_ID"]);
			if ($property = $queryObject->fetch())
			{
				$propertyId = $property["ID"];
				$sequence = new CIBlockSequence($arFields["IBLOCK_ID"], $propertyId);
				foreach ($arFields[$key] as &$value)
				{
					$value = ["VALUE" => $value];
				}
				$value = ["VALUE" => $sequence->getNext()];
			}
		}
		elseif ($arDocumentFields[$key]["Type"] == "S:HTML")
		{
			foreach ($arFields[$key] as &$value)
				$value = array("VALUE" => $value);
		}

		unset($value);

		if (!$arDocumentFields[$key]["Multiple"] && is_array($arFields[$key]))
		{
			if (count($arFields[$key]) > 0)
			{
				$a = array_values($arFields[$key]);
				$arFields[$key] = $a[0];
			}
			else
			{
				$arFields[$key] = null;
			}
		}

		if (mb_substr($key, 0, mb_strlen("PROPERTY_")) == "PROPERTY_")
		{
			$realKey = mb_substr($key, mb_strlen("PROPERTY_"));
			$arFieldsPropertyValues[$realKey] = (is_array($arFields[$key]) &&
				!CBPHelper::IsAssociativeArray($arFields[$key])) ? $arFields[$key] : array($arFields[$key]);
			unset($arFields[$key]);
		}
	}

	if (count($arFieldsPropertyValues) > 0)
		$arFields["PROPERTY_VALUES"] = $arFieldsPropertyValues;

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

	$iblockElement = new CIBlockElement();
	$id = $iblockElement->Add($arFields, false, true, true);
	if (!$id || $id <= 0)
		throw new Exception($iblockElement->LAST_ERROR);

	return $id;
}