• Модуль: rpa
  • Путь к файлу: ~/bitrix/modules/rpa/lib/model/itemsorttable.php
  • Класс: BitrixRpaModelItemSortTable
  • Вызов: ItemSortTable::getSort
static function getSort(int $userId, Type $type, int $stageId, int $previousItemId = null, bool $isResort = true): int
{
	$nextSort = $previousSort = null;
	$previousItem = $type->getItem($previousItemId);
	$typeId = $type->getId();
	if($previousItem)
	{
		$record = static::getList([
			'select' => ['SORT'],
			'filter' => [
				'=ITEM_ID' => $previousItem->getId(),
				'=TYPE_ID' => $typeId,
				'=USER_ID' => $userId,
			],
		])->fetch();
		if($record)
		{
			$previousSort = (int)$record['SORT'];
		}
		else
		{
			static::fillItemsSortInStageBeforeItem($userId, $previousItem);
			$previousSort = static::getMaxSort($userId, $previousItem->getStage());
		}
	}

	$nextItem = static::getList([
		'select' => ['ID', 'SORT'],
		'order' => [
			'SORT' => 'ASC',
		],
		'filter' => [
			'=TYPE_ID' => $typeId,
			'=USER_ID' => $userId,
			'>=SORT' => $previousSort ?: 0,
			'=ITEM.STAGE_ID' => $stageId,
			'!=ITEM_ID' => $previousItemId,
		],
		'runtime' => [
			static::getItemReferenceField($type)
		],
		'limit' => 1,
	])->fetch();
	if($nextItem)
	{
		$nextSort = (int)$nextItem['SORT'];
	}

	if(!$nextSort)
	{
		$sort = $previousSort + static::DEFAULT_MAX_SORT;
	}
	else
	{
		$sort = (int) (floor(($nextSort - $previousSort) / 2) + $previousSort);
	}

	if($sort === 0 || $previousSort === $sort || $nextSort === $sort)
	{
		if($isResort)
		{
			static::resortItems($userId, $type, $stageId);
			$sort = static::getSort($userId, $type, $stageId, $previousItemId, false);
		}
	}

	return $sort;
}