• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblock_rights.php
  • Класс: CIBlockRightsStorage
  • Вызов: CIBlockRightsStorage::Recalculate
function Recalculate()
{
	global $DB;

	$DB->Query("DELETE FROM b_iblock_element_right WHERE IBLOCK_ID = ".$this->IBLOCK_ID);
	$DB->Query("DELETE FROM b_iblock_section_right WHERE IBLOCK_ID = ".$this->IBLOCK_ID);
	//Elements
	$DB->Query("
		INSERT INTO b_iblock_element_right (IBLOCK_ID, SECTION_ID, ELEMENT_ID, RIGHT_ID, IS_INHERITED)
		SELECT BE.IBLOCK_ID, 0, BE.ID, BR.ID, 'N'
		FROM
			b_iblock_right BR
			INNER JOIN b_iblock_element BE ON BE.ID = BR.ENTITY_ID and BE.IBLOCK_ID = BR.IBLOCK_ID
		WHERE
			BR.IBLOCK_ID = ".$this->IBLOCK_ID."
			AND BR.ENTITY_TYPE = 'element'
			AND BE.ID NOT IN (
				SELECT ER0.ELEMENT_ID
				FROM
					b_iblock_right BR0
					INNER JOIN b_iblock_element_right ER0 ON ER0.RIGHT_ID = BR0.ID
				WHERE
					BR0.IBLOCK_ID = ".$this->IBLOCK_ID."
					AND BR0.ENTITY_TYPE = 'element'
			)
	");
	//Sections
	$rs = $DB->Query("
		SELECT BR.ID RIGHT_ID, BS.ID SECTION_ID, BR.GROUP_CODE
		FROM
			b_iblock_right BR
			INNER JOIN b_iblock_section BS ON BS.ID = BR.ENTITY_ID and BS.IBLOCK_ID = BR.IBLOCK_ID
		WHERE
			BR.IBLOCK_ID = ".$this->IBLOCK_ID."
			AND BR.ENTITY_TYPE = 'section'
		ORDER BY
			BS.DEPTH_LEVEL DESC
	");
	while($ar = $rs->Fetch())
	{
		$this->_set_section($ar["SECTION_ID"]);
		$this->AddSelfSet($ar["RIGHT_ID"]);
		$this->AddChildrenSet($ar["RIGHT_ID"], $ar["GROUP_CODE"], /*$bInherited=*/true);
	}
	//IBlock
	$this->_set_section(0);
	$rs = $DB->Query("
		SELECT BR.ID RIGHT_ID, BR.GROUP_CODE
		FROM
			b_iblock_right BR
		WHERE
			BR.IBLOCK_ID = ".$this->IBLOCK_ID."
			AND BR.ENTITY_TYPE = 'iblock'
	");
	while($ar = $rs->Fetch())
	{
		$this->AddChildrenSet($ar["RIGHT_ID"], $ar["GROUP_CODE"], /*$bInherited=*/true);
	}
}