Your IP : 3.23.92.193


Current Path : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/crm.lead.list/
Upload File :
Current File : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/crm.lead.list/component.php

<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();

/**
/**
 * @global \CMain $APPLICATION
 * @global \CUser $USER
 * @global \CDatabase $DB
 * @var \CUserTypeManager $USER_FIELD_MANAGER
 * @var \CBitrixComponent $this
 * @var array $arParams
 * @var array $arResult
 */

global $USER_FIELD_MANAGER, $USER, $APPLICATION, $DB;

$isErrorOccured = false;
$errorMessage = '';

if (!$isErrorOccured && !CModule::IncludeModule('crm'))
{
	$errorMessage = GetMessage('CRM_MODULE_NOT_INSTALLED');
	$isErrorOccured = true;
}

$isBizProcInstalled = IsModuleInstalled('bizproc');
if (!$isErrorOccured && $isBizProcInstalled)
{
	if (!CModule::IncludeModule('bizproc'))
	{
		$errorMessage = GetMessage('BIZPROC_MODULE_NOT_INSTALLED');
		$isErrorOccured = true;
	}
	elseif (!CBPRuntime::isFeatureEnabled())
	{
		$isBizProcInstalled = false;
	}
}

if (!$isErrorOccured && !CAllCrmInvoice::installExternalEntities())
{
	$isErrorOccured = true;
}
if(!$isErrorOccured && !CCrmQuote::LocalComponentCausedUpdater())
{
	$isErrorOccured = true;
}

if (!$isErrorOccured && !CModule::IncludeModule('currency'))
{
	$errorMessage = GetMessage('CRM_MODULE_NOT_INSTALLED_CURRENCY');
	$isErrorOccured = true;
}
if (!$isErrorOccured && !CModule::IncludeModule('catalog'))
{
	$errorMessage = GetMessage('CRM_MODULE_NOT_INSTALLED_CATALOG');
	$isErrorOccured = true;
}
if (!$isErrorOccured && !CModule::IncludeModule('sale'))
{
	$errorMessage = GetMessage('CRM_MODULE_NOT_INSTALLED_SALE');
	$isErrorOccured = true;
}


$userPermissions = CCrmPerms::GetCurrentUserPermissions();
if (!$isErrorOccured && !CCrmLead::CheckReadPermission(0, $userPermissions))
{
	$errorMessage = GetMessage('CRM_PERMISSION_DENIED');
	$isErrorOccured = true;
}

//region Export params
$sExportType = !empty($arParams['EXPORT_TYPE']) ?
	strval($arParams['EXPORT_TYPE']) : (!empty($_REQUEST['type']) ? strval($_REQUEST['type']) : '');
$isInExportMode = false;
$isStExport = false;    // Step-by-step export mode
if (!empty($sExportType))
{
	$sExportType = mb_strtolower(trim($sExportType));
	switch ($sExportType)
	{
		case 'csv':
		case 'excel':
			$isInExportMode = true;
			$isStExport = (isset($arParams['STEXPORT_MODE']) && $arParams['STEXPORT_MODE'] === 'Y');
			break;
		default:
			$sExportType = '';
	}
}

$isStExportAllFields = (isset($arParams['STEXPORT_INITIAL_OPTIONS']['EXPORT_ALL_FIELDS'])
						&& $arParams['STEXPORT_INITIAL_OPTIONS']['EXPORT_ALL_FIELDS'] === 'Y');
$arResult['STEXPORT_EXPORT_ALL_FIELDS'] = ($isStExport && $isStExportAllFields) ? 'Y' : 'N';

$isStExportProductsFields = (isset($arParams['STEXPORT_INITIAL_OPTIONS']['EXPORT_PRODUCT_FIELDS'])
						&& $arParams['STEXPORT_INITIAL_OPTIONS']['EXPORT_PRODUCT_FIELDS'] === 'Y');
$arResult['STEXPORT_EXPORT_PRODUCT_FIELDS'] = ($isStExport && $isStExportProductsFields) ? 'Y' : 'N';

$arResult['STEXPORT_MODE'] = $isStExport ? 'Y' : 'N';
$arResult['STEXPORT_TOTAL_ITEMS'] = isset($arParams['STEXPORT_TOTAL_ITEMS']) ?
	(int)$arParams['STEXPORT_TOTAL_ITEMS'] : 0;
//endregion

if (!$isErrorOccured && $isInExportMode && $userPermissions->HavePerm('LEAD', BX_CRM_PERM_NONE, 'EXPORT'))
{
	$errorMessage = GetMessage('CRM_PERMISSION_DENIED');
	$isErrorOccured = true;
}

if ($isErrorOccured)
{
	if ($isStExport)
	{
		return array('ERROR' => $errorMessage);
	}
	else
	{
		ShowError($errorMessage);
		return;
	}
}

use Bitrix\Main;
use Bitrix\Crm;
use Bitrix\Crm\Tracking;
use Bitrix\Crm\EntityAddress;
use Bitrix\Crm\Format\AddressSeparator;
use Bitrix\Crm\Format\LeadAddressFormatter;
use Bitrix\Crm\Settings\HistorySettings;
use Bitrix\Crm\Context\GridContext;
use Bitrix\Crm\WebForm\Manager as WebFormManager;
use Bitrix\Crm\Settings\LayoutSettings;
use Bitrix\Crm\Conversion\LeadConversionDispatcher;

$CCrmLead = new CCrmLead(false);
$CCrmBizProc = new CCrmBizProc('LEAD');

$userID = CCrmSecurityHelper::GetCurrentUserID();
$isAdmin = CCrmPerms::IsAdmin();

$currentPage = $APPLICATION->GetCurPage();
$arParams['PATH_TO_LEAD_LIST'] = CrmCheckPath('PATH_TO_LEAD_LIST', $arParams['PATH_TO_LEAD_LIST'], $currentPage);
$arParams['PATH_TO_LEAD_DETAILS'] = CrmCheckPath('PATH_TO_LEAD_DETAILS', $arParams['PATH_TO_LEAD_DETAILS'], $APPLICATION->GetCurPage().'?lead_id=#lead_id#&details');
$arParams['PATH_TO_LEAD_SHOW'] = CrmCheckPath('PATH_TO_LEAD_SHOW', $arParams['PATH_TO_LEAD_SHOW'], $currentPage.'?lead_id=#lead_id#&show');
$arParams['PATH_TO_LEAD_EDIT'] = CrmCheckPath('PATH_TO_LEAD_EDIT', $arParams['PATH_TO_LEAD_EDIT'], $currentPage.'?lead_id=#lead_id#&edit');
$arParams['PATH_TO_LEAD_CONVERT'] = CrmCheckPath('PATH_TO_LEAD_CONVERT', $arParams['PATH_TO_LEAD_CONVERT'], $currentPage.'?lead_id=#lead_id#&convert');
$arParams['PATH_TO_LEAD_MERGE'] = CrmCheckPath('PATH_TO_LEAD_MERGE', $arParams['PATH_TO_LEAD_MERGE'], '/lead/merge/');
$arParams['PATH_TO_QUOTE_EDIT'] = CrmCheckPath('PATH_TO_QUOTE_EDIT', $arParams['PATH_TO_QUOTE_EDIT'], $currentPage.'?quote_id=#quote_id#&edit');
$arParams['PATH_TO_LEAD_WIDGET'] = CrmCheckPath('PATH_TO_LEAD_WIDGET', $arParams['PATH_TO_LEAD_WIDGET'], $currentPage);
$arParams['PATH_TO_LEAD_KANBAN'] = CrmCheckPath('PATH_TO_LEAD_KANBAN', $arParams['PATH_TO_LEAD_KANBAN'], $currentPage);
$arParams['PATH_TO_LEAD_CALENDAR'] = CrmCheckPath('PATH_TO_LEAD_CALENDAR', $arParams['PATH_TO_LEAD_CALENDAR'], $currentPage);
$arParams['PATH_TO_USER_PROFILE'] = CrmCheckPath('PATH_TO_USER_PROFILE', $arParams['PATH_TO_USER_PROFILE'], '/company/personal/user/#user_id#/');
$arParams['PATH_TO_USER_BP'] = CrmCheckPath('PATH_TO_USER_BP', $arParams['PATH_TO_USER_BP'], '/company/personal/bizproc/');
$arParams['NAME_TEMPLATE'] = empty($arParams['NAME_TEMPLATE']) ? CSite::GetNameFormat(false) : str_replace(array("#NOBR#","#/NOBR#"), array("",""), $arParams["NAME_TEMPLATE"]);

$arResult['CURRENT_USER_ID'] = CCrmSecurityHelper::GetCurrentUserID();
$arResult['IS_AJAX_CALL'] = isset($_REQUEST['AJAX_CALL']) || isset($_REQUEST['ajax_request']) || !!CAjax::GetSession();
$arResult['SESSION_ID'] = bitrix_sessid();
$arResult['NAVIGATION_CONTEXT_ID'] = isset($arParams['NAVIGATION_CONTEXT_ID']) ? $arParams['NAVIGATION_CONTEXT_ID'] : '';
$arResult['DISABLE_NAVIGATION_BAR'] = isset($arParams['DISABLE_NAVIGATION_BAR']) ? $arParams['DISABLE_NAVIGATION_BAR'] : 'N';
$arResult['PRESERVE_HISTORY'] = isset($arParams['PRESERVE_HISTORY']) ? $arParams['PRESERVE_HISTORY'] : false;
$arResult['ENABLE_SLIDER'] = \Bitrix\Crm\Settings\LayoutSettings::getCurrent()->isSliderEnabled();

if(LayoutSettings::getCurrent()->isSimpleTimeFormatEnabled())
{
	$arResult['TIME_FORMAT'] = array(
		'tommorow' => 'tommorow',
		's' => 'sago',
		'i' => 'iago',
		'H3' => 'Hago',
		'today' => 'today',
		'yesterday' => 'yesterday',
		//'d7' => 'dago',
		'-' => Main\Type\DateTime::convertFormatToPhp(FORMAT_DATE)
	);
}
else
{
	$arResult['TIME_FORMAT'] = preg_replace('/:s$/', '', Main\Type\DateTime::convertFormatToPhp(FORMAT_DATETIME));
}

$addressLabels = EntityAddress::getShortLabels();

//Show error message if required
if($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['error']))
{
	$errorID = mb_strtolower($_GET['error']);
	if(preg_match('/^crm_err_/', $errorID) === 1)
	{
		if(!isset($_SESSION[$errorID]))
		{
			LocalRedirect(CHTTP::urlDeleteParams($arParams['PATH_TO_LEAD_LIST'], array('error')));
		}

		$arErrors = $_SESSION[$errorID];
		if(is_array($arErrors) && !empty($arErrors))
		{
			$errorHtml = '';
			foreach($arErrors as $error)
			{
				if($errorHtml !== '')
				{
					$errorHtml .= '<br />';
				}
				$errorHtml .= htmlspecialcharsbx($error);
			}
			$arResult['ERROR_HTML'] = $errorHtml;
		}
		unset($arErrors, $_SESSION[$errorID]);
	}
}

CUtil::InitJSCore(array('ajax', 'tooltip'));

$arResult['GADGET'] = 'N';
if (isset($arParams['GADGET_ID']) && $arParams['GADGET_ID'] <> '')
{
	$arResult['GADGET'] = 'Y';
	$arResult['GADGET_ID'] = $arParams['GADGET_ID'];
}
$isInGadgetMode = $arResult['GADGET'] === 'Y';

$arFilter = $arSort = array();
$bInternal = false;
$arResult['FORM_ID'] = isset($arParams['FORM_ID']) ? $arParams['FORM_ID'] : '';
$arResult['TAB_ID'] = isset($arParams['TAB_ID']) ? $arParams['TAB_ID'] : '';
if (!empty($arParams['INTERNAL_FILTER']) || $isInGadgetMode)
	$bInternal = true;
$arResult['INTERNAL'] = $bInternal;
if (!empty($arParams['INTERNAL_FILTER']) && is_array($arParams['INTERNAL_FILTER']))
{
	if(empty($arParams['GRID_ID_SUFFIX']))
	{
		$arParams['GRID_ID_SUFFIX'] = $this->GetParent() !== null? mb_strtoupper($this->GetParent()->GetName()) : '';
	}
	$arFilter = $arParams['INTERNAL_FILTER'];
}

if (!empty($arParams['INTERNAL_SORT']) && is_array($arParams['INTERNAL_SORT']))
{
	$arSort = $arParams['INTERNAL_SORT'];
}

$enableWidgetFilter = false;
$widgetFilter = null;
if (isset($arParams['WIDGET_DATA_FILTER']) && isset($arParams['WIDGET_DATA_FILTER']['WG']) && $arParams['WIDGET_DATA_FILTER']['WG'] === 'Y')
{
	$enableWidgetFilter = true;
	$widgetFilter = $arParams['WIDGET_DATA_FILTER'];
}
elseif (!$bInternal && isset($_REQUEST['WG']) && mb_strtoupper($_REQUEST['WG']) === 'Y')
{
	$enableWidgetFilter = true;
	$widgetFilter = $_REQUEST;
}
if($enableWidgetFilter)
{
	$dataSourceFilter = null;

	$dataSourceName = isset($widgetFilter['DS']) ? $widgetFilter['DS'] : '';
	if($dataSourceName !== '')
	{
		$dataSource = null;
		try
		{
			$dataSource = Bitrix\Crm\Widget\Data\DataSourceFactory::create(array('name' => $dataSourceName), $userID, true);
		}
		catch(Bitrix\Main\NotSupportedException $e)
		{
		}

		try
		{
			$dataSourceFilter = $dataSource ? $dataSource->prepareEntityListFilter($widgetFilter) : null;
		}
		catch(Bitrix\Main\ArgumentException $e)
		{
		}
		catch(Bitrix\Main\InvalidOperationException $e)
		{
		}
	}

	if(is_array($dataSourceFilter) && !empty($dataSourceFilter))
	{
		$arFilter = $dataSourceFilter;
	}
	else
	{
		$enableWidgetFilter = false;
	}
}

$enableCounterFilter = false;
if(!$bInternal && isset($_REQUEST['counter']))
{
	$counterTypeID = Bitrix\Crm\Counter\EntityCounterType::resolveID($_REQUEST['counter']);
	$counter = null;
	if(Bitrix\Crm\Counter\EntityCounterType::isDefined($counterTypeID))
	{
		try
		{
			$counter = Bitrix\Crm\Counter\EntityCounterFactory::create(
				CCrmOwnerType::Lead,
				$counterTypeID,
				$userID,
				Bitrix\Crm\Counter\EntityCounter::internalizeExtras($_REQUEST)
			);

			$arFilter = $counter->prepareEntityListFilter(
				array(
					'MASTER_ALIAS' => CCrmLead::TABLE_ALIAS,
					'MASTER_IDENTITY' => 'ID'
				)
			);
			$enableCounterFilter = !empty($arFilter);
		}
		catch(Bitrix\Main\NotSupportedException $e)
		{
		}
		catch(Bitrix\Main\ArgumentException $e)
		{
		}
	}
}


$enableReportFilter = Main\Application::getInstance()->getContext()->getRequest()->getQuery('from_analytics');

if ($enableReportFilter === 'Y')
{
	$boardId = Main\Application::getInstance()->getContext()->getRequest()->getQuery('board_id');
	$externalFilterId = 'report_board_' . $boardId . '_filter';
}

$arResult['IS_EXTERNAL_FILTER'] = ($enableWidgetFilter || $enableCounterFilter);

$CCrmUserType = new CCrmUserType($USER_FIELD_MANAGER, CCrmLead::$sUFEntityID);

$CCrmFieldMulti = new CCrmFieldMulti();
$arResult['GRID_ID'] = 'CRM_LEAD_LIST_V12'.($bInternal && !empty($arParams['GRID_ID_SUFFIX']) ? '_'.$arParams['GRID_ID_SUFFIX'] : '');
$arResult['HONORIFIC'] = CCrmStatus::GetStatusListEx('HONORIFIC');
$arResult['STATUS_LIST'] = CCrmStatus::GetStatusListEx('STATUS');
$arResult['SOURCE_LIST'] = CCrmStatus::GetStatusListEx('SOURCE');
$arResult['WEBFORM_LIST'] = WebFormManager::getListNames();
$arResult['BOOLEAN_VALUES_LIST'] = array(
	'N' => GetMessage('CRM_COLUMN_BOOLEAN_VALUES_N'),
	'Y' => GetMessage('CRM_COLUMN_BOOLEAN_VALUES_Y')
);

// Please, uncomment if required
//$arResult['CURRENCY_LIST'] = CCrmCurrencyHelper::PrepareListItems();
$arResult['FILTER'] = array();
$arResult['FILTER2LOGIC'] = array();
$arResult['FILTER_PRESETS'] = array();
$arResult['PERMS']['ADD']    = !$userPermissions->HavePerm('LEAD', BX_CRM_PERM_NONE, 'ADD');
$arResult['PERMS']['WRITE']  = !$userPermissions->HavePerm('LEAD', BX_CRM_PERM_NONE, 'WRITE');
$arResult['PERMS']['DELETE'] = !$userPermissions->HavePerm('LEAD', BX_CRM_PERM_NONE, 'DELETE');
$arResult['CALL_LIST_UPDATE_MODE'] = isset($_REQUEST['call_list_context']) && isset($_REQUEST['call_list_id']) && IsModuleInstalled('voximplant');
$arResult['CALL_LIST_CONTEXT'] = (string)$_REQUEST['call_list_context'];
$arResult['CALL_LIST_ID'] = (int)$_REQUEST['call_list_id'];
if($arResult['CALL_LIST_UPDATE_MODE'])
{
	AddEventHandler('crm', 'onCrmLeadListItemBuildMenu', array('\Bitrix\Crm\CallList\CallList', 'handleOnCrmLeadListItemBuildMenu'));
}

CCrmLead::PrepareConversionPermissionFlags(0, $arResult, $userPermissions);

$arResult['~STATUS_LIST_WRITE']= CCrmStatus::GetStatusList('STATUS');
$arResult['STATUS_LIST_WRITE'] = array();
unset($arResult['~STATUS_LIST_WRITE']['CONVERTED'], $arResult['~STATUS_LIST_EX']['CONVERTED']);
foreach ($arResult['~STATUS_LIST_WRITE'] as $sStatusId => $sStatusTitle)
{
	if ($userPermissions->GetPermType('LEAD', 'WRITE', array('STATUS_ID'.$sStatusId)) > BX_CRM_PERM_NONE)
		$arResult['STATUS_LIST_WRITE'][$sStatusId] = $sStatusTitle;
}

//region Filter Presets Initialization
if(!$bInternal)
{
	$defaultFilter = array('SOURCE_ID' => array(), 'STATUS_ID' => array(), 'COMMUNICATION_TYPE' => array(), 'DATE_CREATE' => '', 'ASSIGNED_BY_ID' => '');

	$currentUserID = $arResult['CURRENT_USER_ID'];;
	$currentUserName = CCrmViewHelper::GetFormattedUserName($currentUserID, $arParams['NAME_TEMPLATE']);
	$arResult['FILTER_PRESETS'] = array(
		'filter_my_in_work' => array(
			'name' => GetMessage('CRM_PRESET_MY_IN_WORK'),
			'disallow_for_all' => true,
			'fields' => array_merge(
				$defaultFilter,
				array(
					'ASSIGNED_BY_ID_name' => $currentUserName,
					'ASSIGNED_BY_ID' => $currentUserID,
					'STATUS_SEMANTIC_ID' => array(Bitrix\Crm\PhaseSemantics::PROCESS)
				)
			)
		),
		'filter_in_work' => array(
			'name' => GetMessage('CRM_PRESET_ALL_IN_WORK'),
			'default' => true,
			'fields' => array_merge(
				$defaultFilter,
				array('STATUS_SEMANTIC_ID' => array(Bitrix\Crm\PhaseSemantics::PROCESS))
			)
		),
		'filter_closed' => array(
			'name' => GetMessage('CRM_PRESET_ALL_CLOSED'),
			'fields' => array_merge(
				$defaultFilter,
				array('STATUS_SEMANTIC_ID' => array(Bitrix\Crm\PhaseSemantics::SUCCESS))
			)
		)
	);
}
//endregion

if (!empty($externalFilterId))
{
	Main\Loader::includeModule('report');
	$arResult['GRID_ID'] = 'report_' . $boardId . '_grid';
	$filterOptions = new \Bitrix\Main\UI\Filter\Options($arResult['GRID_ID'], []);
}
else
{
	$filterOptions = new \Bitrix\Main\UI\Filter\Options($arResult['GRID_ID'], $arResult['FILTER_PRESETS']);
}

$gridOptions = new \Bitrix\Main\Grid\Options($arResult['GRID_ID'], $arResult['FILTER_PRESETS']);

//region Navigation Params
if ($arParams['LEAD_COUNT'] <= 0)
{
	$arParams['LEAD_COUNT'] = 20;
}
$arNavParams = $gridOptions->GetNavParams(array('nPageSize' => $arParams['LEAD_COUNT']));
$arNavParams['bShowAll'] = false;
if(isset($arNavParams['nPageSize']) && $arNavParams['nPageSize'] > 100)
{
	$arNavParams['nPageSize'] = 100;
}
//endregion

//region Filter initialization
if(!$bInternal)
{
	$arResult['FILTER2LOGIC'] = array('TITLE', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'POST', 'COMMENTS', 'COMPANY_TITLE');
	if ($externalFilterId)
	{
		$entityFilter = Crm\Filter\Factory::createEntityFilter(
			new Crm\Filter\LeadSettings(array('ID' => $arResult['GRID_ID']))
		);

		$fields = $entityFilter->getFields();

		foreach ($fields as $field)
		{
			$arResult['FILTER'][] = $field->toArray();
		}

		$arResult['FILTER_PRESETS'] = [];
	}
	else
	{
		$entityFilter = Crm\Filter\Factory::createEntityFilter(
			new Crm\Filter\LeadSettings(array('ID' => $arResult['GRID_ID']))
		);
	}


	$effectiveFilterFieldIDs = $filterOptions->getUsedFields();
	if(empty($effectiveFilterFieldIDs))
	{
		$effectiveFilterFieldIDs = $entityFilter->getDefaultFieldIDs();
	}

	//region HACK: Preload fields for filter of user activities & webforms
	if(!in_array('ASSIGNED_BY_ID', $effectiveFilterFieldIDs, true))
	{
		$effectiveFilterFieldIDs[] = 'ASSIGNED_BY_ID';
	}

	if(!in_array('ACTIVITY_COUNTER', $effectiveFilterFieldIDs, true))
	{
		$effectiveFilterFieldIDs[] = 'ACTIVITY_COUNTER';
	}

	if(!in_array('WEBFORM_ID', $effectiveFilterFieldIDs, true))
	{
		$effectiveFilterFieldIDs[] = 'WEBFORM_ID';
	}

	Tracking\UI\Filter::appendEffectiveFields($effectiveFilterFieldIDs);

	//endregion

	if (!$externalFilterId)
	{
		foreach($effectiveFilterFieldIDs as $filterFieldID)
		{
			$filterField = $entityFilter->getField($filterFieldID);
			if($filterField)
			{
				$arResult['FILTER'][] = $filterField->toArray();
			}
		}
	}

}
//endregion

if(!$arResult['IS_EXTERNAL_FILTER'])
{
	$arFilter += $filterOptions->getFilter($arResult['FILTER']);
}

// Headers initialization -->
$arResult['HEADERS'] = array(
	array('id' => 'ID', 'name' => GetMessage('CRM_COLUMN_ID'), 'sort' => 'id', 'first_order' => 'desc', 'width' => 60, 'default' => false, 'editable' => false, 'type' => 'int', 'class' => 'minimal'),
	array('id' => 'LEAD_SUMMARY', 'name' => GetMessage('CRM_COLUMN_LEAD'), 'sort' => 'title', 'width' => 200, 'default' => true, 'editable' => true),
	array(
		'id' => 'STATUS_ID',
		'name' => GetMessage('CRM_COLUMN_STATUS'),
		'sort' => 'status_sort',
		'width' => 200,
		'default' => true,
		'prevent_default' => false,
		'type' => 'list',
		'editable' => array('items' => $arResult['STATUS_LIST_WRITE'])
	),
);

// Don't display activities in INTERNAL mode.
if(!$bInternal)
{
	$arResult['HEADERS'][] = array(
		'id' => 'ACTIVITY_ID',
		'name' => GetMessage('CRM_COLUMN_ACTIVITY'),
		'sort' => 'nearest_activity',
		'width' => 150,
		'default' => true,
		'prevent_default' => false
	);
}

$arResult['HEADERS'] = array_merge(
	$arResult['HEADERS'],
	array(
		array('id' => 'LEAD_FORMATTED_NAME', 'name' => GetMessage('CRM_COLUMN_FULL_NAME'), 'sort' => 'last_name', 'default' => true, 'editable' => false),
		array('id' => 'TITLE', 'name' => GetMessage('CRM_COLUMN_TITLE'), 'sort' => 'title', 'default' => false, 'editable' => true),
		array(
			'id' => 'HONORIFIC',
			'name' => GetMessage('CRM_COLUMN_HONORIFIC'),
			'sort' => false,
			'type' => 'list',
			'editable' => array(
				'items' => array('0' => GetMessage('CRM_HONORIFIC_NOT_SELECTED')) + CCrmStatus::GetStatusList('HONORIFIC')
			)
		),
		array('id' => 'NAME', 'name' => GetMessage('CRM_COLUMN_NAME'), 'sort' => 'name', 'default' => false, 'editable' => true, 'class' => 'username'),
		array('id' => 'SECOND_NAME', 'name' => GetMessage('CRM_COLUMN_SECOND_NAME'), 'sort' => 'second_name', 'default' => false, 'editable' => true, 'class' => 'username'),
		array('id' => 'LAST_NAME', 'name' => GetMessage('CRM_COLUMN_LAST_NAME'), 'sort' => 'last_name', 'default' => false, 'editable' => true, 'class' => 'username'),
		array('id' => 'BIRTHDATE', 'name' => GetMessage('CRM_COLUMN_BIRTHDATE'), 'sort' => 'BIRTHDATE', 'first_order' => 'desc', 'default' => false, 'editable' => true, 'type' => 'date'),
		array('id' => 'DATE_CREATE', 'name' => GetMessage('CRM_COLUMN_DATE_CREATE'), 'sort' => 'id', 'first_order' => 'desc', 'default' => true, 'editable' => false, 'class' => 'date'),
		array('id' => 'SOURCE_ID', 'name' => GetMessage('CRM_COLUMN_SOURCE'), 'sort' => 'source_id', 'default' => false, 'editable' => array('items' => CCrmStatus::GetStatusList('SOURCE')), 'type' => 'list')

	)
);

$CCrmFieldMulti->PrepareListHeaders($arResult['HEADERS']);
if($isInExportMode)
{
	$CCrmFieldMulti->ListAddHeaders($arResult['HEADERS']);
}

$arResult['HEADERS'] = array_merge($arResult['HEADERS'], array(
	array('id' => 'ASSIGNED_BY', 'name' => GetMessage('CRM_COLUMN_ASSIGNED_BY'), 'sort' => 'assigned_by', 'default' => true, 'editable' => false, 'class' => 'username'),
	array('id' => 'STATUS_DESCRIPTION', 'name' => GetMessage('CRM_COLUMN_STATUS_DESCRIPTION'), 'sort' => false /**because of MSSQL**/, 'default' => false, 'editable' => false),
	array('id' => 'SOURCE_DESCRIPTION', 'name' => GetMessage('CRM_COLUMN_SOURCE_DESCRIPTION'), 'sort' => false /**because of MSSQL**/, 'default' => false, 'editable' => false),
	array('id' => 'CREATED_BY', 'name' => GetMessage('CRM_COLUMN_CREATED_BY'), 'sort' => 'created_by', 'default' => false, 'editable' => false, 'class' => 'username'),
	array('id' => 'DATE_MODIFY', 'name' => GetMessage('CRM_COLUMN_DATE_MODIFY'), 'sort' => 'date_modify', 'first_order' => 'desc', 'default' => false, 'class' => 'date'),
	array('id' => 'MODIFY_BY', 'name' => GetMessage('CRM_COLUMN_MODIFY_BY'), 'sort' => 'modify_by', 'default' => false, 'editable' => false, 'class' => 'username'),
	array('id' => 'COMPANY_TITLE', 'name' => GetMessage('CRM_COLUMN_COMPANY_TITLE'), 'sort' => 'company_title', 'default' => false, 'editable' => true),
	array('id' => 'POST', 'name' => GetMessage('CRM_COLUMN_POST'), 'sort' => 'post', 'default' => false, 'editable' => true),

	array('id' => 'FULL_ADDRESS', 'name' => EntityAddress::getFullAddressLabel(), 'sort' => false, 'default' => false, 'editable' => false),
	array('id' => 'ADDRESS', 'name' => $addressLabels['ADDRESS'], 'sort' => 'address', 'default' => false, 'editable' => false),
	array('id' => 'ADDRESS_2', 'name' => $addressLabels['ADDRESS_2'], 'sort' => 'address_2', 'default' => false, 'editable' => false),
	array('id' => 'ADDRESS_CITY', 'name' => $addressLabels['CITY'], 'sort' => 'address_city', 'default' => false, 'editable' => false),
	array('id' => 'ADDRESS_REGION', 'name' => $addressLabels['REGION'], 'sort' => 'address_region', 'default' => false, 'editable' => false),
	array('id' => 'ADDRESS_PROVINCE', 'name' => $addressLabels['PROVINCE'], 'sort' => 'address_province', 'default' => false, 'editable' => false),
	array('id' => 'ADDRESS_POSTAL_CODE', 'name' => $addressLabels['POSTAL_CODE'], 'sort' => 'address_postal_code', 'default' => false, 'editable' => false),
	array('id' => 'ADDRESS_COUNTRY', 'name' => $addressLabels['COUNTRY'], 'sort' => 'address_country', 'default' => false, 'editable' => false),

	array('id' => 'COMMENTS', 'name' => GetMessage('CRM_COLUMN_COMMENTS'), 'sort' => false /**because of MSSQL**/, 'default' => false, 'editable' => false),
	array('id' => 'SUM', 'name' => GetMessage('CRM_COLUMN_SUM'), 'sort' => 'opportunity_account', 'default' => false, 'editable' => false, 'align' => 'right'),
	array('id' => 'OPPORTUNITY', 'name' => GetMessage('CRM_COLUMN_OPPORTUNITY_2'), 'sort' => 'opportunity', 'first_order' => 'desc', 'default' => false, 'editable' => true, 'align' => 'right'),
	array('id' => 'CURRENCY_ID', 'name' => GetMessage('CRM_COLUMN_CURRENCY_ID'), 'sort' => 'currency_id', 'default' => false, 'editable' => array('items' => CCrmCurrencyHelper::PrepareListItems()), 'type' => 'list'),
	array('id' => 'PRODUCT_ID', 'name' => GetMessage('CRM_COLUMN_PRODUCT_ID'), 'sort' => false, 'default' => $isInExportMode, 'editable' => false, 'type' => 'list'),
	array('id' => 'WEBFORM_ID', 'name' => GetMessage('CRM_COLUMN_WEBFORM'), 'sort' => 'webform_id', 'default' => false, 'type' => 'list'),
	array('id' => 'IS_RETURN_CUSTOMER', 'name' => GetMessage('CRM_COLUMN_IS_RETURN_CUSTOMER1'), 'sort' => 'is_return_customer', 'default' => false, 'type' => 'list'),
	array('id' => 'LEAD_CLIENT', 'name' => GetMessage('CRM_COLUMN_CLIENT'), 'sort' => 'lead_client', 'default' => false, 'editable' => false)
));

Tracking\UI\Grid::appendColumns($arResult['HEADERS']);

$utmList = \Bitrix\Crm\UtmTable::getCodeNames();
foreach ($utmList as $utmCode => $utmName)
{
	$arResult['HEADERS'][] = array(
		'id' => $utmCode,
		'name' => $utmName,
		'sort' => false, 'default' => $isInExportMode, 'editable' => false
	);
}

$CCrmUserType->ListAddHeaders($arResult['HEADERS']);

$arBPData = array();
if ($isBizProcInstalled)
{
	$arBPData = CBPDocument::GetWorkflowTemplatesForDocumentType(array('crm', 'CCrmDocumentLead', 'LEAD'), false);
	$arDocumentStates = CBPDocument::GetDocumentStates(
		array('crm', 'CCrmDocumentLead', 'LEAD'),
		null
	);
	foreach ($arBPData as $arBP)
	{
		if (!CBPDocument::CanUserOperateDocumentType(
			CBPCanUserOperateOperation::ViewWorkflow,
			$userID,
			array('crm', 'CCrmDocumentLead', 'LEAD'),
			array(
				'UserGroups' => $CCrmBizProc->arCurrentUserGroups,
				'DocumentStates' => $arDocumentStates,
				'WorkflowTemplateId' => $arBP['ID'],
				'UserIsAdmin' => $isAdmin
			)
		))
		{
			continue;
		}
		$arResult['HEADERS'][] = array('id' => 'BIZPROC_'.$arBP['ID'], 'name' => $arBP['NAME'], 'sort' => false, 'default' => false, 'editable' => false);
	}

	if ($arBPData)
	{
		CJSCore::Init('bp_starter');
	}
}

// list all filds for export
$exportAllFieldsList = array();
if ($isInExportMode && $isStExportAllFields)
{
	foreach ($arResult['HEADERS'] as $arHeader)
	{
		$exportAllFieldsList[$arHeader['id']] = true;
	}
}
unset($arHeader);

//endregion Headers initialization

//region Try to extract user action data
// We have to extract them before call of CGridOptions::GetFilter() or the custom filter will be corrupted.
$actionData = array(
	'METHOD' => $_SERVER['REQUEST_METHOD'],
	'ACTIVE' => false
);
if(check_bitrix_sessid())
{
	$postAction = 'action_button_'.$arResult['GRID_ID'];
	$getAction = 'action_'.$arResult['GRID_ID'];
	//We need to check grid 'controls'
	$controls = isset($_POST['controls']) && is_array($_POST['controls']) ? $_POST['controls'] : array();
	if ($actionData['METHOD'] == 'POST' && (isset($controls[$postAction]) || isset($_POST[$postAction])))
	{
		CUtil::JSPostUnescape();

		$actionData['ACTIVE'] = true;

		if(isset($controls[$postAction]))
		{
			$actionData['NAME'] = $controls[$postAction];
		}
		else
		{
			$actionData['NAME'] = $_POST[$postAction];
			unset($_POST[$postAction], $_REQUEST[$postAction]);
		}

		$allRows = 'action_all_rows_'.$arResult['GRID_ID'];
		$actionData['ALL_ROWS'] = false;
		if(isset($controls[$allRows]))
		{
			$actionData['ALL_ROWS'] = $controls[$allRows] == 'Y';
		}
		elseif(isset($_POST[$allRows]))
		{
			$actionData['ALL_ROWS'] = $_POST[$allRows] == 'Y';
			unset($_POST[$allRows], $_REQUEST[$allRows]);
		}

		if(isset($_POST['rows']) && is_array($_POST['rows']))
		{
			$actionData['ID'] = $_POST['rows'];
		}
		elseif(isset($_POST['ID']))
		{
			$actionData['ID'] = $_POST['ID'];
			unset($_POST['ID'], $_REQUEST['ID']);
		}

		if(isset($_POST['FIELDS']))
		{
			$actionData['FIELDS'] = $_POST['FIELDS'];
			unset($_POST['FIELDS'], $_REQUEST['FIELDS']);
		}

		if(isset($_POST['ACTION_STATUS_ID']) || isset($controls['ACTION_STATUS_ID']))
		{
			if(isset($_POST['ACTION_STATUS_ID']))
			{
				$actionData['STATUS_ID'] = trim($_POST['ACTION_STATUS_ID']);
				unset($_POST['ACTION_STATUS_ID'], $_REQUEST['ACTION_STATUS_ID']);
			}
			else
			{
				$actionData['STATUS_ID'] = trim($controls['ACTION_STATUS_ID']);
			}
		}

		if(isset($_POST['ACTION_ASSIGNED_BY_ID']) || isset($controls['ACTION_ASSIGNED_BY_ID']))
		{
			$assignedByID = 0;
			if(isset($_POST['ACTION_ASSIGNED_BY_ID']))
			{
				if(!is_array($_POST['ACTION_ASSIGNED_BY_ID']))
				{
					$assignedByID = intval($_POST['ACTION_ASSIGNED_BY_ID']);
				}
				elseif(count($_POST['ACTION_ASSIGNED_BY_ID']) > 0)
				{
					$assignedByID = intval($_POST['ACTION_ASSIGNED_BY_ID'][0]);
				}
				unset($_POST['ACTION_ASSIGNED_BY_ID'], $_REQUEST['ACTION_ASSIGNED_BY_ID']);
			}
			else
			{
				$assignedByID = (int)$controls['ACTION_ASSIGNED_BY_ID'];
			}

			$actionData['ASSIGNED_BY_ID'] = $assignedByID;
		}

		if(isset($_POST['ACTION_OPENED']) || isset($controls['ACTION_OPENED']))
		{
			if(isset($_POST['ACTION_OPENED']))
			{
				$actionData['OPENED'] = mb_strtoupper($_POST['ACTION_OPENED']) === 'Y' ? 'Y' : 'N';
				unset($_POST['ACTION_OPENED'], $_REQUEST['ACTION_OPENED']);
			}
			else
			{
				$actionData['OPENED'] = mb_strtoupper($controls['ACTION_OPENED']) === 'Y' ? 'Y' : 'N';
			}
		}

		$actionData['AJAX_CALL'] = $arResult['IS_AJAX_CALL'];
	}
	elseif ($actionData['METHOD'] == 'GET' && isset($_GET[$getAction]))
	{
		$actionData['ACTIVE'] = true;

		$actionData['NAME'] = $_GET[$getAction];
		unset($_GET[$getAction], $_REQUEST[$getAction]);

		if(isset($_GET['ID']))
		{
			$actionData['ID'] = $_GET['ID'];
			unset($_GET['ID'], $_REQUEST['ID']);
		}

		$actionData['AJAX_CALL'] = $arResult['IS_AJAX_CALL'];
	}
}
//endregion Try to extract user action data

// HACK: for clear filter by CREATED_BY_ID, MODIFY_BY_ID and ASSIGNED_BY_ID
if($_SERVER['REQUEST_METHOD'] === 'GET')
{
	if(isset($_REQUEST['CREATED_BY_ID_name']) && $_REQUEST['CREATED_BY_ID_name'] === '')
	{
		$_REQUEST['CREATED_BY_ID'] = $_GET['CREATED_BY_ID'] = array();
	}

	if(isset($_REQUEST['MODIFY_BY_ID_name']) && $_REQUEST['MODIFY_BY_ID_name'] === '')
	{
		$_REQUEST['MODIFY_BY_ID'] = $_GET['MODIFY_BY_ID'] = array();
	}

	if(isset($_REQUEST['ASSIGNED_BY_ID_name']) && $_REQUEST['ASSIGNED_BY_ID_name'] === '')
	{
		$_REQUEST['ASSIGNED_BY_ID'] = $_GET['ASSIGNED_BY_ID'] = array();
	}
}

$CCrmUserType->PrepareListFilterValues($arResult['FILTER'], $arFilter, $arResult['GRID_ID']);

$USER_FIELD_MANAGER->AdminListAddFilter(CCrmLead::$sUFEntityID, $arFilter);

//region Apply Search Restrictions
$searchRestriction = \Bitrix\Crm\Restriction\RestrictionManager::getSearchLimitRestriction();
if(!$searchRestriction->isExceeded(CCrmOwnerType::Lead))
{
	Bitrix\Crm\Search\SearchEnvironment::convertEntityFilterValues(CCrmOwnerType::Lead, $arFilter);
}
else
{
	$arResult['LIVE_SEARCH_LIMIT_INFO'] = $searchRestriction->prepareStubInfo(
		array('ENTITY_TYPE_ID' => CCrmOwnerType::Lead)
	);
}
//endregion

//region Activity Counter Filter
if(isset($arFilter['ACTIVITY_COUNTER']))
{
	if(is_array($arFilter['ACTIVITY_COUNTER']))
	{
		$counterTypeID = Bitrix\Crm\Counter\EntityCounterType::joinType(
			array_filter($arFilter['ACTIVITY_COUNTER'], 'is_numeric')
		);
	}
	else
	{
		$counterTypeID = (int)$arFilter['ACTIVITY_COUNTER'];
	}

	$counter = null;
	if($counterTypeID > 0)
	{
		$counterUserIDs = array();
		if(isset($arFilter['ASSIGNED_BY_ID']))
		{
			if(is_array($arFilter['ASSIGNED_BY_ID']))
			{
				$counterUserIDs = array_filter($arFilter['ASSIGNED_BY_ID'], 'is_numeric');
			}
			elseif($arFilter['ASSIGNED_BY_ID'] > 0)
			{
				$counterUserIDs[] = $arFilter['ASSIGNED_BY_ID'];
			}
		}

		try
		{
			$counter = Bitrix\Crm\Counter\EntityCounterFactory::create(
				CCrmOwnerType::Lead,
				$counterTypeID,
				0,
				Bitrix\Crm\Counter\EntityCounter::internalizeExtras($_REQUEST)
			);

			$arFilter += $counter->prepareEntityListFilter(
				array(
					'MASTER_ALIAS' => CCrmLead::TABLE_ALIAS,
					'MASTER_IDENTITY' => 'ID',
					'USER_IDS' => $counterUserIDs
				)
			);
			unset($arFilter['ASSIGNED_BY_ID']);
		}
		catch(Bitrix\Main\NotSupportedException $e)
		{
		}
		catch(Bitrix\Main\ArgumentException $e)
		{
		}
	}
}
//endregion

CCrmEntityHelper::PrepareMultiFieldFilter($arFilter, array(), '=%', false);
$arImmutableFilters = array(
	'FM', 'ID', 'CURRENCY_ID',
	'ASSIGNED_BY_ID', 'CREATED_BY_ID', 'MODIFY_BY_ID',
	'PRODUCT_ROW_PRODUCT_ID',
	'HAS_PHONE', 'HAS_EMAIL',
	'STATUS_SEMANTIC_ID',
	'WEBFORM_ID', 'IS_RETURN_CUSTOMER', 'TRACKING_SOURCE_ID', 'TRACKING_CHANNEL_CODE',
	'SEARCH_CONTENT',
	'PRODUCT_ID', 'STATUS_ID', 'SOURCE_ID', 'COMPANY_ID', 'CONTACT_ID',
	'FILTER_ID', 'FILTER_APPLIED', 'PRESET_ID'
);

foreach ($arFilter as $k => $v)
{
	if(in_array($k, $arImmutableFilters, true))
	{
		continue;
	}

	$arMatch = array();

	if($k === 'ORIGINATOR_ID')
	{
		// HACK: build filter by internal entities
		$arFilter['=ORIGINATOR_ID'] = $v !== '__INTERNAL' ? $v : null;
		unset($arFilter[$k]);
	}
	elseif($k === 'ADDRESS'
		|| $k === 'ADDRESS_2'
		|| $k === 'ADDRESS_CITY'
		|| $k === 'ADDRESS_REGION'
		|| $k === 'ADDRESS_PROVINCE'
		|| $k === 'ADDRESS_POSTAL_CODE'
		|| $k === 'ADDRESS_COUNTRY')
	{
		$arFilter["=%{$k}"] = "{$v}%";
		unset($arFilter[$k]);
	}
	elseif (preg_match('/(.*)_from$/i'.BX_UTF_PCRE_MODIFIER, $k, $arMatch))
	{
		if ($arMatch[1] === 'ACTIVE_TIME_PERIOD')
		{
			continue;
		}

		\Bitrix\Crm\UI\Filter\Range::prepareFrom($arFilter, $arMatch[1], $v);
	}
	elseif (preg_match('/(.*)_to$/i'.BX_UTF_PCRE_MODIFIER, $k, $arMatch))
	{
		if ($arMatch[1] === 'ACTIVE_TIME_PERIOD')
		{
			continue;
		}

		if ($v != '' && ($arMatch[1] == 'DATE_CREATE' || $arMatch[1] == 'DATE_MODIFY') && !preg_match('/\d{1,2}:\d{1,2}(:\d{1,2})?$/'.BX_UTF_PCRE_MODIFIER, $v))
		{
			$v = CCrmDateTimeHelper::SetMaxDayTime($v);
		}
		\Bitrix\Crm\UI\Filter\Range::prepareTo($arFilter, $arMatch[1], $v);
	}
	elseif (in_array($k, $arResult['FILTER2LOGIC']))
	{
		// Bugfix #26956 - skip empty values in logical filter
		$v = trim($v);
		if($v !== '')
		{
			$arFilter['?'.$k] = $v;
		}
		unset($arFilter[$k]);
	}
	elseif($k === 'STATUS_CONVERTED')
	{
		if($v !== '')
		{
			$arFilter[$v === 'N' ? 'STATUS_SEMANTIC_ID' : '!STATUS_SEMANTIC_ID'] = 'P';
		}
		unset($arFilter['STATUS_CONVERTED']);
	}
	elseif($k === 'COMMUNICATION_TYPE')
	{
		if(!is_array($v))
		{
			$v = array($v);
		}
		foreach($v as $commTypeID)
		{
			if($commTypeID === CCrmFieldMulti::PHONE)
			{
				$arFilter['=HAS_PHONE'] = 'Y';
			}
			elseif($commTypeID === CCrmFieldMulti::EMAIL)
			{
				$arFilter['=HAS_EMAIL'] = 'Y';
			}
		}
		unset($arFilter['COMMUNICATION_TYPE']);
	}
	elseif ($k != 'ID' && $k != 'LOGIC' && $k != '__INNER_FILTER' && $k != '__JOINS' && $k != '__CONDITIONS' && mb_strpos($k, 'UF_') !== 0 && preg_match('/^[^\=\%\?\>\<]{1}/', $k) === 1)
	{
		$arFilter['%'.$k] = $v;
		unset($arFilter[$k]);
	}
}

\Bitrix\Crm\UI\Filter\EntityHandler::internalize($arResult['FILTER'], $arFilter);

//region POST & GET actions processing
if($actionData['ACTIVE'])
{
	$arErrors = array();
	$arCurrentUserGroups = $USER->GetUserGroupArray();
	if ($actionData['METHOD'] == 'POST')
	{
		if($actionData['NAME'] == 'delete')
		{
			if ((isset($actionData['ID']) && is_array($actionData['ID'])) || $actionData['ALL_ROWS'])
			{
				$arFilterDel = array();
				if (!$actionData['ALL_ROWS'])
				{
					$arFilterDel = array('ID' => $actionData['ID']);
				}
				else
				{
					// Fix for issue #26628
					$arFilterDel += $arFilter;
				}

				$obRes = CCrmLead::GetListEx(array(), $arFilterDel, false, false, array('ID'));
				while($arLead = $obRes->Fetch())
				{
					$ID = $arLead['ID'];
					$arEntityAttr = $userPermissions->GetEntityAttr('LEAD', array($ID));
					if (!$userPermissions->CheckEnityAccess('LEAD', 'DELETE', $arEntityAttr[$ID]))
					{
						continue ;
					}

					$DB->StartTransaction();

					if ($CCrmBizProc->Delete($ID, $arEntityAttr)
						&& $CCrmLead->Delete($ID, array('CHECK_DEPENDENCIES' => true, 'PROCESS_BIZPROC' => false)))
					{
						$DB->Commit();
					}
					else
					{
						$arErrors[] = $CCrmLead->LAST_ERROR;
						$DB->Rollback();
					}
				}
			}
		}
		if($actionData['NAME'] == 'exclude')
		{
			if ((isset($actionData['ID']) && is_array($actionData['ID'])) || $actionData['ALL_ROWS'])
			{
				$arFilterDel = array();
				if (!$actionData['ALL_ROWS'])
				{
					$arFilterDel = array('ID' => $actionData['ID']);
				}
				else
				{
					// Fix for issue #26628
					$arFilterDel += $arFilter;
				}

				$obRes = CCrmLead::GetListEx(array(), $arFilterDel, false, false, array('ID'));
				while($arLead = $obRes->Fetch())
				{
					$ID = $arLead['ID'];

					if(!\Bitrix\Crm\Exclusion\Access::current()->canWrite())
					{
						continue;
					}

					\Bitrix\Crm\Exclusion\Store::addFromEntity(CCrmOwnerType::Lead, $ID);

					$arEntityAttr = $userPermissions->GetEntityAttr('LEAD', array($ID));
					if(CCrmLead::CheckDeletePermission($ID, $userPermissions, array('ENTITY_ATTRS' => $arEntityAttr)))
					{
						$DB->StartTransaction();

						if ($CCrmBizProc->Delete($ID, $arEntityAttr)
							&& $CCrmLead->Delete($ID, array('CHECK_DEPENDENCIES' => true, 'PROCESS_BIZPROC' => false)))
						{
							$DB->Commit();
						}
						else
						{
							$arErrors[] = $CCrmLead->LAST_ERROR;
							$DB->Rollback();
						}
					}
				}
			}
		}
		elseif($actionData['NAME'] == 'edit')
		{
			if(isset($actionData['FIELDS']) && is_array($actionData['FIELDS']))
			{
				foreach($actionData['FIELDS'] as $ID => $arSrcData)
				{
					$arEntityAttr = $userPermissions->GetEntityAttr('LEAD', array($ID));
					if (!$userPermissions->CheckEnityAccess('LEAD', 'WRITE', $arEntityAttr[$ID]))
					{
						continue ;
					}

					$dbLead = CCrmLead::GetListEx(
						array(),
						array('ID' => $ID, 'CHECK_PERMISSIONS' => 'N'),
						false,
						false,
						array('STATUS_ID'),
						array()
					);
					$arLead = $dbLead ? $dbLead->Fetch() : null;
					if(!is_array($arLead))
					{
						continue;
					}

					$arUpdateData = array();
					reset($arResult['HEADERS']);
					foreach ($arResult['HEADERS'] as $arHead)
					{
						if (isset($arHead['editable']) && (is_array($arHead['editable']) || $arHead['editable'] === true) && isset($arSrcData[$arHead['id']]))
						{
							$key = $arHead['id'];
							$arUpdateData[$key] = $arSrcData[$key];
						}
						if(isset($arUpdateData['LEAD_SUMMARY']))
						{
							if(!isset($arUpdateData['TITLE']))
							{
								$arUpdateData['TITLE'] = $arUpdateData['LEAD_SUMMARY'];
							}
							unset($arUpdateData['LEAD_SUMMARY']);
						}

					}

					// Skip leads in status 'CONVERTED'. 'CONVERTED' is system status and it can not be changed.
					if(isset($arUpdateData['STATUS_ID']) && $arLead['STATUS_ID'] === 'CONVERTED')
					{
						unset($arUpdateData['STATUS_ID']);
					}

					if (!empty($arUpdateData))
					{
						$DB->StartTransaction();

						if($CCrmLead->Update($ID, $arUpdateData))
						{
							$DB->Commit();

							CCrmBizProcHelper::AutoStartWorkflows(
								CCrmOwnerType::Lead,
								$ID,
								CCrmBizProcEventType::Edit,
								$arErrors
							);

							//Region automation
							$starter = new \Bitrix\Crm\Automation\Starter(\CCrmOwnerType::Lead, $ID);
							$starter->setUserIdFromCurrent()->runOnUpdate($arUpdateData, $arLead);
							//end region
						}
						else
						{
							$DB->Rollback();
						}
					}
				}
			}
		}
		elseif ($actionData['NAME'] == 'tasks')
		{
			if (isset($actionData['ID']) && is_array($actionData['ID']))
			{
				$arTaskID = array();
				foreach($actionData['ID'] as $ID)
				{
					$arTaskID[] = 'L_'.$ID;
				}

				$APPLICATION->RestartBuffer();

				$taskUrl = CHTTP::urlAddParams(
					CComponentEngine::MakePathFromTemplate(
						COption::GetOptionString('tasks', 'paths_task_user_edit', ''),
						array(
							'task_id' => 0,
							'user_id' => $userID
						)
					),
					array(
						'UF_CRM_TASK' => implode(';', $arTaskID),
						'TITLE' => urlencode(GetMessage('CRM_TASK_TITLE_PREFIX')),
						'TAGS' => urlencode(GetMessage('CRM_TASK_TAG')),
						'back_url' => urlencode($arParams['PATH_TO_LEAD_LIST'])
					)
				);
				if ($actionData['AJAX_CALL'])
				{
					echo '<script> parent.window.location = "'.CUtil::JSEscape($taskUrl).'";</script>';
					exit();
				}
				else
				{
					LocalRedirect($taskUrl);
				}
			}
		}
		elseif ($actionData['NAME'] == 'set_status')
		{
			if(isset($actionData['STATUS_ID']) && $actionData['STATUS_ID'] != '') // Fix for issue #26628
			{
				$arIDs = array();
				if ($actionData['ALL_ROWS'])
				{
					$arActionFilter = $arFilter;
					$arActionFilter['CHECK_PERMISSIONS'] = 'N'; // Ignore 'WRITE' permission - we will check it before update.

					$dbRes = CCrmLead::GetListEx(
						array(),
						$arActionFilter,
						false,
						false,
						array('ID', 'STATUS_ID')
					);

					while($arLead = $dbRes->Fetch())
					{
						// Skip leads in status 'CONVERTED'. 'CONVERTED' is system status and it can not be changed.
						if(isset($arLead['STATUS_ID']) && $arLead['STATUS_ID'] === 'CONVERTED')
						{
							continue;
						}

						$arIDs[] = $arLead['ID'];
					}
				}
				elseif (isset($actionData['ID']) && is_array($actionData['ID']))
				{
					$dbRes = CCrmLead::GetListEx(
						array(),
						array(
							'@ID'=> $actionData['ID'],
							'CHECK_PERMISSIONS' => 'N'
						),
						false,
						false,
						array('ID', 'STATUS_ID')
					);

					while($arLead = $dbRes->Fetch())
					{
						// Skip leads in status 'CONVERTED'. 'CONVERTED' is system status and it can not be changed.
						if(isset($arLead['STATUS_ID']) && $arLead['STATUS_ID'] === 'CONVERTED')
						{
							continue;
						}

						$arIDs[] = $arLead['ID'];
					}
				}

				$hasErrors = false;
				$arEntityAttr = $userPermissions->GetEntityAttr('LEAD', $arIDs);
				foreach($arIDs as $ID)
				{
					if (!$userPermissions->CheckEnityAccess('LEAD', 'WRITE', $arEntityAttr[$ID]))
					{
						continue;
					}

					$arUpdateData = array('STATUS_ID' => $actionData['STATUS_ID']);

					if($CCrmLead->Update($ID, $arUpdateData))
					{
						$DB->Commit();

						CCrmBizProcHelper::AutoStartWorkflows(
							CCrmOwnerType::Lead,
							$ID,
							CCrmBizProcEventType::Edit,
							$arErrors
						);

						//Region automation
						$starter = new \Bitrix\Crm\Automation\Starter(\CCrmOwnerType::Lead, $ID);
						$starter->setUserIdFromCurrent()->runOnUpdate($arUpdateData, []);
						//end region
					}
					else
					{
						$hasErrors = true;
					}
				}

				if($hasErrors)
				{
					$arResult['MESSAGES'][] = array(
						'TITLE' => GetMessage('CRM_SET_STATUS_NOT_COMPLETED_TITLE'),
						'TEXT' => GetMessage('CRM_SET_STATUS_NOT_COMPLETED_TEXT')
					);
				}
			}
		}
		elseif ($actionData['NAME'] == 'assign_to')
		{
			if(isset($actionData['ASSIGNED_BY_ID']))
			{
				$arIDs = array();
				if ($actionData['ALL_ROWS'])
				{
					$arActionFilter = $arFilter;
					$arActionFilter['CHECK_PERMISSIONS'] = 'N'; // Ignore 'WRITE' permission - we will check it before update.
					$dbRes = CCrmLead::GetListEx(array(), $arActionFilter, false, false, array('ID'));
					while($arLead = $dbRes->Fetch())
					{
						$arIDs[] = $arLead['ID'];
					}
				}
				elseif (isset($actionData['ID']) && is_array($actionData['ID']))
				{
					$arIDs = $actionData['ID'];
				}

				$arEntityAttr = $userPermissions->GetEntityAttr('LEAD', $arIDs);


				foreach($arIDs as $ID)
				{
					if (!$userPermissions->CheckEnityAccess('LEAD', 'WRITE', $arEntityAttr[$ID]))
					{
						continue;
					}

					$DB->StartTransaction();

					$arUpdateData = array(
						'ASSIGNED_BY_ID' => $actionData['ASSIGNED_BY_ID']
					);

					if($CCrmLead->Update($ID, $arUpdateData, true, true, array('DISABLE_USER_FIELD_CHECK' => true)))
					{
						$DB->Commit();

						CCrmBizProcHelper::AutoStartWorkflows(
							CCrmOwnerType::Lead,
							$ID,
							CCrmBizProcEventType::Edit,
							$arErrors
						);
						$starter = new \Bitrix\Crm\Automation\Starter(\CCrmOwnerType::Lead, $ID);
						$starter->setUserIdFromCurrent()->runOnUpdate($arUpdateData, []);
					}
					else
					{
						$DB->Rollback();
					}
				}
			}
		}
		elseif ($actionData['NAME'] == 'mark_as_opened')
		{
			if(isset($actionData['OPENED']) && $actionData['OPENED'] != '')
			{
				$isOpened = mb_strtoupper($actionData['OPENED']) === 'Y' ? 'Y' : 'N';
				$arIDs = array();
				if ($actionData['ALL_ROWS'])
				{
					$arActionFilter = $arFilter;
					$arActionFilter['CHECK_PERMISSIONS'] = 'N'; // Ignore 'WRITE' permission - we will check it before update.

					$dbRes = CCrmLead::GetListEx(
						array(),
						$arActionFilter,
						false,
						false,
						array('ID', 'OPENED')
					);

					while($arLead = $dbRes->Fetch())
					{
						if(isset($arLead['OPENED']) && $arLead['OPENED'] === $isOpened)
						{
							continue;
						}

						$arIDs[] = $arLead['ID'];
					}
				}
				elseif (isset($actionData['ID']) && is_array($actionData['ID']))
				{
					$dbRes = CCrmLead::GetListEx(
						array(),
						array(
							'@ID'=> $actionData['ID'],
							'CHECK_PERMISSIONS' => 'N'
						),
						false,
						false,
						array('ID', 'OPENED')
					);

					while($arLead = $dbRes->Fetch())
					{
						if(isset($arLead['OPENED']) && $arLead['OPENED'] === $isOpened)
						{
							continue;
						}

						$arIDs[] = $arLead['ID'];
					}
				}

				$arEntityAttr = $userPermissions->GetEntityAttr('LEAD', $arIDs);
				foreach($arIDs as $ID)
				{
					if (!$userPermissions->CheckEnityAccess('LEAD', 'WRITE', $arEntityAttr[$ID]))
					{
						continue;
					}

					$DB->StartTransaction();
					$arUpdateData = array('OPENED' => $isOpened);
					if($CCrmLead->Update($ID, $arUpdateData, true, true, array('DISABLE_USER_FIELD_CHECK' => true)))
					{
						$DB->Commit();

						CCrmBizProcHelper::AutoStartWorkflows(
							CCrmOwnerType::Lead,
							$ID,
							CCrmBizProcEventType::Edit,
							$arErrors
						);
						$starter = new \Bitrix\Crm\Automation\Starter(\CCrmOwnerType::Lead, $ID);
						$starter->setUserIdFromCurrent()->runOnUpdate($arUpdateData, []);
					}
					else
					{
						$DB->Rollback();
					}
				}
			}
		}
		elseif($actionData['NAME'] == 'refresh_account')
		{
			$agent = \Bitrix\Crm\Agent\Accounting\LeadAccountSyncAgent::getInstance();
			if ($actionData['ALL_ROWS'])
			{
				$agent->register();
				$agent->enable(true);
			}
			elseif(isset($actionData['ID']) && is_array($actionData['ID']))
			{
				$dbRes = CCrmLead::GetListEx(
					array(),
					array('@ID'=> $actionData['ID'], 'CHECK_PERMISSIONS' => 'N'),
					false,
					false,
					array('ID')
				);

				$arIDs = array();
				while($arLead = $dbRes->Fetch())
				{
					$ID = (int)$arLead['ID'];
					if(CCrmLead::CheckUpdatePermission($ID, $userPermissions))
					{
						$arIDs[] = $ID;
					}
				}

				if(!empty($arIDs))
				{
					$agent->process($arIDs);
				}
			}
		}
		if (!$actionData['AJAX_CALL'])
		{
			$redirectUrl = $arParams['PATH_TO_LEAD_LIST'];
			if(!empty($arErrors))
			{
				$errorID = uniqid('crm_err_');
				$_SESSION[$errorID] = $arErrors;
				$redirectUrl = CHTTP::urlAddParams($redirectUrl, array('error' => $errorID));
			}
			LocalRedirect($redirectUrl);
		}
	}
	else//if ($actionData['METHOD'] == 'GET')
	{
		$arErrors = array();
		if ($actionData['NAME'] == 'delete' && isset($actionData['ID']))
		{
			$ID = intval($actionData['ID']);
			$arEntityAttr = $userPermissions->GetEntityAttr('LEAD', array($ID));
			if(CCrmAuthorizationHelper::CheckDeletePermission(CCrmOwnerType::LeadName, $ID, $userPermissions, $arEntityAttr))
			{
				$DB->StartTransaction();

				if($CCrmBizProc->Delete($ID, $arEntityAttr)
					&& $CCrmLead->Delete($ID, array('CHECK_DEPENDENCIES' => true, 'PROCESS_BIZPROC' => false)))
				{
					$DB->Commit();
				}
				else
				{
					$arErrors[] = $CCrmLead->LAST_ERROR;
					$DB->Rollback();
				}
			}
		}
		if ($actionData['NAME'] == 'exclude' && isset($actionData['ID']))
		{
			$ID = intval($actionData['ID']);
			if(\Bitrix\Crm\Exclusion\Access::current()->canWrite())
			{
				\Bitrix\Crm\Exclusion\Store::addFromEntity(CCrmOwnerType::Lead, $ID);

				if(CCrmLead::CheckDeletePermission($ID, $userPermissions))
				{
					$DB->StartTransaction();
					if($CCrmBizProc->Delete($ID, $arEntityAttr)
						&& $CCrmLead->Delete($ID, array('CHECK_DEPENDENCIES' => true, 'PROCESS_BIZPROC' => false)))
					{
						$DB->Commit();
					}
					else
					{
						$arErrors[] = $CCrmLead->LAST_ERROR;
						$DB->Rollback();
					}
				}
			}
		}

		if (!$actionData['AJAX_CALL'])
		{
			$redirectUrl = $bInternal ? '?'.$arParams['FORM_ID'].'_active_tab=tab_lead' : $arParams['PATH_TO_LEAD_LIST'];
			if(!empty($arErrors))
			{
				$errorID = uniqid('crm_err_');
				$_SESSION[$errorID] = $arErrors;
				$redirectUrl = CHTTP::urlAddParams($redirectUrl, array('error' => $errorID));
			}
			LocalRedirect($redirectUrl);
		}
	}
}
// <-- POST & GET actions processing

$_arSort = $gridOptions->GetSorting(
	array(
		'sort' => array('id' => 'desc'),
		'vars' => array('by' => 'by', 'order' => 'order')
	)
);

$arResult['SORT'] = !empty($arSort) ? $arSort : $_arSort['sort'];
$arResult['SORT_VARS'] = $_arSort['vars'];

$arSelect = $gridOptions->GetVisibleColumns();

// Remove column for deleted UF
if ($CCrmUserType->NormalizeFields($arSelect))
{
	$gridOptions->SetVisibleColumns($arSelect);
}

$arSelectMap = array_fill_keys($arSelect, true);

$arResult['IS_BIZPROC_AVAILABLE'] = $isBizProcInstalled;
$arResult['ENABLE_BIZPROC'] = $isBizProcInstalled
	&& (!isset($arParams['ENABLE_BIZPROC']) || mb_strtoupper($arParams['ENABLE_BIZPROC']) === 'Y');

$arResult['ENABLE_TASK'] = IsModuleInstalled('tasks');

if($arResult['ENABLE_TASK'])
{
	$arResult['TASK_CREATE_URL'] = CHTTP::urlAddParams(
		CComponentEngine::MakePathFromTemplate(
			COption::GetOptionString('tasks', 'paths_task_user_edit', ''),
			array(
				'task_id' => 0,
				'user_id' => $userID
			)
		),
		array(
			'UF_CRM_TASK' => '#ENTITY_KEYS#',
			'TITLE' => urlencode(GetMessage('CRM_TASK_TITLE_PREFIX')),
			'TAGS' => urlencode(GetMessage('CRM_TASK_TAG')),
			'back_url' => urlencode($arParams['PATH_TO_LEAD_LIST'])
		)
	);
}

// Export all fields
if ($isInExportMode && $isStExport && $isStExportAllFields)
{
	$arSelectMap = $exportAllFieldsList;
}

// Fill in default values if empty
if (empty($arSelectMap))
{
	foreach ($arResult['HEADERS'] as $arHeader)
	{
		if ($arHeader['default'])
		{
			$arSelectMap[$arHeader['id']] = true;
		}
	}

	//Disable bizproc fields processing
	$arResult['ENABLE_BIZPROC'] = false;
}
else
{
	if($arResult['ENABLE_BIZPROC'])
	{
		//Check if bizproc fields selected
		$hasBizprocFields = false;
		foreach($arSelectMap as $k => $v)
		{
			if(strncmp($k, 'BIZPROC_', 8) === 0)
			{
				$hasBizprocFields = true;
				break;
			}
		}
		$arResult['ENABLE_BIZPROC'] = $hasBizprocFields;
	}
}

$arSelectedHeaders = array_keys($arSelectMap);

if ($isInGadgetMode)
{
	$arSelectMap['DATE_CREATE'] =
		$arSelectMap['TITLE'] =
		$arSelectMap['STATUS_ID'] =
		$arSelectMap['HONORIFIC'] =
		$arSelectMap['NAME'] =
		$arSelectMap['SECOND_NAME'] =
		$arSelectMap['LAST_NAME'] =
		$arSelectMap['POST'] =
		$arSelectMap['COMPANY_TITLE'] = true;
}
else
{
	if(isset($arSelectMap['LEAD_SUMMARY']))
	{
		$arSelectMap['TITLE'] =
			$arSelectMap['SOURCE_ID'] = true;
	}

	if(isset($arSelectMap['ACTIVITY_ID']))
	{
		$arSelectMap['ACTIVITY_TIME'] =
			$arSelectMap['ACTIVITY_SUBJECT'] =
			$arSelectMap['C_ACTIVITY_ID'] =
			$arSelectMap['C_ACTIVITY_TIME'] =
			$arSelectMap['C_ACTIVITY_SUBJECT'] =
			$arSelectMap['C_ACTIVITY_RESP_ID'] =
			$arSelectMap['C_ACTIVITY_RESP_LOGIN'] =
			$arSelectMap['C_ACTIVITY_RESP_NAME'] =
			$arSelectMap['C_ACTIVITY_RESP_LAST_NAME'] =
			$arSelectMap['C_ACTIVITY_RESP_SECOND_NAME'] = true;
	}

	if(isset($arSelectMap['LEAD_FORMATTED_NAME']))
	{
		$arSelectMap['NAME'] =
			$arSelectMap['HONORIFIC'] =
			$arSelectMap['SECOND_NAME'] =
			$arSelectMap['LAST_NAME'] = true;
	}

	if(isset($arSelectMap['CREATED_BY']))
	{
		$arSelectMap['CREATED_BY_LOGIN'] =
			$arSelectMap['CREATED_BY_NAME'] =
			$arSelectMap['CREATED_BY_LAST_NAME'] =
			$arSelectMap['CREATED_BY_SECOND_NAME'] = true;
	}

	if(isset($arSelectMap['MODIFY_BY']))
	{
		$arSelectMap['MODIFY_BY_LOGIN'] =
			$arSelectMap['MODIFY_BY_NAME'] =
			$arSelectMap['MODIFY_BY_LAST_NAME'] =
			$arSelectMap['MODIFY_BY_SECOND_NAME'] = true;
	}

	// Always need to remove the menu items
	if(!isset($arSelectMap['STATUS_ID']))
	{
		$arSelectMap['STATUS_ID'] = true;
	}

	// for bizproc
	if(!isset($arSelectMap['ASSIGNED_BY']))
	{
		$arSelectMap['ASSIGNED_BY'] = true;
	}

	// For preparing user html
	$arSelectMap['ASSIGNED_BY_LOGIN'] =
		$arSelectMap['ASSIGNED_BY_NAME'] =
		$arSelectMap['ASSIGNED_BY_LAST_NAME'] =
		$arSelectMap['ASSIGNED_BY_SECOND_NAME'] = true;

	if(isset($arSelectMap['SUM']))
	{
		$arSelectMap['OPPORTUNITY'] =
			$arSelectMap['CURRENCY_ID'] = true;
	}

	if(isset($arSelectMap['FULL_ADDRESS']))
	{
		$arSelectMap['ADDRESS'] =
			$arSelectMap['ADDRESS_2'] =
			$arSelectMap['ADDRESS_CITY'] =
			$arSelectMap['ADDRESS_POSTAL_CODE'] =
			$arSelectMap['ADDRESS_POSTAL_CODE'] =
			$arSelectMap['ADDRESS_REGION'] =
			$arSelectMap['ADDRESS_PROVINCE'] =
			$arSelectMap['ADDRESS_COUNTRY'] = true;
	}

	if(isset($arSelectMap['LEAD_CLIENT']))
	{
		$arSelectMap['CONTACT_ID'] =
			$arSelectMap['COMPANY_ID'] =
			$arSelectMap['ASSOCIATED_COMPANY_TITLE'] =
			$arSelectMap['CONTACT_HONORIFIC'] =
			$arSelectMap['CONTACT_NAME'] =
			$arSelectMap['CONTACT_SECOND_NAME'] =
			$arSelectMap['CONTACT_LAST_NAME'] = true;
	}

	// ID must present in select
	if(!isset($arSelectMap['ID']))
	{
		$arSelectMap['ID'] = true;
	}
}

// IS_RETURN_CUSTOMER must present in select
if(!isset($arSelectMap['IS_RETURN_CUSTOMER']))
{
	$arSelectMap['IS_RETURN_CUSTOMER'] = true;
}

if ($isInExportMode)
{
	$productHeaderIndex = array_search('PRODUCT_ID', $arSelectedHeaders, true);
	//$productRowsEnabled = \Bitrix\Crm\Settings\LeadSettings::getCurrent()->isProductRowExportEnabled();

	if($productHeaderIndex <= 0 && $isStExportProductsFields)
	{
		$arSelectedHeaders[] = 'PRODUCT_ID';
	}
	elseif($productHeaderIndex > 0 && !$isStExportProductsFields)
	{
		unset($arSelectedHeaders[$productHeaderIndex]);
		$arSelectedHeaders = array_values($arSelectedHeaders);
	}

	CCrmComponentHelper::PrepareExportFieldsList(
		$arSelectedHeaders,
		array(
			'LEAD_SUMMARY' => array(
				'TITLE',
				'SOURCE_ID'
			),
			'LEAD_FORMATTED_NAME' => array(
				'HONORIFIC',
				'NAME',
				'SECOND_NAME',
				'LAST_NAME'
			),
			'SUM' => array(
				'OPPORTUNITY',
				'CURRENCY_ID'
			),
			'ACTIVITY_ID' => array()
		)
	);

	if(!in_array('ID', $arSelectedHeaders))
	{
		$arSelectedHeaders[] = 'ID';
	}

	$arResult['SELECTED_HEADERS'] = $arSelectedHeaders;
}

$nTopCount = false;
if ($isInGadgetMode)
{
	$nTopCount = $arParams['LEAD_COUNT'];
}

if($nTopCount > 0)
{
	$arNavParams['nTopCount'] = $nTopCount;
}

if ($isInExportMode)
{
	$arFilter['PERMISSION'] = 'EXPORT';
}

if (!empty($arParams['ADDITIONAL_FILTER']) && is_array($arParams['ADDITIONAL_FILTER']))
{
	$arFilter = array_merge($arFilter, $arParams['ADDITIONAL_FILTER']);
}

// HACK: Make custom sort for ASSIGNED_BY field
$arSort = $arResult['SORT'];
if(isset($arSort['assigned_by']))
{
	$assignedBySort = $arSort['assigned_by'];
	if(\Bitrix\Crm\Settings\LayoutSettings::getCurrent()->isUserNameSortingEnabled())
	{
		$arSort['assigned_by_last_name'] = $assignedBySort;
		$arSort['assigned_by_name'] = $assignedBySort;
	}
	else
	{
		$arSort['assigned_by_id'] = $assignedBySort;
	}
	unset($arSort['assigned_by']);
}

$arOptions = $arExportOptions = array('FIELD_OPTIONS' => array('ADDITIONAL_FIELDS' => array()));
if(isset($arSelectMap['ACTIVITY_ID']))
{
	$arOptions['FIELD_OPTIONS']['ADDITIONAL_FIELDS'][] = 'ACTIVITY';
	$arExportOptions['FIELD_OPTIONS']['ADDITIONAL_FIELDS'][] = 'ACTIVITY';
}

if(isset($arSort['status_sort']))
{
	$arOptions['FIELD_OPTIONS']['ADDITIONAL_FIELDS'][] = 'STATUS_SORT';
	$arExportOptions['FIELD_OPTIONS']['ADDITIONAL_FIELDS'][] = 'STATUS_SORT';
}

if(isset($arSort['lead_client']))
{
	$arSort['contact_last_name'] =
	$arSort['contact_name'] =
	$arSort['associated_company_title'] = $arSort['lead_client'];
	unset($arSort['lead_client']);
}

if($arSort['date_create'])
{
	$arSort['id'] = $arSort['date_create'];
	unset($arSort['date_create']);
}

if(!empty($arSort) && !isset($arSort['id']))
{
	$arSort['id'] = reset($arSort);
}

$arSelect = array_unique(array_keys($arSelectMap), SORT_STRING);

// For calendar view
if (isset($arParams['CALENDAR_MODE_LIST']) && !in_array('DATE_CREATE', $arSelect))
{
	$arSelect[] = 'DATE_CREATE';
}

$arResult['LEAD'] = array();
$arResult['LEAD_ID'] = array();
$arResult['LEAD_UF'] = array();

//region Navigation data initialization
$pageNum = 0;
if ($isInExportMode && $isStExport)
{
	$pageSize = !empty($arParams['STEXPORT_PAGE_SIZE']) ? $arParams['STEXPORT_PAGE_SIZE'] : $arParams['LEAD_COUNT'];
}
else
{
	$pageSize = !$isInExportMode
		? (int)(isset($arNavParams['nPageSize']) ? $arNavParams['nPageSize'] : $arParams['LEAD_COUNT']) : 0;
}
// For calendar mode we should clear nav params, to be able to show entries on the grid
if (isset($arParams['CALENDAR_MODE_LIST']))
{
	$pageSize = $arParams['LEAD_COUNT'];
}
$enableNextPage = false;
if(isset($_REQUEST['apply_filter']) && $_REQUEST['apply_filter'] === 'Y')
{
	$pageNum = 1;
}
elseif($pageSize > 0 && (isset($arParams['PAGE_NUMBER']) || isset($_REQUEST['page'])))
{
	$pageNum = (int)(isset($arParams['PAGE_NUMBER']) ? $arParams['PAGE_NUMBER'] : $_REQUEST['page']);
	if($pageNum < 0)
	{
		//Backward mode
		$offset = -($pageNum + 1);
		$total = CCrmLead::GetListEx(array(), $arFilter, array());
		$pageNum = (int)(ceil($total / $pageSize)) - $offset;
		if($pageNum <= 0)
		{
			$pageNum = 1;
		}
	}
}

if (!($isInExportMode && $isStExport))
{
	if($pageNum > 0)
	{
		if(!isset($_SESSION['CRM_PAGINATION_DATA']))
		{
			$_SESSION['CRM_PAGINATION_DATA'] = array();
		}
		$_SESSION['CRM_PAGINATION_DATA'][$arResult['GRID_ID']] = array('PAGE_NUM' => $pageNum, 'PAGE_SIZE' => $pageSize);
	}
	else
	{
		if(!$bInternal
			&& !(isset($_REQUEST['clear_nav']) && $_REQUEST['clear_nav'] === 'Y')
			&& isset($_SESSION['CRM_PAGINATION_DATA'])
			&& isset($_SESSION['CRM_PAGINATION_DATA'][$arResult['GRID_ID']])
		)
		{
			$paginationData = $_SESSION['CRM_PAGINATION_DATA'][$arResult['GRID_ID']];
			if(isset($paginationData['PAGE_NUM'])
				&& isset($paginationData['PAGE_SIZE'])
				&& $paginationData['PAGE_SIZE'] == $pageSize
			)
			{
				$pageNum = (int)$paginationData['PAGE_NUM'];
			}
		}

		if($pageNum <= 0)
		{
			$pageNum = 1;
		}
	}
}
//endregion

if ($isInExportMode && $isStExport && $pageNum === 1)
{
	$total = \CCrmLead::GetListEx(array(), $arFilter, array());
	if (is_numeric($total))
	{
		$arResult['STEXPORT_TOTAL_ITEMS'] = (int)$total;
	}
}

$limit = $pageSize + 1;
if ($isInExportMode && $isStExport)
{
	$total = (int)$arResult['STEXPORT_TOTAL_ITEMS'];
	$processed = ($pageNum - 1) * $pageSize;
	if ($total - $processed <= $pageSize)
	{
		$limit = $total - $processed;
	}
	unset($total, $processed);
}

if(isset($arSort['nearest_activity']))
{
	$navListOptions = ($isInExportMode && !$isStExport)
		? array()
		: array_merge(
			$arOptions,
			array('QUERY_OPTIONS' => array('LIMIT' => $limit, 'OFFSET' => $pageSize * ($pageNum - 1)))
		);

	$navDbResult = CCrmActivity::GetEntityList(
		CCrmOwnerType::Lead,
		$userID,
		$arSort['nearest_activity'],
		$arFilter,
		false,
		$navListOptions
	);

	$qty = 0;
	while($arLead = $navDbResult->Fetch())
	{
		if($pageSize > 0 && ++$qty > $pageSize)
		{
			$enableNextPage = true;
			break;
		}

		$arResult['LEAD'][$arLead['ID']] = $arLead;
		$arResult['LEAD_ID'][$arLead['ID']] = $arLead['ID'];
		$arResult['LEAD_UF'][$arLead['ID']] = array();
	}

	//region Navigation data storing
	$arResult['PAGINATION'] = array('PAGE_NUM' => $pageNum, 'ENABLE_NEXT_PAGE' => $enableNextPage);

	$arResult['DB_FILTER'] = $arFilter;
	$arResult['DB_FILTER_HASH'] = GridContext::prepareFilterHash($arFilter);
	GridContext::setFilter($arResult['GRID_ID'], $arResult['DB_FILTER']);
	GridContext::setFilterHash($arResult['GRID_ID'], $arResult['DB_FILTER_HASH']);
	//endregion

	$entityIDs = array_keys($arResult['LEAD']);
	if(!empty($entityIDs))
	{
		if ($isInExportMode && $isStExport)
		{
			if (!is_array($arSort))
			{
				$arSort = array();
			}

			if (!isset($arSort['ID']))
			{
				$order = mb_strtoupper($arSort['nearest_activity']);
				if ($order === 'ASC' || $order === 'DESC')
				{
					$arSort['ID'] = $arSort['nearest_activity'];
				}
				else
				{
					$arSort['ID'] = 'asc';
				}
				unset($order);
			}
		}
		//Permissions are already checked.
		$dbResult = CCrmLead::GetListEx(
			$arSort,
			array('@ID' => $entityIDs, 'CHECK_PERMISSIONS' => 'N'),
			false,
			false,
			$arSelect,
			$arOptions
		);
		while($arLead = $dbResult->GetNext())
		{
			$arResult['LEAD'][$arLead['ID']] = $arLead;
		}
	}
}
else
{
	$addressSort = array();
	foreach($arSort as $k => $v)
	{
		if(strncmp($k, 'address', 7) === 0)
		{
			$addressSort[mb_strtoupper($k)] = $v;
		}
	}

	if(!empty($addressSort))
	{
		$navListOptions = ($isInExportMode && !$isStExport)
			? array()
			: array_merge(
				$arOptions,
				array('QUERY_OPTIONS' => array('LIMIT' => $limit, 'OFFSET' => $pageSize * ($pageNum - 1)))
			);

		$navDbResult = \Bitrix\Crm\LeadAddress::getEntityList(
			\Bitrix\Crm\EntityAddress::Primary,
			$addressSort,
			$arFilter,
			false,
			$navListOptions
		);

		$qty = 0;
		while($arLead = $navDbResult->Fetch())
		{
			if($pageSize > 0 && ++$qty > $pageSize)
			{
				$enableNextPage = true;
				break;
			}

			$arResult['LEAD'][$arLead['ID']] = $arLead;
			$arResult['LEAD_ID'][$arLead['ID']] = $arLead['ID'];
			$arResult['LEAD_UF'][$arLead['ID']] = array();
		}

		//region Navigation data storing
		$arResult['PAGINATION'] = array('PAGE_NUM' => $pageNum, 'ENABLE_NEXT_PAGE' => $enableNextPage);
		$arResult['DB_FILTER'] = $arFilter;
		$arResult['DB_FILTER_HASH'] = GridContext::prepareFilterHash($arFilter);
		GridContext::setFilter($arResult['GRID_ID'], $arResult['DB_FILTER']);
		GridContext::setFilterHash($arResult['GRID_ID'], $arResult['DB_FILTER_HASH']);
		//endregion

		$entityIDs = array_keys($arResult['LEAD']);
		if(!empty($entityIDs))
		{
			$arSort['ID'] = array_shift(array_slice($addressSort, 0, 1));
			//Permissions are already checked.
			$dbResult = CCrmLead::GetListEx(
				$arSort,
				array('@ID' => $entityIDs, 'CHECK_PERMISSIONS' => 'N'),
				false,
				false,
				$arSelect,
				$arOptions
			);
			while($arLead = $dbResult->GetNext())
			{
				$arResult['LEAD'][$arLead['ID']] = $arLead;
			}
		}
	}
	else
	{
		if ($isInGadgetMode && isset($arNavParams['nTopCount']))
		{
			$navListOptions = array_merge($arOptions, array('QUERY_OPTIONS' => array('LIMIT' => $arNavParams['nTopCount'])));
		}
		else
		{
			$navListOptions = ($isInExportMode && !$isStExport)
				? array()
				: array_merge(
					$arOptions,
					array('QUERY_OPTIONS' => array('LIMIT' => $limit, 'OFFSET' => $pageSize * ($pageNum - 1)))
				);
		}

		if ($isInExportMode && $isStExport)
		{
			if (!is_array($arSort))
			{
				$arSort = array();
			}

			if (!isset($arSort['ID']))
			{
				if (!empty($arSort))
				{
					$arSort['ID'] = array_shift(array_slice($arSort, 0, 1));
				}
				else
				{
					$arSort['ID'] = 'asc';
				}
			}
		}

		$dbResult = CCrmLead::GetListEx(
			$arSort,
			$arFilter,
			false,
			false,
			$arSelect,
			$navListOptions
		);

		$qty = 0;
		while($arLead = $dbResult->GetNext())
		{
			if($pageSize > 0 && ++$qty > $pageSize)
			{
				$enableNextPage = true;
				break;
			}

			$arResult['LEAD'][$arLead['ID']] = $arLead;
			$arResult['LEAD_ID'][$arLead['ID']] = $arLead['ID'];
			$arResult['LEAD_UF'][$arLead['ID']] = array();
		}

		//region Navigation data storing
		$arResult['PAGINATION'] = array('PAGE_NUM' => $pageNum, 'ENABLE_NEXT_PAGE' => $enableNextPage);

		$arResult['DB_FILTER'] = $arFilter;
		$arResult['DB_FILTER_HASH'] = GridContext::prepareFilterHash($arFilter);
		GridContext::setFilter($arResult['GRID_ID'], $arResult['DB_FILTER']);
		GridContext::setFilterHash($arResult['GRID_ID'], $arResult['DB_FILTER_HASH']);
		//endregion
	}
}

$arResult['STEXPORT_IS_FIRST_PAGE'] = $pageNum === 1 ? 'Y' : 'N';
$arResult['STEXPORT_IS_LAST_PAGE'] = $enableNextPage ? 'N' : 'Y';

$arResult['PAGINATION']['URL'] = $APPLICATION->GetCurPageParam('', array('apply_filter', 'clear_filter', 'save', 'page', 'sessid', 'internal'));
$enableExportEvent = $isInExportMode && HistorySettings::getCurrent()->isExportEventEnabled();

$addressFormatOptions = $sExportType === 'csv'
	? array('SEPARATOR' => AddressSeparator::Comma)
	: array('SEPARATOR' => AddressSeparator::HtmlLineBreak, 'NL2BR' => true);

$now = time() + CTimeZone::GetOffset();
$activitylessItems = array();
$entityAttrs = CCrmLead::GetPermissionAttributes(array_keys($arResult['LEAD']));

// check adding to exclusion list
$arResult['CAN_EXCLUDE'] = \Bitrix\Crm\Exclusion\Access::current()->canWrite();
$excludeApplicableList = array_keys($arResult['LEAD']);
if ($arResult['CAN_EXCLUDE'])
{
	\Bitrix\Crm\Exclusion\Applicability::filterEntities(\CCrmOwnerType::Lead, $excludeApplicableList);
	$arResult['CAN_EXCLUDE'] = !empty($excludeApplicableList);
}

$allDocumentStates = [];
if ($arResult['ENABLE_BIZPROC'] && !empty($arResult['LEAD']))
{
	$entityIds = array_map(function ($item)
		{
			return "LEAD_{$item['ID']}";
		},
		$arResult['LEAD']);

	$documentStates = CBPDocument::GetDocumentStates(
		array('crm', 'CCrmDocumentLead', 'LEAD'),
		array('crm', 'CCrmDocumentLead', $entityIds)
	);
	foreach ($documentStates as $stateId => $documentState)
	{
		$allDocumentStates[$documentState['DOCUMENT_ID'][2]][$stateId] = $documentState;
	}
}

foreach($arResult['LEAD'] as &$arLead)
{
	$entityID = $arLead['ID'];
	if($enableExportEvent)
	{
		CCrmEvent::RegisterExportEvent(CCrmOwnerType::Lead, $entityID, $userID);
	}

	$arLead['CONVERSION_TYPE_ID'] = LeadConversionDispatcher::resolveTypeID($arLead);
	$arLead['CAN_EXCLUDE'] = in_array($arLead['ID'], $excludeApplicableList);

	if (!empty($arLead['WEB']) && mb_strpos($arLead['WEB'], '://') === false)
		$arLead['WEB'] = 'http://'.$arLead['WEB'];

	$currencyID =  isset($arLead['CURRENCY_ID']) ? $arLead['CURRENCY_ID'] : CCrmCurrency::GetBaseCurrencyID();
	$arLead['FORMATTED_OPPORTUNITY'] = CCrmCurrency::MoneyToString($arLead['~OPPORTUNITY'], $currencyID);

	$statusID = isset($arLead['STATUS_ID']) ? $arLead['STATUS_ID'] : '';
	$arLead['LEAD_STATUS_NAME'] = isset($arResult['STATUS_LIST'][$statusID]) ? $arResult['STATUS_LIST'][$statusID] : $statusID;

	$sourceID = isset($arLead['SOURCE_ID']) ? $arLead['SOURCE_ID'] : '';
	$arLead['LEAD_SOURCE_NAME'] = isset($arResult['SOURCE_LIST'][$sourceID]) ? $arResult['SOURCE_LIST'][$sourceID] : $sourceID;

	$arLead['DELETE'] = $arLead['EDIT'] = !$arResult['INTERNAL'];

	if($arResult['INTERNAL'])
	{
		$arLead['DELETE'] = $arLead['EDIT'] = false;
	}
	else
	{
		$arLead['EDIT'] = CCrmLead::CheckUpdatePermission(
			$entityID,
			$userPermissions,
			array('ENTITY_ATTRS' => $entityAttrs)
		);

		$arLead['DELETE'] = CCrmLead::CheckDeletePermission(
			$entityID,
			$userPermissions,
			array('ENTITY_ATTRS' => $entityAttrs)
		);
	}

	$arLead['PATH_TO_LEAD_DETAILS'] = CComponentEngine::MakePathFromTemplate(
		$arParams['PATH_TO_LEAD_DETAILS'],
		array('lead_id' => $entityID)
	);

	if($arResult['ENABLE_SLIDER'])
	{
		$arLead['PATH_TO_LEAD_SHOW'] = $arLead['PATH_TO_LEAD_DETAILS'];
		$arLead['PATH_TO_LEAD_EDIT'] = CCrmUrlUtil::AddUrlParams(
			$arLead['PATH_TO_LEAD_DETAILS'],
			array('init_mode' => 'edit')
		);
	}
	else
	{
		$arLead['PATH_TO_LEAD_SHOW'] = CComponentEngine::MakePathFromTemplate(
			$arParams['PATH_TO_LEAD_SHOW'],
			array('lead_id' => $entityID)
		);

		$arLead['PATH_TO_LEAD_EDIT'] = CComponentEngine::MakePathFromTemplate(
			$arParams['PATH_TO_LEAD_EDIT'],
			array('lead_id' => $entityID)
		);
	}

	$arLead['PATH_TO_LEAD_COPY'] =  CHTTP::urlAddParams(
		$arLead['PATH_TO_LEAD_EDIT'],
		array('copy' => 1)
	);

	$arLead['PATH_TO_LEAD_CONVERT'] = CComponentEngine::MakePathFromTemplate(
		$arParams['PATH_TO_LEAD_CONVERT'],
		array('lead_id' => $entityID)
	);

	if($arLead['DELETE'])
	{
		$arLead['PATH_TO_LEAD_DELETE'] =  CHTTP::urlAddParams(
			$bInternal ? $currentPage : $arParams['PATH_TO_LEAD_LIST'],
			array(
				'action_'.$arResult['GRID_ID'] => 'delete',
				'ID' => $entityID,
				'sessid' => $arResult['SESSION_ID']
			)
		);
	}

	if($arResult['CAN_EXCLUDE'])
	{
		$arLead['PATH_TO_LEAD_EXCLUDE'] =  CHTTP::urlAddParams(
			$bInternal ? $currentPage : $arParams['PATH_TO_LEAD_LIST'],
			array(
				'action_'.$arResult['GRID_ID'] => 'exclude',
				'ID' => $entityID,
				'sessid' => $arResult['SESSION_ID']
			)
		);
	}

	$arLead['PATH_TO_USER_PROFILE'] = CComponentEngine::MakePathFromTemplate(
		$arParams['PATH_TO_USER_PROFILE'],
		array('user_id' => $arLead['ASSIGNED_BY'])
	);

	$arLead['PATH_TO_USER_BP'] = CComponentEngine::MakePathFromTemplate(
		$arParams['PATH_TO_USER_BP'],
		array('user_id' => $userID)
	);

	$arLead['PATH_TO_USER_CREATOR'] = CComponentEngine::MakePathFromTemplate(
		$arParams['PATH_TO_USER_PROFILE'],
		array('user_id' => $arLead['CREATED_BY'])
	);

	$arLead['PATH_TO_USER_MODIFIER'] = CComponentEngine::MakePathFromTemplate(
		$arParams['PATH_TO_USER_PROFILE'],
		array('user_id' => $arLead['MODIFY_BY'])
	);

	$arLead['~CREATED_BY_FORMATTED_NAME'] = CUser::FormatName(
		$arParams['NAME_TEMPLATE'],
		array(
			'LOGIN' => $arLead['~CREATED_BY_LOGIN'],
			'NAME' => $arLead['~CREATED_BY_NAME'],
			'SECOND_NAME' => $arLead['~CREATED_BY_SECOND_NAME'],
			'LAST_NAME' => $arLead['~CREATED_BY_LAST_NAME']
		),
		true, false
	);
	$arLead['CREATED_BY_FORMATTED_NAME'] = htmlspecialcharsbx($arLead['~CREATED_BY_FORMATTED_NAME']);

	$arLead['~MODIFY_BY_FORMATTED_NAME'] = CUser::FormatName(
		$arParams['NAME_TEMPLATE'],
		array(
			'LOGIN' => $arLead['~MODIFY_BY_LOGIN'],
			'NAME' => $arLead['~MODIFY_BY_NAME'],
			'SECOND_NAME' => $arLead['~MODIFY_BY_SECOND_NAME'],
			'LAST_NAME' => $arLead['~MODIFY_BY_LAST_NAME']
		),
		true, false
	);
	$arLead['MODIFY_BY_FORMATTED_NAME'] = htmlspecialcharsbx($arLead['~MODIFY_BY_FORMATTED_NAME']);

	$sourceID = isset($arLead['~SOURCE_ID']) ? $arLead['~SOURCE_ID'] : '';
	$arLead['LEAD_SOURCE_NAME'] = $sourceID !== '' ? (isset($arResult['SOURCE_LIST'][$sourceID]) ? $arResult['SOURCE_LIST'][$sourceID] : $sourceID) : '';
	$arLead['~LEAD_SOURCE_NAME'] = htmlspecialcharsback($arLead['~LEAD_SOURCE_NAME']);

	$arLead['~LEAD_FORMATTED_NAME'] = CCrmLead::PrepareFormattedName(
		array(
			'HONORIFIC' => isset($arLead['~HONORIFIC']) ? $arLead['~HONORIFIC'] : '',
			'NAME' => isset($arLead['~NAME']) ? $arLead['~NAME'] : '',
			'SECOND_NAME' => isset($arLead['~SECOND_NAME']) ? $arLead['~SECOND_NAME'] : '',
			'LAST_NAME' => isset($arLead['~LAST_NAME']) ? $arLead['~LAST_NAME'] : ''
		)
	);

	$arLead['LEAD_FORMATTED_NAME'] = htmlspecialcharsbx($arLead['~LEAD_FORMATTED_NAME']);

	//region Client info
	$contactID = isset($arLead['~CONTACT_ID']) ? intval($arLead['~CONTACT_ID']) : 0;
	if($contactID > 0)
	{
		$arLead['~CONTACT_FORMATTED_NAME'] = $contactID <= 0 ? ''
			: CCrmContact::PrepareFormattedName(
				array(
					'HONORIFIC' => isset($arLead['~CONTACT_HONORIFIC']) ? $arLead['~CONTACT_HONORIFIC'] : '',
					'NAME' => isset($arLead['~CONTACT_NAME']) ? $arLead['~CONTACT_NAME'] : '',
					'LAST_NAME' => isset($arLead['~CONTACT_LAST_NAME']) ? $arLead['~CONTACT_LAST_NAME'] : '',
					'SECOND_NAME' => isset($arLead['~CONTACT_SECOND_NAME']) ? $arLead['~CONTACT_SECOND_NAME'] : ''
				)
			);
		$arLead['CONTACT_FORMATTED_NAME'] = htmlspecialcharsbx($arLead['~CONTACT_FORMATTED_NAME']);

		$arLead['CONTACT_INFO'] = array(
			'ENTITY_TYPE_ID' => CCrmOwnerType::Contact,
			'ENTITY_ID' => $contactID
		);

		if(!CCrmContact::CheckReadPermission($contactID, $userPermissions))
		{
			$arLead['CONTACT_INFO']['IS_HIDDEN'] = true;
		}
		else
		{
			$arLead['CONTACT_INFO'] =
				array_merge(
					$arLead['CONTACT_INFO'],
					array(
						'TITLE' => isset($arLead['~CONTACT_FORMATTED_NAME']) ? $arLead['~CONTACT_FORMATTED_NAME'] : ('['.$contactID.']'),
						'PREFIX' => "LEAD_{$arLead['~ID']}",
						'DESCRIPTION' => isset($arLead['~ASSOCIATED_COMPANY_TITLE']) ? $arLead['~ASSOCIATED_COMPANY_TITLE'] : ''
					)
				);
		}
	}
	$companyID = isset($arLead['~COMPANY_ID']) ? intval($arLead['~COMPANY_ID']) : 0;
	if($companyID > 0)
	{
		$arLead['COMPANY_INFO'] = array(
			'ENTITY_TYPE_ID' => CCrmOwnerType::Company,
			'ENTITY_ID' => $companyID
		);

		if(!CCrmCompany::CheckReadPermission($companyID, $userPermissions))
		{
			$arLead['COMPANY_INFO']['IS_HIDDEN'] = true;
		}
		else
		{
			$arLead['COMPANY_INFO'] =
				array_merge(
					$arLead['COMPANY_INFO'],
					array(
						'TITLE' => isset($arLead['~ASSOCIATED_COMPANY_TITLE']) ? $arLead['~ASSOCIATED_COMPANY_TITLE'] : ('['.$companyID.']'),
						'PREFIX' => "LEAD_{$arLead['~ID']}"
					)
				);
		}
	}

	if(isset($arLead['CONTACT_INFO']))
	{
		$arLead['CLIENT_INFO'] = $arLead['CONTACT_INFO'];
	}
	elseif(isset($arLead['COMPANY_INFO']))
	{
		$arLead['CLIENT_INFO'] = $arLead['COMPANY_INFO'];
	}
	//endregion

	$arLead['LEAD_LEGEND'] = isset($arLead['IS_RETURN_CUSTOMER']) && $arLead['IS_RETURN_CUSTOMER'] === 'Y'
		? GetMessage('CRM_COLUMN_IS_RETURN_CUSTOMER1') : '';

	if(isset($arLead['~ACTIVITY_TIME']))
	{
		$time = MakeTimeStamp($arLead['ACTIVITY_TIME']);
		$arLead['~ACTIVITY_EXPIRED'] = $time <= $now;
		$arLead['~ACTIVITY_IS_CURRENT_DAY'] = $arLead['~ACTIVITY_EXPIRED'] || CCrmActivity::IsCurrentDay($time);
	}

	if ($arResult['ENABLE_TASK'])
	{
		$arLead['PATH_TO_TASK_EDIT'] = CHTTP::urlAddParams(
			CComponentEngine::MakePathFromTemplate(
				COption::GetOptionString('tasks', 'paths_task_user_edit', ''),
				array(
					'task_id' => 0,
					'user_id' => $userID
				)
			),
			array(
				'UF_CRM_TASK' => "L_{$entityID}",
				'TITLE' => urlencode(GetMessage('CRM_TASK_TITLE_PREFIX').' '),
				'TAGS' => urlencode(GetMessage('CRM_TASK_TAG')),
				'back_url' => urlencode($arParams['PATH_TO_LEAD_LIST'])
			)
		);
	}

	if (IsModuleInstalled('sale'))
	{
		$arLead['PATH_TO_QUOTE_ADD'] =
			CHTTP::urlAddParams(
				CComponentEngine::makePathFromTemplate(
					$arParams['PATH_TO_QUOTE_EDIT'],
					array('quote_id' => 0)
				),
				array('lead_id' => $entityID)
			);
	}

	if ($arResult['ENABLE_BIZPROC'])
	{
		$arLead['BIZPROC_STATUS'] = '';
		$arLead['BIZPROC_STATUS_HINT'] = '';

		$arDocumentStates = is_array($allDocumentStates["LEAD_{$entityID}"]) ?
			$allDocumentStates["LEAD_{$entityID}"] : [];

		$arLead['PATH_TO_BIZPROC_LIST'] =  CHTTP::urlAddParams(
			CComponentEngine::MakePathFromTemplate(
				$arParams['PATH_TO_LEAD_SHOW'],
				array('lead_id' => $entityID)
			),
			array('CRM_LEAD_SHOW_V12_active_tab' => 'tab_bizproc')
		);

		$totalTaskQty = 0;
		$docStatesQty = count($arDocumentStates);
		if($docStatesQty === 1)
		{
			$arDocState = $arDocumentStates[array_shift(array_keys($arDocumentStates))];

			$docTemplateID = $arDocState['TEMPLATE_ID'];
			$paramName = "BIZPROC_{$docTemplateID}";
			$docTtl = isset($arDocState['STATE_TITLE']) ? $arDocState['STATE_TITLE'] : '';
			$docName = isset($arDocState['STATE_NAME']) ? $arDocState['STATE_NAME'] : '';
			$docTemplateName = isset($arDocState['TEMPLATE_NAME']) ? $arDocState['TEMPLATE_NAME'] : '';

			if($isInExportMode)
			{
				$arLead[$paramName] = $docTtl;
			}
			else
			{
				$arLead[$paramName] = '<a href="'.htmlspecialcharsbx($arLead['PATH_TO_BIZPROC_LIST']).'">'.htmlspecialcharsbx($docTtl).'</a>';
			}
		}
		elseif($docStatesQty > 1)
		{
			foreach ($arDocumentStates as &$arDocState)
			{
				$docTemplateID = $arDocState['TEMPLATE_ID'];
				$paramName = "BIZPROC_{$docTemplateID}";
				$docTtl = isset($arDocState['STATE_TITLE']) ? $arDocState['STATE_TITLE'] : '';

				if($isInExportMode)
				{
					$arLead[$paramName] = $docTtl;
				}
				else
				{
					$arLead[$paramName] = '<a href="'.htmlspecialcharsbx($arLead['PATH_TO_BIZPROC_LIST']).'">'.htmlspecialcharsbx($docTtl).'</a>';
				}
			}
			unset($arDocState);
		}
	}

	$arLead['ASSIGNED_BY_ID'] = $arLead['~ASSIGNED_BY_ID'] = isset($arLead['~ASSIGNED_BY']) ? (int)$arLead['~ASSIGNED_BY'] : 0;
	$arLead['~ASSIGNED_BY'] = CUser::FormatName(
		$arParams['NAME_TEMPLATE'],
		array(
			'LOGIN' => isset($arLead['~ASSIGNED_BY_LOGIN']) ? $arLead['~ASSIGNED_BY_LOGIN'] : '',
			'NAME' => isset($arLead['~ASSIGNED_BY_NAME']) ? $arLead['~ASSIGNED_BY_NAME'] : '',
			'LAST_NAME' => isset($arLead['~ASSIGNED_BY_LAST_NAME']) ? $arLead['~ASSIGNED_BY_LAST_NAME'] : '',
			'SECOND_NAME' => isset($arLead['~ASSIGNED_BY_SECOND_NAME']) ? $arLead['~ASSIGNED_BY_SECOND_NAME'] : ''
		),
		true, false
	);
	$arLead['ASSIGNED_BY'] = htmlspecialcharsbx($arLead['~ASSIGNED_BY']);
	if(isset($arLead['~TITLE']))
	{
		$arLead['LEAD_SUMMARY'] = $arLead['~TITLE'];
	}

	if(isset($arSelectMap['FULL_ADDRESS']))
	{
		$arLead['FULL_ADDRESS'] = LeadAddressFormatter::format($arLead, $addressFormatOptions);
	}

	$userActivityID = isset($arLead['~ACTIVITY_ID']) ? intval($arLead['~ACTIVITY_ID']) : 0;
	$commonActivityID = isset($arLead['~C_ACTIVITY_ID']) ? intval($arLead['~C_ACTIVITY_ID']) : 0;
	if($userActivityID <= 0 && $commonActivityID <= 0)
	{
		$activitylessItems[] = $entityID;
	}
}
unset($arLead);

if(!empty($activitylessItems))
{
	$waitingInfos = \Bitrix\Crm\Pseudoactivity\WaitEntry::getRecentInfos(CCrmOwnerType::Lead, $activitylessItems);
	foreach($waitingInfos as $waitingInfo)
	{
		$entityID = (int)$waitingInfo['OWNER_ID'];
		if(isset($arResult['LEAD'][$entityID]))
		{
			$arResult['LEAD'][$entityID]['~WAITING_TITLE'] = $waitingInfo['TITLE'];
		}
	}
}

$CCrmUserType->ListAddEnumFieldsValue(
	$arResult,
	$arResult['LEAD'],
	$arResult['LEAD_UF'],
	($sExportType !== '' ? ', ' : '<br />'),
	$sExportType !== '',
	array(
		'FILE_URL_TEMPLATE' =>
			'/bitrix/components/bitrix/crm.lead.show/show_file.php?ownerId=#owner_id#&fieldName=#field_name#&fileId=#file_id#'
	)
);

if (isset($arResult['LEAD_ID']) && !empty($arResult['LEAD_ID']))
{
	// try to load product rows
	$arProductRows = CCrmLead::LoadProductRows(array_keys($arResult['LEAD_ID']));
	foreach($arProductRows as $arProductRow)
	{
		$ownerID = $arProductRow['OWNER_ID'];
		if(!isset($arResult['LEAD'][$ownerID]))
		{
			continue;
		}

		$arEntity = &$arResult['LEAD'][$ownerID];
		if(!isset($arEntity['PRODUCT_ROWS']))
		{
			$arEntity['PRODUCT_ROWS'] = array();
		}
		$arEntity['PRODUCT_ROWS'][] = $arProductRow;
	}

	// adding crm multi field to result array
	$arFmList = array();
	$res = CCrmFieldMulti::GetList(array('ID' => 'asc'), array('ENTITY_ID' => 'LEAD', 'ELEMENT_ID' => $arResult['LEAD_ID']));
	while($ar = $res->Fetch())
	{
		if (!$isInExportMode)
			$arFmList[$ar['ELEMENT_ID']][$ar['COMPLEX_ID']][] = CCrmFieldMulti::GetTemplateByComplex($ar['COMPLEX_ID'], $ar['VALUE']);
		else
			$arFmList[$ar['ELEMENT_ID']][$ar['COMPLEX_ID']][] = $ar['VALUE'];
		$arResult['LEAD'][$ar['ELEMENT_ID']]['~'.$ar['COMPLEX_ID']][] = $ar['VALUE'];
	}

	foreach ($arFmList as $elementId => $arFM)
	{
		foreach ($arFM as $complexId => $arComplexName)
		{
			$arResult['LEAD'][$elementId][$complexId] = implode(', ', $arComplexName);
		}
	}

	// checking access for operation
	$arLeadAttr = CCrmPerms::GetEntityAttr('LEAD', $arResult['LEAD_ID']);
	foreach ($arResult['LEAD_ID'] as $iLeadId)
	{
		if ($arResult['LEAD'][$iLeadId]['EDIT'])
			$arResult['LEAD'][$iLeadId]['EDIT'] = $userPermissions->CheckEnityAccess('LEAD', 'WRITE', $arLeadAttr[$iLeadId]);
		if ($arResult['LEAD'][$iLeadId]['DELETE'])
			$arResult['LEAD'][$iLeadId]['DELETE'] = $userPermissions->CheckEnityAccess('LEAD', 'DELETE', $arLeadAttr[$iLeadId]);

		$arResult['LEAD'][$iLeadId]['BIZPROC_LIST'] = array();

		if ($isBizProcInstalled)
		{
			foreach ($arBPData as $arBP)
			{
				if (!CBPDocument::CanUserOperateDocument(
					CBPCanUserOperateOperation::StartWorkflow,
					$userID,
					array('crm', 'CCrmDocumentLead', 'LEAD_'.$arResult['LEAD'][$iLeadId]['ID']),
					array(
						'UserGroups' => $CCrmBizProc->arCurrentUserGroups,
						'DocumentStates' => $arDocumentStates,
						'WorkflowTemplateId' => $arBP['ID'],
						'CreatedBy' => $arResult['LEAD'][$iLeadId]['~ASSIGNED_BY_ID'],
						'UserIsAdmin' => $isAdmin,
						'CRMEntityAttr' => $arLeadAttr
					)
				))
				{
					continue;
				}

				$arBP['PATH_TO_BIZPROC_START'] = CHTTP::urlAddParams(CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_LEAD_SHOW'],
					array(
						'lead_id' => $arResult['LEAD'][$iLeadId]['ID']
					)),
					array(
						'workflow_template_id' => $arBP['ID'], 'bizproc_start' => 1,  'sessid' => $arResult['SESSION_ID'],
						'CRM_LEAD_SHOW_V12_active_tab' => 'tab_bizproc', 'back_url' => $arParams['PATH_TO_LEAD_LIST'])
				);

				if (isset($arBP['HAS_PARAMETERS']))
				{
					$params = \Bitrix\Main\Web\Json::encode(array(
						'moduleId' => 'crm',
						'entity' => 'CCrmDocumentLead',
						'documentType' => 'LEAD',
						'documentId' => 'LEAD_'.$arResult['LEAD'][$iLeadId]['ID'],
						'templateId' => $arBP['ID'],
						'templateName' => $arBP['NAME'],
						'hasParameters' => $arBP['HAS_PARAMETERS']
					));
					$arBP['ONCLICK'] = 'BX.Bizproc.Starter.singleStart('.$params
						.', function(){BX.Main.gridManager.reload(\''.CUtil::JSEscape($arResult['GRID_ID']).'\');});';
				}

				$arResult['LEAD'][$iLeadId]['BIZPROC_LIST'][] = $arBP;
			}
		}
	}
}

if (!$isInExportMode)
{
	$arResult['ANALYTIC_TRACKER'] = array(
		'lead_enabled' => \Bitrix\Crm\Settings\LeadSettings::getCurrent()->isEnabled() ? 'Y' : 'N'
	);

	$arResult['CONVERSION'] = array();
	if($arResult['CAN_CONVERT'])
	{
		foreach(LeadConversionDispatcher::getAllConfigurations() as $conversionTypeID => $conversionConfig)
		{
			/** @var Bitrix\Crm\Conversion\LeadConversionConfig  $conversionConfig */
			$schemeID = $conversionConfig->getCurrentSchemeID();

			$arResult['CONVERSION']['SCHEMES'][$conversionTypeID] = array(
				'ORIGIN_URL' => $currentPage,
				'SCHEME_ID' => $schemeID,
				'SCHEME_NAME' => \Bitrix\Crm\Conversion\LeadConversionScheme::resolveName($schemeID),
				'SCHEME_DESCRIPTION' => \Bitrix\Crm\Conversion\LeadConversionScheme::getDescription($schemeID),
				'SCHEME_CAPTION' => GetMessage('CRM_LEAD_CREATE_ON_BASIS')
			);
		}
		$arResult['CONVERSION']['CONFIGS'] = LeadConversionDispatcher::getJavaScriptConfigurations();
	}

	$arResult['NEED_FOR_REBUILD_DUP_INDEX'] =
		$arResult['NEED_FOR_REBUILD_SEARCH_CONTENT'] =
		$arResult['NEED_FOR_REBUILD_LEAD_ATTRS'] =
		$arResult['NEED_FOR_REFRESH_ACCOUNTING'] =
		$arResult['NEED_FOR_BUILD_TIMELINE'] = false;

	if(!$bInternal)
	{
		if(COption::GetOptionString('crm', '~CRM_REBUILD_LEAD_SEARCH_CONTENT', 'N') === 'Y')
		{
			$arResult['NEED_FOR_REBUILD_SEARCH_CONTENT'] = true;
		}

		if(\Bitrix\Crm\Agent\Semantics\LeadSemanticsRebuildAgent::getInstance()->isEnabled())
		{
			$arResult['NEED_FOR_REBUILD_LEAD_SEMANTICS'] = true;
		}

		$arResult['NEED_FOR_BUILD_TIMELINE'] = \Bitrix\Crm\Agent\Timeline\LeadTimelineBuildAgent::getInstance()->isEnabled();
		$arResult['NEED_FOR_REBUILD_TIMELINE_SEARCH_CONTENT'] = \Bitrix\Crm\Agent\Search\TimelineSearchContentRebuildAgent::getInstance()->isEnabled();
		$arResult['NEED_FOR_REFRESH_ACCOUNTING'] = \Bitrix\Crm\Agent\Accounting\LeadAccountSyncAgent::getInstance()->isEnabled();

		if(CCrmPerms::IsAdmin())
		{
			if(COption::GetOptionString('crm', '~CRM_REBUILD_LEAD_DUP_INDEX', 'N') === 'Y')
			{
				$arResult['NEED_FOR_REBUILD_DUP_INDEX'] = true;
			}
			if(COption::GetOptionString('crm', '~CRM_REBUILD_LEAD_ATTR', 'N') === 'Y')
			{
				$arResult['PATH_TO_PRM_LIST'] = CComponentEngine::MakePathFromTemplate(COption::GetOptionString('crm', 'path_to_perm_list'));
				$arResult['NEED_FOR_REBUILD_LEAD_ATTRS'] = true;
			}
		}
	}

	$this->IncludeComponentTemplate();
	include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/components/bitrix/crm.lead/include/nav.php');
	return $arResult['ROWS_COUNT'];
}
else
{
	if ($isStExport)
	{
		$this->__templateName = '.default';

		$this->IncludeComponentTemplate($sExportType);

		return array(
			'PROCESSED_ITEMS' => count($arResult['LEAD']),
			'TOTAL_ITEMS' => $arResult['STEXPORT_TOTAL_ITEMS']
		);
	}
	else
	{
		$APPLICATION->RestartBuffer();
		// hack. any '.default' customized template should contain 'excel' page
		$this->__templateName = '.default';

		if ($sExportType === 'carddav')
		{
			Header('Content-Type: text/vcard');
		}
		elseif ($sExportType === 'csv')
		{
			Header('Content-Type: text/csv');
			Header('Content-Disposition: attachment;filename=leads.csv');
		}
		elseif ($sExportType === 'excel')
		{
			Header('Content-Type: application/vnd.ms-excel');
			Header('Content-Disposition: attachment;filename=leads.xls');
		}
		Header('Content-Type: application/octet-stream');
		Header('Content-Transfer-Encoding: binary');

		// add UTF-8 BOM marker
		if (defined('BX_UTF') && BX_UTF)
			echo chr(239).chr(187).chr(191);

		$this->IncludeComponentTemplate($sExportType);

		die();
	}
}
?>