• Модуль: lists
  • Путь к файлу: ~/bitrix/modules/lists/lib/bizprocdocument.php
  • Класс: BizprocDocument
  • Вызов: BizprocDocument::updateDocumentField
static function updateDocumentField($documentType, $fields)
{
	if(!isset($fields['settings'])) // check field on the activity
		return false;

	if(!empty($fields["active_type"]))
		$fields["type"] = $fields["active_type"];

	$iblockId = intval(mb_substr($documentType, mb_strlen("iblock_")));
	if ($iblockId <= 0)
		throw new CBPArgumentOutOfRangeException("documentType", $documentType);

	$fieldId = false;
	if (mb_substr($fields["code"], 0, mb_strlen("PROPERTY_")) == "PROPERTY_")
	{
		$fields["code"] = mb_substr($fields["code"], mb_strlen("PROPERTY_"));
		$propertyObject = CIBlockProperty::getList(
			array(),
			array("IBLOCK_ID" => $iblockId, "CODE" => $fields["code"])
		);
		if($property = $propertyObject->fetch())
		{
			$fieldId = "PROPERTY_".$property["ID"];
		}
	}
	else
	{
		if(empty($fields["code"]))
		{
			return false;
		}

		$fieldId = $fields["code"];
	}

	if($fieldId)
	{
		$fieldData = array(
			"NAME" => $fields["name"],
			"ACTIVE" => "Y",
			"SORT" => $fields["sort"] ? $fields["sort"] : 900,
			"CODE" => $fields["code"],
			'MULTIPLE' => $fields['multiple'] == 'Y' || (string)$fields['multiple'] === '1' ? 'Y' : 'N',
			'IS_REQUIRED' => $fields['required'] == 'Y' || (string)$fields['required'] === '1' ? 'Y' : 'N',
			"IBLOCK_ID" => $iblockId,
			"FILTRABLE" => "Y",
			"SETTINGS" => $fields["settings"] ? $fields["settings"] :
				array("SHOW_ADD_FORM" => 'Y', "SHOW_EDIT_FORM"=>'Y'),
			"DEFAULT_VALUE" => $fields['DefaultValue']
		);

		if (array_key_exists("additional_type_info", $fields))
			$fieldData["LINK_IBLOCK_ID"] = intval($fields["additional_type_info"]);

		if(!empty($fields["UserTypeSettings"]))
			$fieldData["USER_TYPE_SETTINGS"] = $fields["UserTypeSettings"];

		if(mb_strstr($fields["type"], ":") !== false)
		{
			list($fieldData["TYPE"], $fieldData["USER_TYPE"]) = explode(":", $fields["type"], 2);
			if($fields["type"] == "E:EList")
			{
				$fieldData["LINK_IBLOCK_ID"] = $fields["options"] ?? null;
			}
			elseif($fields["type"] == "E:ECrm")
			{
				$fieldData["TYPE"] = "S:ECrm";
			}
		}
		elseif ($fields["type"] == "user")
		{
			$fieldData["TYPE"] = "S:employee";
			$fieldData["USER_TYPE"]= "UserID";
		}
		elseif ($fields["type"] == "date")
		{
			$fieldData["TYPE"] = "S:Date";
			$fieldData["USER_TYPE"]= "Date";
		}
		elseif ($fields["type"] == "datetime")
		{
			$fieldData["TYPE"] = "S:DateTime";
			$fieldData["USER_TYPE"]= "DateTime";
		}
		elseif ($fields["type"] == "file")
		{
			$fieldData["TYPE"] = "F";
			$fieldData["USER_TYPE"]= "";
		}
		elseif ($fields["type"] == "select")
		{
			$fieldData["TYPE"] = "L";
			$fieldData["USER_TYPE"]= false;

			if (is_array($fields["options"]))
			{
				$i = 10;
				foreach ($fields["options"] as $k => $v)
				{
					$def = "N";
					if($fields['DefaultValue'] == $v)
						$def = "Y";
					$fieldData["VALUES"][] = array("XML_ID" => $k, "VALUE" => $v, "DEF" => $def, "SORT" => $i);
					$i = $i + 10;
				}
			}
			elseif (is_string($fields["options"]) && ($fields["options"] <> ''))
			{
				$a = explode("n", $fields["options"]);
				$i = 10;
				foreach ($a as $v)
				{
					$v = trim(trim($v), "rn");
					if (!$v)
						continue;
					$v1 = $v2 = $v;
					if (mb_substr($v, 0, 1) == "[" && mb_strpos($v, "]") !== false)
					{
						$v1 = mb_substr($v, 1, mb_strpos($v, "]") - 1);
						$v2 = trim(mb_substr($v, mb_strpos($v, "]") + 1));
					}
					$def = "N";
					if($fields['DefaultValue'] == $v2)
						$def = "Y";
					$fieldData["VALUES"][] = array("XML_ID" => $v1, "VALUE" => $v2, "DEF" => $def, "SORT" => $i);
					$i = $i + 10;
				}
			}
		}
		elseif($fields["type"] == "string")
		{
			$fieldData["TYPE"] = "S";

			if($fields["row_count"] && $fields["col_count"])
			{
				$fieldData["ROW_COUNT"] = $fields["row_count"];
				$fieldData["COL_COUNT"] = $fields["col_count"];
			}
			else
			{
				$fieldData["ROW_COUNT"] = 1;
				$fieldData["COL_COUNT"] = 30;
			}
		}
		elseif($fields["type"] == "text")
		{
			$fieldData["TYPE"] = "S";
			if($fields["row_count"] && $fields["col_count"])
			{
				$fieldData["ROW_COUNT"] = $fields["row_count"];
				$fieldData["COL_COUNT"] = $fields["col_count"];
			}
			else
			{
				$fieldData["ROW_COUNT"] = 4;
				$fieldData["COL_COUNT"] = 30;
			}
		}
		elseif($fields["type"] == "int" || $fields["type"] == "double")
		{
			$fieldData["TYPE"] = "N";
		}
		elseif($fields["type"] == "bool")
		{
			$fieldData["TYPE"] = "L";
			$fieldData["VALUES"][] = array(
				"XML_ID" => 'Y',
				"VALUE" => GetMessage("BPVDX_YES"),
				"DEF" => "N",
				"SORT" => 10
			);
			$fieldData["VALUES"][] = array(
				"XML_ID" => 'N',
				"VALUE" => GetMessage("BPVDX_NO"),
				"DEF" => "N",
				"SORT" => 20
			);
		}
		else
		{
			$fieldData["TYPE"] = $fields["type"];
			$fieldData["USER_TYPE"] = false;
		}

		$list = new CList($iblockId);
		$oldFields = $list->getFields();
		if(array_key_exists($fieldId, $oldFields))
		{
			if($oldFields[$fieldId]["TYPE"] != $fieldData["TYPE"])
				$fieldData["TYPE"] = $oldFields[$fieldId]["TYPE"];
			$fieldId = $list->updateField($fieldId, $fieldData);
		}
		else
		{
			$fieldId = $list->addField($fieldData);
		}

		if($fieldId)
		{
			global $CACHE_MANAGER;
			$CACHE_MANAGER->clearByTag("lists_list_".$iblockId);
			return $fieldId;
		}
	}

	return false;
}