• Модуль: lists
  • Путь к файлу: ~/bitrix/modules/lists/lib/entity/element.php
  • Класс: BitrixListsEntityElement
  • Вызов: Element::startBp
private function startBp(int $elementId, int $execType, $changedElementFields = []): void
{
	$documentType = BizprocDocument::generateDocumentComplexType(
		$this->params["IBLOCK_TYPE_ID"],
		$this->iblockId
	);
	$documentId = BizProcDocument::getDocumentComplexId(
		$this->params["IBLOCK_TYPE_ID"],
		$elementId
	);
	$documentStates = CBPWorkflowTemplateLoader::getDocumentTypeStates(
		$documentType,
		$execType
	);

	if (is_array($documentStates) && !empty($documentStates))
	{
		global $USER;

		$userId = $USER->getID();

		$currentUserGroups = $USER->getUserGroupArray();
		if ($this->params["CREATED_BY"] == $userId)
		{
			$currentUserGroups[] = "author";
		}

		if ($execType === CBPDocumentEventType::Create)
		{
			$canWrite = CBPDocument::canUserOperateDocumentType(
				CBPCanUserOperateOperation::WriteDocument,
				$userId,
				$documentType,
				[
					"AllUserGroups" => $currentUserGroups,
					"DocumentStates" => $documentStates
				]
			);
		}
		else
		{
			$canWrite = CBPDocument::canUserOperateDocument(
				CBPCanUserOperateOperation::WriteDocument,
				$userId,
				$documentId,
				[
					"AllUserGroups" => $currentUserGroups,
					"DocumentStates" => $documentStates
				]
			);
		}

		if (!$canWrite)
		{
			$this->errorCollection->setError(
				new Error("You do not have enough permissions to edit this record in its current bizproc state")
			);

			return;
		}

		$errors = [];

		foreach ($documentStates as $documentState)
		{
			$parameters = CBPDocument::startWorkflowParametersValidate(
				$documentState["TEMPLATE_ID"],
				$documentState["TEMPLATE_PARAMETERS"],
				$documentType,
				$errors
			);

			CBPDocument::startWorkflow(
				$documentState["TEMPLATE_ID"],
				BizProcDocument::getDocumentComplexId($this->params["IBLOCK_TYPE_ID"], $elementId),
				array_merge(
					$parameters,
					[
						CBPDocument::PARAM_TAGRET_USER => "user_" . intval($userId),
						CBPDocument::PARAM_MODIFIED_DOCUMENT_FIELDS => $changedElementFields,
					]
				),
				$errors
			);
		}

		foreach($errors as $message)
		{
			$this->errorCollection->setError(new Error($message));
		}
	}
}