8 'SUM',
'COUNT_DISTINCT',
'AVG',
'MAX',
'MIN'
15 'GREATER_OR_EQUAL' =>
'>=',
18 'LESS_OR_EQUAL' =>
'<=',
22 'NOT_CONTAINS' =>
'!%',
24 'NOT_BETWEEN' =>
'!><'
43 'CREATED_DATE' => date(
$DB->DateFormatToPHP(CSite::GetDateFormat(
"FULL")), time()+CTimeZone::GetOffset()),
44 'CREATED_BY' =>
$USER->GetID()
56 foreach (
GetModuleEvents(
"report",
"OnBeforeReportAdd",
true) as $arEvent)
95 'MARK_DEFAULT' =>
false
99 foreach (
GetModuleEvents(
"report",
"OnBeforeReportUpdate",
true) as $arEvent)
108 $strUpdate =
$DB->PrepareUpdate(
"b_report",
$fields,
"report");
109 $strSql =
"UPDATE b_report SET ".$strUpdate.
" WHERE ID='".
$DB->ForSQL(
$ID).
"'";
118 foreach (
GetModuleEvents(
"report",
"OnReportUpdate",
true) as $arEvent)
134 $strSql =
"DELETE FROM b_report WHERE ID = ".intval(
$ID);
137 foreach (
GetModuleEvents(
"report",
"OnBeforeReportDelete",
true) as $arEvent)
149 foreach (
GetModuleEvents(
"report",
"OnReportDelete",
true) as $arEvent)
164 return Bitrix\Report\ReportTable::getList(
array(
165 'select' =>
array(
'ID',
'TITLE',
'DESCRIPTION',
'CREATED_DATE'),
166 'filter' =>
array(
'=CREATED_BY' =>
$USER->GetID(),
'=OWNER_ID' => $owner)
175 if (empty($templateName)) $templateName =
'.default';
177 get_class(
$USER) ===
'CUser'
178 && $id !==
null && intval($id) >= 0
179 && !empty($templateName)
180 && !empty($strParams)
183 $user_id =
$USER->GetId();
184 if ($user_id !=
null)
186 $result = CUserOptions::SetOption(
187 'report',
'view_params_'.$id.
'_'.$templateName,
$_SERVER[
'QUERY_STRING'],
false, $user_id
200 if (empty($templateName)) $templateName =
'.default';
201 if (get_class(
$USER) ===
'CUser' && $id !==
null && intval($id) >= 0 && !empty($templateName))
203 $user_id =
$USER->GetId();
204 if ($user_id !=
null)
206 $result = CUserOptions::GetOption(
207 'report',
'view_params_'.$id.
'_'.$templateName,
false, $user_id
218 if ($id !==
null && intval($id) >= 0)
220 $dbRes = CUserOptions::GetList(
221 array(
"ID" =>
"ASC"),
222 array(
'CATEGORY' =>
'report',
'NAME_MASK' =>
'view_params_'.$id.
'_')
226 while ($row =
$dbRes->fetch())
228 $userId = (int)$row[
'USER_ID'];
231 if (mb_strpos($row[
'NAME'],
'view_params_'.$id.
'_') === 0)
232 CUserOptions::DeleteOption(
'report', $row[
'NAME'],
false,
$userId);
244 $strSql =
"SELECT COUNT(ID) AS CNT FROM b_report WHERE CREATED_BY='".$DB->ForSql(
$USER->GetID()).
"' AND OWNER_ID='".
$DB->ForSql($owner).
"'";
247 $row =
$res->Fetch();
249 return (
int) $row[
'CNT'];
256 foreach ($strChains as
$k => $v)
261 $key = empty($initKey) ?
$k : $initKey .
'.' .$k;
265 $chain = Entity\QueryChain::getChainByDefinition($initEntity,
$key);
266 $lastElem = $chain->getLastElement();
268 if ($lastElem->getValue() instanceof
Entity\ReferenceField || is_array($lastElem->getValue()))
272 $v[
'__CHAIN__'] = $chain;
276 throw new \Bitrix\Main\SystemException(
'', 100);
282 if ($e->getCode() == 100)
297 $key = empty($initKey) ?
'' : $initKey .
'.';
300 $v = Entity\QueryChain::getChainByDefinition($initEntity,
$key);
312 if (static::$alternateColumnPhrases ===
null)
314 static::$alternateColumnPhrases = [];
316 if (is_string($helperClass)
317 && $helperClass !==
''
318 && method_exists($helperClass,
'getAlternatePhrasesOfColumns'))
320 $phrases = call_user_func([$helperClass,
'getAlternatePhrasesOfColumns']);
321 if (is_array($phrases))
323 static::$alternateColumnPhrases[$helperClass] = $phrases;
327 static::$alternateColumnPhrases[$helperClass] = [];
335 static::initializeAlternateColumnPhrases($helperClass);
339 if (is_string($helperClass) && $helperClass !==
''
340 && is_array(static::$alternateColumnPhrases[$helperClass])
341 && isset(static::$alternateColumnPhrases[$helperClass][$messageCode]))
353 if (static::isAlternateColumnPhraseExists($helperClass, $messageCode))
355 $result = static::$alternateColumnPhrases[$helperClass][$messageCode];
365 foreach ($chains as
$k => $v)
367 if (
$k ==
'__CHAIN__')
372 if ($v instanceof
Entity\QueryChain)
376 $treeElem = $chain->getLastElement()->getValue();
382 if (!empty($v[
'__CHAIN__']))
385 $chain = $v[
'__CHAIN__'];
386 $treeElem = $v[
'__CHAIN__']->getLastElement()->getValue();
388 if (is_array($treeElem))
390 $treeElem = $treeElem[1];
406 'fullHumanTitle' =>
'',
407 'field' => $treeElem,
423 foreach($tree as &$treeElem)
425 $ownerId = call_user_func(
array($helperClass,
'getOwnerId'));
429 if (!empty($treeElem[
'field']))
432 $arUF = call_user_func(
array($helperClass,
'detectUserField'), $treeElem[
'field']);
435 $treeElem[
'isUF'] =
true;
436 $treeElem[
'ufInfo'] = $arUF[
'ufInfo'];
437 $humanTitle = $arUF[
'ufInfo'][
'LIST_COLUMN_LABEL'];
442 $rElementTitle =
'REPORT_'.$ownerId.
'_'.$treeElem[
'fieldName'];
445 $eElementTitle = $treeElem[
'field']->getLangCode();
448 if (mb_substr($rElementTitle, -12) ===
'_PRCNT_FIELD')
450 $messageCode = mb_substr($rElementTitle, 0, -12).
'_FIELD';
454 $messageCode = $rElementTitle;
457 if (static::isAlternateColumnPhraseExists($helperClass, $messageCode))
459 $elementTitle = $rElementTitle;
464 if (is_string($elementMessage) && $elementMessage !==
'')
466 $elementTitle = $rElementTitle;
470 $elementTitle = $eElementTitle;
479 $elementName = $treeElem[
'fieldName'];
480 $elementTitle =
'REPORT_'.$ownerId.
'_COLUMN_TREE_'.$elementName;
483 if (!isset($treeElem[
'isUF']) || !$treeElem[
'isUF'])
486 if (mb_substr($elementTitle, -12) ===
'_PRCNT_FIELD')
488 $messageCode = mb_substr($elementTitle, 0, -12).
'_FIELD';
492 $messageCode = $elementTitle;
495 if (static::isAlternateColumnPhraseExists($helperClass, $messageCode))
497 $humanTitle = static::getAlternateColumnPhrase($helperClass, $messageCode);
507 if (!is_string($humanTitle) || $humanTitle ===
'')
509 $humanTitle = $treeElem[
'fieldName'];
512 if (mb_substr($elementTitle, -12) ==
'_PRCNT_FIELD')
514 $humanTitle .=
' (%)';
517 if (empty($treeElem[
'branch']))
519 $fullHumanTitle = $humanTitle;
521 if (!empty($preTitle))
523 $fullHumanTitle = join(
': ', $preTitle) .
': ' . $fullHumanTitle;
526 $treeElem[
'humanTitle'] = $humanTitle;
527 $treeElem[
'fullHumanTitle'] = $fullHumanTitle;
531 $treeElem[
'humanTitle'] = $humanTitle;
532 $treeElem[
'fullHumanTitle'] = $humanTitle;
534 $sendPreTitle =
array($humanTitle);
548 if (is_array($fElem) && $fElem[
'type'] ==
'field')
550 $field = $fieldList[$fElem[
'name']];
552 if ($field instanceof
Entity\ReferenceField)
554 call_user_func_array(
555 array($helperClass,
'fillFilterReferenceColumn'),
556 array(&$fElem, &$field)
574 static $elems =
array();
576 if (isset($elems[$elemIndex]))
582 $elems[$elemIndex] =
true;
586 $prcnt = $elem[
'prcnt'] ??
'';
587 if ($prcnt !==
'' && $prcnt !==
'self_column')
591 unset($elems[$elemIndex]);
608 public static function prepareSelectViewElement($elem,
$select, $isInitEntityAggregated, $fList, $fChainList,
615 $prcnt = $elem[
'prcnt'] ??
'';
616 if (empty($elem[
'aggr']) && !mb_strlen($prcnt))
618 $selectElem = $elem[
'name'];
625 $field = $fList[$elem[
'name']];
626 $chain = $fChainList[$elem[
'name']];
627 $sourceAlias = $alias = $chain->getAlias();
629 $dataType = call_user_func(
array($helperClassName,
'getFieldDataType'), $field);
632 $needPack1NAggr =
false;
633 if ($chain->hasBackReference() && $elem[
'aggr'] !=
'GROUP_CONCAT')
635 $confirm = call_user_func_array(
636 array($helperClassName,
'confirmSelectBackReferenceRewrite'),
637 array(&$elem, $chain)
642 $needPack1NAggr =
true;
646 if (!empty($elem[
'aggr']))
648 $alias = $elem[
'aggr'] .
'_' . $alias;
650 if ($dataType ==
'boolean')
656 $trueValue = $field->normalizeValue(
true);
657 $localDef =
'CASE WHEN %s = \''.$DB->ForSql($trueValue).
'\' THEN 1 ELSE 0 END
';
664 if ($elem['aggr
'] == 'COUNT_DISTINCT
')
666 $dataType = 'integer
';
668 'COUNT(DISTINCT
'.$localDef.')
', $elem['name
']
673 if ($dataType == 'boolean')
675 $dataType = 'integer
';
678 if ($elem['aggr
'] == 'GROUP_CONCAT
')
681 $localDef, $elem['name
']
686 if ($elem['aggr
'] === 'AVG
')
688 if (!is_array($totalInfo))
692 $totalInfo['average
'] = [
695 'alias
' => $sourceAlias.'_AVGCNT
',
697 'data_type
' => 'integer
',
698 'expression
' => ['COUNT(1)
']
702 'alias
' => $sourceAlias.'_AVGSUM
',
704 'data_type
' => $dataType,
705 'expression
' => ['SUM(
'.$localDef.')
', $elem['name
']]
712 if ($elem['aggr
'] === 'MIN
' || $elem['aggr
'] === 'MAX
')
714 $typeMap = ['MIN
' => 'minimum
', 'MAX
' => 'maximum
'];
715 $type = $typeMap[$elem['aggr
']];
716 if (!is_array($totalInfo))
720 $totalInfo[$type] = ['type
' => $type];
721 unset($typeMap, $type);
725 $expression = [$elem['aggr
'].'(
'.$localDef.')
', $elem['name
']];
729 // pack 1:N aggregations into subquery
733 foreach ($entity->GetPrimaryArray() as $primary)
735 $filter['=
'.$primary] = new CSQLWhereExpression(
736 '?#
', mb_strtolower($entity->getCode()).'.
'.$primary
740 $query = new Entity\Query($entity);
741 $query->addSelect(new Entity\ExpressionField('X
', $expression[0], $elem['name
']));
742 $query->setFilter($filter);
743 $query->setTableAliasPostfix('_sub
');
745 $expression = array('(
'.$query->getQuery().')
');
747 // double aggregation if init entity aggregated
748 if ($isInitEntityAggregated)
750 if ($elem['aggr
'] == 'COUNT_DISTINCT
')
752 $expression[0] = 'SUM(
'.$expression[0].')
';
756 if ($elem['aggr
'] === 'AVG
')
758 $cntQuery = new Entity\Query($entity);
759 $cntQuery->addSelect(new Entity\ExpressionField('CNT
', 'COUNT(1)
', $elem['name
']));
760 $cntQuery->setFilter($filter);
761 $cntQuery->setTableAliasPostfix('_cnt
');
763 $sumQuery = new Entity\Query($entity);
764 $sumQuery->addSelect(new Entity\ExpressionField(
765 'SUM
', 'SUM(
'.$localDef.')
', $elem['name
'])
767 $sumQuery->setFilter($filter);
768 $sumQuery->setTableAliasPostfix('_sum
');
770 if (!is_array($totalInfo))
774 $totalInfo['average
'] = [
777 'alias
' => $sourceAlias.'_AVGCNT
',
779 'data_type
' => 'integer
',
780 'expression
' => ['SUM((
'.$cntQuery->getQuery().'))
']
784 'alias
' => $sourceAlias.'_AVGSUM
',
786 'data_type
' => $dataType,
787 'expression
' => ['SUM((
'.$sumQuery->getQuery().'))
']
792 unset($cntQuery, $sumQuery);
794 $expression[0] = $elem['aggr
'].'(
'.$expression[0].')
';
802 $alias = $alias.'_PRCNT
';
803 $dataType = 'integer
';
805 if($prcnt === 'self_column
')
807 if(empty($expression))
809 $expression = array('%s
', $elem['name
']);
814 if(empty($expression))
817 $localMembers = array($elem['name
']);
821 $localDef = $expression[0];
822 $localMembers = array_slice($expression, 1);
825 list($remoteAlias, $remoteSelect) = self::prepareSelectViewElement(
828 $isInitEntityAggregated,
835 if(is_array($remoteSelect) && !empty($remoteSelect['expression
']))
837 // remote field is expression
838 $remoteDef = $remoteSelect['expression
'][0];
839 $remoteMembers = array_slice($remoteSelect['expression
'], 1);
841 $alias = $alias.'_FROM_
'.$remoteAlias;
845 // remote field is usual field
847 $remoteMembers = array($remoteSelect);
849 $remoteAlias = Entity\QueryChain::getAliasByDefinition($entity, $remoteSelect);
850 $alias = $alias.'_FROM_
'.$remoteAlias;
854 // 'ROUND(STATUS / ID * 100)
'
855 // 'ROUND( (EX1(F1, F2)) / (EX2(F3, F1)) * 100)
',
857 $exprDef = '(
'.$localDef.') / (
'.$remoteDef.') * 100
';
858 $expression = array_merge(array($exprDef), $localMembers, $remoteMembers);
861 if(!is_array($totalInfo))
865 $totalInfo['prcntFromCol
'] = [
866 'type
' => 'prcntFromCol
',
868 'alias
' => $sourceAlias.'_PRCNTFC
',
870 'data_type
' => $dataType,
871 'expression
' => array_merge(array($localDef), $localMembers)
875 'alias
' => $remoteAlias
882 'data_type
' => $dataType,
883 'expression
' => $expression
887 return array($alias, $selectElem, $totalInfo);
890 public static function getFullColumnTitle($view, $viewColumns, $fullHumanTitles)
892 $title = $fullHumanTitles[$view['fieldName
']];
894 if (!empty($view['aggr
']))
896 $title .= ' (
'.GetMessage('REPORT_SELECT_CALC_VAR_
'.$view['aggr
']).')
';
899 if($view['prcnt
'] <> '')
901 if($view['prcnt
'] == 'self_column
')
907 $byTitle = self::getFullColumnTitle($viewColumns[$view['prcnt
']], $viewColumns, $fullHumanTitles);
908 $title .= ' (
'.GetMessage('REPORT_PRCNT_FROM_TITLE
').' '.$byTitle.')
';
915 public static function isColumnPercentable($view, $helperClassName)
921 4. any with COUNT_DISTINCT aggr
924 $dataType = call_user_func(array($helperClassName, 'getFieldDataType
'), $view['field
']);
927 if (($dataType === 'integer
' || $dataType === 'float')
928 && (!$view['isUF
'] || $view['ufInfo
']['MULTIPLE
'] !== 'Y
'))
932 elseif ($dataType === 'boolean' && $view['aggr
'] === 'SUM
'
933 && (!$view['isUF
'] || $view['ufInfo
']['MULTIPLE
'] !== 'Y
'))
937 elseif ($view['aggr
'] === 'COUNT_DISTINCT
')
945 public static function getTotalCountableAggregationFunctions()
947 return static::$totalCountableAggrFuncs;
950 public static function isTotalCountableAggregationFunction($aggr)
952 return in_array($aggr, static::getTotalCountableAggregationFunctions(), true);
955 public static function isColumnTotalCountable($view, $helperClassName)
958 $dataType = call_user_func(array($helperClassName, 'getFieldDataType
'), $view['field
']);
960 if (($dataType === 'integer
' || $dataType === 'float')
961 && empty($view['aggr
'])
962 && (!$view['isUF
'] || $view['ufInfo
']['MULTIPLE
'] !== 'Y
'))
966 elseif (static::isTotalCountableAggregationFunction($view['aggr
']))
974 public static function appendHrefSelectElements(&$elem, $fList, $entity, $helper_class, &$select, &$runtime)
976 // default href assign
977 if (empty($elem['href
']))
979 $href = call_user_func(array($helper_class, 'getDefaultElemHref
'), $elem, $fList);
983 $elem['href
'] = $href;
987 // user defined or default href
988 if (!empty($elem['href
']))
991 preg_match_all('/#([a-zA-Z0-9_\.:\\\\]+)#/
', $elem['href
']['pattern
'], $matches);
993 if (!empty($matches[1]))
995 foreach ($matches[1] as $match)
997 // by default get definition from href
998 $fieldDefinition = $match;
1001 // try to find extended info about href element
1002 if (!empty($elem['href
']['elements
'][$fieldDefinition]))
1004 $fieldDefinition = $elem['href
']['elements
'][$match]['name
'];
1006 if (!empty($elem['href
']['elements
'][$match]['aggr
']))
1008 $fieldAggr = $elem['href
']['elements
'][$match]['aggr
'];
1013 $elem['href
']['elements
'][$match]['aggr
'] = null;
1019 $elem['href
']['elements
'][$fieldDefinition] = array(
1020 'name
' => $fieldDefinition,
1025 $fieldAlias = Entity\QueryChain::getAliasByDefinition($entity, $fieldDefinition);
1028 if (empty($fieldAggr) && !in_array($fieldDefinition, $select, true))
1030 $select[$fieldAlias] = $fieldDefinition;
1032 elseif (!empty($fieldAggr))
1034 $fieldAlias = $fieldAggr.'_
'.$fieldAlias;
1036 // add if not exists
1037 if (!array_key_exists($fieldAlias, $select))
1040 $chain = Entity\QueryChain::getChainByDefinition($entity, $fieldDefinition);
1041 $field = $chain->getLastElement()->getValue();
1044 if ($fieldAggr == 'COUNT_DISTINCT
')
1046 $runtime[$fieldAlias] = array(
1047 'data_type
' => 'integer
', // until we don't have group_concat
1048 'expression' =>
array(
1049 'COUNT(DISTINCT %s)', $fieldDefinition
1055 $runtime[$fieldAlias] =
array(
1056 'data_type' => call_user_func(
array($helper_class,
'getFieldDataType') ,$field),
1057 'expression' =>
array(
1058 $fieldAggr.
'(%s)', $fieldDefinition
1075 $urlParams =
array();
1077 foreach ($elem[
'href'][
'elements'] as $hrefElem)
1079 $alias = Entity\QueryChain::getAliasByDefinition(
$entity, $hrefElem[
'name']);
1081 if (!empty($hrefElem[
'aggr']))
1083 $alias = $hrefElem[
'aggr'].
'_'.$alias;
1086 $urlParams[$hrefElem[
'name']] = $dataRow[$alias];
1089 return CComponentEngine::MakePathFromTemplate($elem[
'href'][
'pattern'], $urlParams);
1098 (is_string(
$def) && (mb_substr(
$def, -11) ==
'.SHORT_NAME' ||
$def ===
'SHORT_NAME'))
1099 || (is_array(
$def) &&
count(
$def[
'expression']) === 2 && mb_substr(
$def[
'expression'][1], -11) ==
'.SHORT_NAME')
1102 $definition = is_string(
$def) ?
$def :
$def[
'expression'][1];
1103 $pre = mb_substr($definition, 0, -11);
1104 $_alias = Entity\QueryChain::getAliasByDefinition(
$entity, $definition);
1106 $expression = self::getFormattedNameExpr($format, $pre);
1110 $nNameElements =
count($expression) - 1;
1111 if ($nNameElements < 1)
1113 $expression =
array(
1114 $DB->IsNull(
'%s',
'\' \
''),
1115 (empty($pre) ?
'' : $pre.
'.').
'LOGIN'
1120 $arConcatNameElements =
array(
$DB->IsNull(
'%s',
'\' \
''));
1121 $n = $nNameElements;
1123 $arConcatNameElements[] =
$DB->IsNull(
'%s',
'\' \
'');
1124 $strConcatNameElements = call_user_func_array(
array(
$DB,
'concat'), $arConcatNameElements);
1125 $expression[0] =
'CASE WHEN '.$DB->Length(
'LTRIM(RTRIM('.$strConcatNameElements.
'))').
'>0 THEN '.$expression[0].
' ELSE %s END';
1126 for (
$i = 1;
$i <= $nNameElements;
$i++)
1127 $expression[] = $expression[
$i];
1128 $expression[] = (empty($pre) ?
'' : $pre.
'.').
'LOGIN';
1134 if (is_string(
$def))
1136 $runtime[$_alias] =
array(
1137 'data_type' =>
'string',
1138 'expression' => $expression
1144 if (mb_substr(
$def[
'expression'][0], 0, 14) ==
'COUNT(DISTINCT')
1146 $_alias =
'COUNT_DISTINCT_'.$_alias;
1150 $_alias =
'GROUP_CONCAT_'.$_alias;
1153 $expression[0] = str_replace(
'%s', $expression[0],
$def[
'expression'][0]);
1155 $runtime[$_alias] =
array(
1156 'data_type' =>
'integer',
1157 'expression' => $expression
1170 foreach ($tree as $treeElem)
1172 $fieldDefinition = $treeElem[
'fieldName'];
1173 $field = $treeElem[
'field'];
1174 $branch = $treeElem[
'branch'];
1176 $list[$fieldDefinition] = $field;
1178 if (!empty($branch))
1180 $list = array_merge($list, self::getUniqueFieldsByTree($branch));
1189 if (array_key_exists($fDefinition, $variations))
1191 $vars = $variations[$fDefinition];
1195 $vars = $variations[$fType];
1198 return in_array($variation, $vars,
true);
1203 foreach ($vReports as &$dReport)
1205 $dReport[
'settings'][
'mark_default'] = $dReport[
'mark_default'] ?? 0;
1206 $dReport[
'settings'][
'title'] = $dReport[
'title'] ??
'';
1207 $dReport[
'settings'][
'description'] = $dReport[
'description'] ??
'';
1208 $dReport[
'settings'][
'owner'] = $ownerId;
1210 self::Add($dReport[
'settings']);
1219 foreach (
$filter as $fId => $filterInfo)
1223 foreach ($filterInfo as
$key => $subFilter)
1226 if (
$key ===
'LOGIC')
1231 if ($subFilter[
'type'] ==
'field')
1234 $compare = self::$iBlockCompareVariations[$subFilter[
'compare']];
1235 $name = $subFilter[
'name'];
1236 $value = $subFilter[
'value'];
1244 $compare.$name => $value,
1251 $value = $value.
'%';
1253 $iFilterItems[] = [$compare.$name => $value];
1256 else if ($subFilter[
'type'] ==
'filter')
1259 $iFilterItems[] =
'FILTER_'.$subFilter[
'name'];
1263 if (!empty($iFilterItems))
1265 $iFilterItems[
'LOGIC'] = $filterInfo[
'LOGIC'];
1266 $newFilter[$fId] = $iFilterItems;
1280 foreach (
$filter as &$filterInfo)
1282 foreach ($filterInfo as
$key => $subFilter)
1284 if (
$key !==
'LOGIC' && is_string($subFilter))
1286 $sfId = mb_substr($subFilter, 7);
1288 if (array_key_exists($sfId,
$filter))
1301 $fullHumanTitles =
array();
1303 foreach ($tree as $treeElem)
1306 $fullHumanTitle = $treeElem[
'fullHumanTitle'];
1307 if (mb_substr($treeElem[
'fieldName'], -11) ==
'.SHORT_NAME')
1309 $pos = mb_strrpos($fullHumanTitle,
':');
1312 $fullHumanTitle = mb_substr($fullHumanTitle, 0, $pos);
1315 $fullHumanTitles[$treeElem[
'fieldName']] = $fullHumanTitle;
1316 unset($fullHumanTitle);
1318 if (!empty($treeElem[
'branch']))
1320 $fullHumanTitles = array_merge($fullHumanTitles, self::collectFullHumanTitles($treeElem[
'branch']));
1324 return $fullHumanTitles;
1332 '#NAME#' =>
array(
$DB->IsNull(
'%s',
'\' \
''),
'NAME'),
1333 '#NAME_SHORT#' =>
array(
$DB->Concat(
"UPPER(".$DB->Substr(
$DB->IsNull(
'%s',
'\' \
''), 1, 1).
")",
"'.'"),
'NAME'),
1334 '#SECOND_NAME#' =>
array(
$DB->IsNull(
'%s',
'\' \
''),
'SECOND_NAME'),
1335 '#SECOND_NAME_SHORT#' =>
array(
$DB->Concat(
"UPPER(".$DB->Substr(
$DB->IsNull(
'%s',
'\' \
''), 1, 1).
")",
"'.'"),
'SECOND_NAME'),
1336 '#LAST_NAME#' =>
array(
$DB->IsNull(
'%s',
'\' \
''),
'LAST_NAME'),
1337 '#LAST_NAME_SHORT#' =>
array(
$DB->Concat(
"UPPER(".$DB->Substr(
$DB->IsNull(
'%s',
'\' \
''), 1, 1).
")",
"'.'"),
'LAST_NAME')
1342 $format =
'#LAST_NAME# #NAME_SHORT#';
1345 $sql_fields =
array(
null);
1348 '/('.join(
'|', array_keys($values)).
')/',
1349 str_replace(
'%',
'%%', $format),
1350 -1, PREG_SPLIT_DELIM_CAPTURE
1353 $expression =
array();
1357 if (array_key_exists($match, $values))
1359 $expression[] = $values[$match][0];
1360 $sql_fields[] = (empty($defPrefix) ?
'' : $defPrefix.
'.').$values[$match][1];
1364 $expression[] =
"'".$match.
"'";
1368 $expression = call_user_func_array(
array(
$DB,
'Concat'), $expression);
1370 $sql_fields[0] = $expression;
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static isAlternateColumnPhraseExists($helperClass, $messageCode)
static Update($ID, $settings)
static clearViewParams($id)
static fillFilterReferenceColumns(&$filters, &$fieldList, $helperClass)
static $alternateColumnPhrases
static $iBlockCompareVariations
static collectFullHumanTitles($tree)
static generateColumnTree($chains, $initEntity, $helper_class, $level=0)
static getViewParams($id, $templateName)
static rewriteUserShortName(&$select, &$runtime, $format, $entity, $grc=false)
static generateValueUrl($elem, $dataRow, $entity)
static GetList($owner='')
static addFreshDefaultReports($vReports, $ownerId)
static getFormattedNameExpr($format, $defPrefix)
static makeSingleFilter($filter)
static $totalCountableAggrFuncs
static generateChains($strChains, $initEntity, $initKey)
static setViewParams($id, $templateName, $strParams)
static GetCountInt($owner='')
static checkSelectViewElementCyclicDependency($select, $elemIndex)
static getAlternateColumnPhrase($helperClass, $messageCode)
static attachLangToColumnTree(&$tree, $initEntity, $helperClass, $preTitle=array())
static isValidFilterCompareVariation($fDefinition, $fType, $variation, $variations)
static getUniqueFieldsByTree($tree)
static initializeAlternateColumnPhrases($helperClass)
static sqlizeFilter($filter)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(Loader::includeModule( 'bitrix24')) elseif(Loader::includeModule('intranet') &&CIntranetUtils::getPortalZone() !=='ru') $description
$_SERVER["DOCUMENT_ROOT"]
ExecuteModuleEventEx($arEvent, $arParams=[])
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
GetMessage($name, $aReplace=null)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
foreach($arTemplatesList as $templ) if(mb_strpos($templ["NAME"] $def