• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/classes/general/task.php
  • Класс: CTasks
  • Вызов: CTasks::makePossibleForwardedFilter
static function makePossibleForwardedFilter($filter)
{
	$result = [];

	$allowedFields = [
		'ID' => true, // number_wo_nulls
		'TITLE' => true, // string
		'STATUS_CHANGED_BY' => true, // number
		'SITE_ID' => true, // string_equal

		'PRIORITY' => true, // number_wo_nulls
		'STAGE_ID' => true, // number_wo_nulls
		'RESPONSIBLE_ID' => true, // number_wo_nulls
		'TIME_ESTIMATE' => true, // number_wo_nulls
		'CREATED_BY' => true, // number_wo_nulls
		'GUID' => true, // string
		'XML_ID' => true, // string_equal
		'MARK' => true, // string_equal
		'ALLOW_CHANGE_DEADLINE' => true, // string_equal
		'ALLOW_TIME_TRACKING' => true, // string_equal
		'ADD_IN_REPORT' => true, // string_equal
		'GROUP_ID' => true, // number
		'PARENT_ID' => true, // number
		'FORUM_TOPIC_ID' => true, // number
		'MATCH_WORK_TIME' => true, // string_equal

		//dates
		/*
		'DATE_START' => true,
		'DEADLINE' => true,
		'START_DATE_PLAN' => true,
		'END_DATE_PLAN' => true,
		'CREATED_DATE' => true,
		'STATUS_CHANGED_DATE' => true,
		 */
	];

	$stringEqual = [
		'SITE_ID' => true, // string_equal
		'XML_ID' => true, // string_equal
		'MARK' => true, // string_equal
		'ALLOW_CHANGE_DEADLINE' => true, // string_equal
		'ALLOW_TIME_TRACKING' => true, // string_equal
		'ADD_IN_REPORT' => true, // string_equal
		'MATCH_WORK_TIME' => true, // string_equal
	];

	if (is_array($filter) && !empty($filter))
	{
		// cannot forward filer with LOGIC OR or LOGIC NOT
		if (array_key_exists('LOGIC', $filter) && $filter['LOGIC'] != 'AND')
		{
			return $result;
		}
		if (array_key_exists('::LOGIC', $filter) && $filter['::LOGIC'] != 'AND')
		{
			return $result;
		}

		$filter = BitrixTasksInternalsDataBaseHelperCommon::parseFilter($filter);
		foreach ($filter as $k => $condition)
		{
			$field = $condition['FIELD'];

			if (!array_key_exists($field, $allowedFields))
			{
				continue;
			}

			// convert like into strict check
			if (array_key_exists($field, $stringEqual))
			{
				// '' => '='
				if ($condition['OPERATION'] == 'E')
				{
					$condition['OPERATION'] = 'I';
					unset($condition['ORIG_KEY']);
				}
				// '!' => '!='
				if ($condition['OPERATION'] == 'N')
				{
					$condition['OPERATION'] = 'NI';
					unset($condition['ORIG_KEY']);
				}
			}

			// actually, allow only "equal" and "not equal"
			$op = $condition['OPERATION'];
			if ($op != 'E' && $op != 'I' && $op != 'N' && $op != 'NI')
			{
				continue;
			}

			$result[] = $condition;
		}

		$result = BitrixTasksInternalsDataBaseHelperCommon::makeFilter($result);
	}

	return $result;
}