1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
trackingservice.php
См. документацию.
1<?php
2
6
8{
9 protected const CLEAR_LOG_SELECT_LIMIT = 50000;
10 protected const CLEAR_LOG_DELETE_LIMIT = 1000;
11 protected $skipTypes = [];
12 protected $forcedModeWorkflows = [];
13 protected static $userGroupsCache = [];
14
15 private $cutQueue = [];
16
17 public const DEBUG_TRACK_TYPES = [
22 ];
23
24 public function start(CBPRuntime $runtime = null)
25 {
26 parent::Start($runtime);
27
29 if ($skipTypes !== '')
30 {
31 $this->skipTypes = explode(',', $skipTypes);
32 }
33 }
34
35 public function deleteAllWorkflowTracking($workflowId)
36 {
37 self::DeleteByWorkflow($workflowId);
38 }
39
40 public static function dumpWorkflow($workflowId)
41 {
42 global $DB;
43
44 $workflowId = trim($workflowId);
45 if ($workflowId == '')
46 throw new Exception("workflowId");
47
48 $dbResult = $DB->Query(
49 "SELECT ID, TYPE, MODIFIED, ACTION_NAME, ACTION_TITLE, EXECUTION_STATUS, EXECUTION_RESULT, ACTION_NOTE, MODIFIED_BY ".
50 "FROM b_bp_tracking ".
51 "WHERE WORKFLOW_ID = '".$DB->ForSql($workflowId)."' ".
52 "ORDER BY ID "
53 );
55
56 $r = array();
57 $level = 0;
58 while ($arResult = $dbResult->GetNext())
59 {
61 {
62 $level--;
63 $arResult["PREFIX"] = str_repeat("&nbsp;&nbsp;&nbsp;", $level > 0 ? $level : 0);
64 $arResult["LEVEL"] = $level;
65 }
67 {
68 $arResult["PREFIX"] = str_repeat("&nbsp;&nbsp;&nbsp;", $level > 0 ? $level : 0);
69 $arResult["LEVEL"] = $level;
70 $level++;
71 }
72 else
73 {
74 $arResult["PREFIX"] = str_repeat("&nbsp;&nbsp;&nbsp;", $level > 0 ? $level : 0);
75 $arResult["LEVEL"] = $level;
76 }
77
78 $r[] = $arResult;
79 }
80
81 return $r;
82 }
83
84 public function loadReport($workflowId, int $limit = 0)
85 {
86 $result = [];
87 $navStartParams = $limit > 0 ? ['nTopCount' => $limit] : false;
88 $order = ['ID' => $limit > 0 ? 'DESC' : 'ASC'];
89
90 $dbResult = static::getList(
91 $order,
92 ["WORKFLOW_ID" => $workflowId, "TYPE" => CBPTrackingType::Report],
93 false,
94 $navStartParams,
95 ["ID", "MODIFIED", "ACTION_NOTE"]
96 );
97 while ($arResult = $dbResult->GetNext())
98 {
100 }
101
102 if ($limit > 0)
103 {
104 return array_reverse($result);
105 }
106
107 return $result;
108 }
109
110 public static function deleteByWorkflow($workflowId)
111 {
113 $helper = $connection->getSqlHelper();
114
115 $workflowId = trim($workflowId);
116 if (!$workflowId)
117 {
118 throw new Exception("workflowId");
119 }
120
121 $queryString = sprintf(
122 "SELECT ID FROM b_bp_tracking t WHERE WORKFLOW_ID = '%s'",
123 $helper->forSql($workflowId)
124 );
125
126 $ids = $connection->query($queryString)->fetchAll();
127
128 while ($partIds = array_splice($ids, 0, static::CLEAR_LOG_DELETE_LIMIT))
129 {
130 $connection->query(
131 sprintf(
132 'DELETE from b_bp_tracking WHERE ID IN(%s)',
133 implode(',', array_column($partIds, 'ID'))
134 )
135 );
136 }
137 }
138
139 public function setCompletedByWorkflow($workflowId, $flag = true)
140 {
141 global $DB;
142
143 $workflowId = trim($workflowId);
144
145 if (!$workflowId)
146 {
147 throw new Exception("workflowId");
148 }
149
150 $value1 = $flag ? 'Y' : 'N';
151 $value2 = $DB->ForSql($workflowId, 32);
152
153 $DB->Query(
154 "UPDATE b_bp_tracking SET COMPLETED = '{$value1}' WHERE WORKFLOW_ID = '{$value2}'"
155 );
156 }
157
158 public static function clearOldAgent()
159 {
160 if (Main\ModuleManager::isModuleInstalled('bitrix24'))
161 {
162 static::clearB24();
163 }
164 else
165 {
166 static::ClearOld(COption::GetOptionString("bizproc", "log_cleanup_days", "90"));
167 }
168
169 return "CBPTrackingService::ClearOldAgent();";
170 }
171
176 public static function clearB24Agent()
177 {
178 return '';
179 }
180
185 public static function clearB24(): bool
186 {
188 $helper = $connection->getSqlHelper();
189 $limit = static::CLEAR_LOG_SELECT_LIMIT;
190 $partLimit = static::CLEAR_LOG_DELETE_LIMIT;
191 $sqlInterval = $helper->addDaysToDateTime(-90);
192
193 $strSql = "SELECT ID FROM b_bp_tracking t WHERE t.MODIFIED < {$sqlInterval} LIMIT {$limit}";
194 $result = $connection->query($strSql);
195 $ids = $result->fetchAll();
196
197 if ($ids)
198 {
199 while ($partIds = array_splice($ids, 0, $partLimit))
200 {
201 $connection->query(
202 sprintf(
203 'DELETE from b_bp_tracking WHERE ID IN(%s)',
204 implode(',', array_column($partIds, 'ID'))
205 )
206 );
207 }
208 }
209
210 global $pPERIOD;
211 if ($result->getSelectedRowsCount() === $limit)
212 {
213 $pPERIOD = 900; // 15 min
214 }
215 else
216 {
217 $pPERIOD = strtotime('tomorrow 01:00') - time();
218 }
219
220 return true;
221 }
222
223 public static function parseStringParameter($string, $documentType = null, $htmlSpecialChars = true)
224 {
225 if (!$documentType)
226 {
227 $documentType = ['', '', ''];
228 }
229
230 return preg_replace_callback(
232 static function ($matches) use ($documentType, $htmlSpecialChars)
233 {
234 return CBPAllTrackingService::parseStringParameterMatches(
235 $matches,
236 [$documentType[0], $documentType[1], $documentType[2]],
237 $htmlSpecialChars
238 );
239 },
240 $string
241 );
242 }
243
244 public static function parseStringParameterMatches($matches, $documentType = null, $htmlSpecialChars = true)
245 {
246 $result = "";
247 $documentType = is_array($documentType) ? array_filter($documentType) : null;
248
249 if ($matches[1] === "user")
250 {
251 $user = $matches[2];
252
253 $l = mb_strlen("user_");
254 if (mb_strpos($user, "user_") === 0)
255 {
256 $result = CBPHelper::ConvertUserToPrintableForm((int)(mb_substr($user, $l)), '', $htmlSpecialChars);
257 }
258 elseif (mb_strpos($user, 'group_') === 0)
259 {
260 $result =
261 $htmlSpecialChars
262 ? htmlspecialcharsbx(CBPHelper::getExtendedGroupName($user))
263 : CBPHelper::getExtendedGroupName($user)
264 ;
265 }
266 elseif ($documentType)
267 {
268 $v = implode(",", $documentType);
269 if (!array_key_exists($v,self::$userGroupsCache ))
270 {
271 self::$userGroupsCache[$v] = CBPDocument::GetAllowableUserGroups($documentType);
272 }
273
274 $result = self::$userGroupsCache[$v][$user];
275 }
276 else
277 {
278 $result = $user;
279 }
280 }
281 elseif ($matches[1] === "group")
282 {
283 if (mb_strpos($matches[2], 'group_') === 0)
284 {
285 $result =
286 $htmlSpecialChars
287 ? htmlspecialcharsbx(CBPHelper::getExtendedGroupName($matches[2]))
288 : CBPHelper::getExtendedGroupName($matches[2])
289 ;
290 }
291 elseif ($documentType)
292 {
293 $v = implode(",", $documentType);
294 if (!array_key_exists($v, self::$userGroupsCache))
295 {
296 self::$userGroupsCache[$v] = CBPDocument::GetAllowableUserGroups($documentType);
297 }
298
299 $result = self::$userGroupsCache[$v][$matches[2]];
300 }
301 else
302 {
303 $result = $matches[2];
304 }
305 }
306 else
307 {
308 $result = $matches[0];
309 }
310
311 return $result;
312 }
313
314 public function setForcedMode($workflowId)
315 {
316 $this->forcedModeWorkflows[] = $workflowId;
317 return $this;
318 }
319
320 public function isForcedMode($workflowId)
321 {
322 return in_array($workflowId, $this->forcedModeWorkflows);
323 }
324
325 public function canWrite($type, $workflowId)
326 {
327 if (in_array((int)$type, self::DEBUG_TRACK_TYPES, true))
328 {
329 return false;
330 }
331
332 return (!in_array($type, $this->skipTypes) || $this->isForcedMode($workflowId));
333 }
334
335 public function write(
336 $workflowId,
337 $type,
338 $actionName,
339 $executionStatus,
340 $executionResult,
341 $actionTitle = "",
342 $actionNote = "",
343 $modifiedBy = 0
344 ): ?int
345 {
346 global $DB;
347
348 if (!$this->canWrite($type, $workflowId))
349 {
350 return null;
351 }
352
353 $workflowId = trim($workflowId);
354 if ($workflowId == '')
355 throw new Exception("workflowId");
356
357 $actionName = trim($actionName);
358 if ($actionName == '')
359 throw new Exception("actionName");
360
361 $type = intval($type);
362 $executionStatus = intval($executionStatus);
363 $executionResult = intval($executionResult);
364 $actionNote = trim($actionNote);
365
366 $modifiedBy = intval($modifiedBy);
367
368 $actionTitle = is_string($actionTitle) ? $actionTitle : '';
369
370 $DB->Query(
371 "INSERT INTO b_bp_tracking(WORKFLOW_ID, TYPE, MODIFIED, ACTION_NAME, ACTION_TITLE, EXECUTION_STATUS, EXECUTION_RESULT, ACTION_NOTE, MODIFIED_BY) ".
372 "VALUES('".$DB->ForSql($workflowId, 32)."', ".intval($type).", ".$DB->CurrentTimeFunction().", '".$DB->ForSql($actionName, 128)."', '".$DB->ForSql($actionTitle, 255)."', ".intval($executionStatus).", ".intval($executionResult).", ".($actionNote <> '' ? "'".$DB->ForSql($actionNote)."'" : "NULL").", ".($modifiedBy > 0 ? $modifiedBy : "NULL").")"
373 );
374 $id = $DB->LastID();
375
376 if (self::getLogSizeLimit() && !$this->isForcedMode($workflowId))
377 {
378 $this->cutLogSizeDeferred($workflowId);
379 }
380
381 return $id;
382 }
383
384 public static function getList(
385 $arOrder = ["ID" => "DESC"],
386 $arFilter = [],
387 $arGroupBy = false,
388 $arNavStartParams = false,
389 $arSelectFields = []
390 )
391 {
392 global $DB;
393
394 if (count($arSelectFields) <= 0)
395 {
396 $arSelectFields = [
397 "ID",
398 "WORKFLOW_ID",
399 "TYPE",
400 "MODIFIED",
401 "ACTION_NAME",
402 "ACTION_TITLE",
403 "EXECUTION_STATUS",
404 "EXECUTION_RESULT",
405 "ACTION_NOTE",
406 "MODIFIED_BY",
407 ];
408 }
409
410 static $arFields = [
411 "ID" => ["FIELD" => "T.ID", "TYPE" => "int"],
412 "WORKFLOW_ID" => ["FIELD" => "T.WORKFLOW_ID", "TYPE" => "string"],
413 "TYPE" => ["FIELD" => "T.TYPE", "TYPE" => "int"],
414 "ACTION_NAME" => ["FIELD" => "T.ACTION_NAME", "TYPE" => "string"],
415 "ACTION_TITLE" => ["FIELD" => "T.ACTION_TITLE", "TYPE" => "string"],
416 "MODIFIED" => ["FIELD" => "T.MODIFIED", "TYPE" => "datetime"],
417 "EXECUTION_STATUS" => ["FIELD" => "T.EXECUTION_STATUS", "TYPE" => "int"],
418 "EXECUTION_RESULT" => ["FIELD" => "T.EXECUTION_RESULT", "TYPE" => "int"],
419 "ACTION_NOTE" => ["FIELD" => "T.ACTION_NOTE", "TYPE" => "string"],
420 "MODIFIED_BY" => ["FIELD" => "T.MODIFIED_BY", "TYPE" => "int"],
421 ];
422
423 $arSqls = CBPHelper::PrepareSql($arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields);
424
425 $arSqls["SELECT"] = str_replace("%%_DISTINCT_%%", "", $arSqls["SELECT"]);
426
427 if (is_array($arGroupBy) && count($arGroupBy)==0)
428 {
429 $strSql =
430 "SELECT ".$arSqls["SELECT"]." ".
431 "FROM b_bp_tracking T ".
432 " ".$arSqls["FROM"]." ";
433 if ($arSqls["WHERE"] <> '')
434 $strSql .= "WHERE ".$arSqls["WHERE"]." ";
435 if ($arSqls["GROUPBY"] <> '')
436 $strSql .= "GROUP BY ".$arSqls["GROUPBY"]." ";
437
438 $dbRes = $DB->Query($strSql);
439 if ($arRes = $dbRes->Fetch())
440 {
441 return $arRes["CNT"];
442 }
443
444 return false;
445 }
446
447 $strSql =
448 "SELECT ".$arSqls["SELECT"]." ".
449 "FROM b_bp_tracking T ".
450 " ".$arSqls["FROM"]." ";
451 if ($arSqls["WHERE"] <> '')
452 $strSql .= "WHERE ".$arSqls["WHERE"]." ";
453 if ($arSqls["GROUPBY"] <> '')
454 $strSql .= "GROUP BY ".$arSqls["GROUPBY"]." ";
455 if ($arSqls["ORDERBY"] <> '')
456 $strSql .= "ORDER BY ".$arSqls["ORDERBY"]." ";
457
458 if (is_array($arNavStartParams) && intval($arNavStartParams["nTopCount"]) <= 0)
459 {
460 $strSql_tmp =
461 "SELECT COUNT('x') as CNT ".
462 "FROM b_bp_tracking T ".
463 " ".$arSqls["FROM"]." ";
464 if ($arSqls["WHERE"] <> '')
465 $strSql_tmp .= "WHERE ".$arSqls["WHERE"]." ";
466 if ($arSqls["GROUPBY"] <> '')
467 $strSql_tmp .= "GROUP BY ".$arSqls["GROUPBY"]." ";
468
469 $dbRes = $DB->Query($strSql_tmp);
470 $cnt = 0;
471 if ($arSqls["GROUPBY"] == '')
472 {
473 if ($arRes = $dbRes->Fetch())
474 {
475 $cnt = $arRes["CNT"];
476 }
477 }
478 else
479 {
480 // only for MySQL
481 $cnt = $dbRes->SelectedRowsCount();
482 }
483
484 $dbRes = new CDBResult();
485 $dbRes->NavQuery($strSql, $cnt, $arNavStartParams);
486 }
487 else
488 {
489 if (is_array($arNavStartParams) && intval($arNavStartParams["nTopCount"]) > 0)
490 $strSql .= "LIMIT ".intval($arNavStartParams["nTopCount"]);
491
492 $dbRes = $DB->Query($strSql);
493 }
494
496 }
497
498 public static function clearOld($days = 0)
499 {
501 $helper = $connection->getSqlHelper();
502 $days = (int)$days;
503 if ($days <= 0)
504 {
505 $days = 90;
506 }
507
508 $completed = self::shouldClearCompletedTracksOnly() ? "= 'Y'" : "IN ('N', 'Y')";
509 $limit = static::CLEAR_LOG_SELECT_LIMIT;
510 $partLimit = static::CLEAR_LOG_DELETE_LIMIT;
511 $sqlInterval = $helper->addDaysToDateTime(-1 * $days);
512
513 $strSql = "SELECT ID FROM b_bp_tracking t WHERE t.COMPLETED {$completed} "
514 . " AND t.MODIFIED < {$sqlInterval}"
515 . " AND t.TYPE IN (0,1,2,3,4,5,7,8,9) LIMIT {$limit}"
516 ;
517
518 $ids = $connection->query($strSql)->fetchAll();
519
520 while ($partIds = array_splice($ids, 0, $partLimit))
521 {
522 $connection->query(
523 sprintf(
524 'DELETE from b_bp_tracking WHERE ID IN(%s)',
525 implode(',', array_column($partIds, 'ID'))
526 )
527 );
528 }
529
530 return true;
531 }
532
533 private function cutLogSize(string $workflowId, int $size): bool
534 {
535 global $DB;
536
537 $queryResult = $DB->Query(
538 sprintf(
539 "SELECT ID FROM b_bp_tracking"
540 . " WHERE WORKFLOW_ID = '%s' AND " . $DB->quote('TYPE') . " IN (0,1,2,3,4,5,7,8,9) ORDER BY ID DESC LIMIT %d,100",
541 $DB->ForSql($workflowId),
542 $size
543 )
544 );
545
546 $ids = [];
547 while ($row = $queryResult->fetch())
548 {
549 $ids[] = $row['ID'];
550 }
551
552 if ($ids)
553 {
554 $DB->Query(
555 sprintf(
556 'DELETE FROM b_bp_tracking WHERE ID IN (%s)',
557 implode(',', $ids)
558 ),
559 true
560 );
561 }
562
563 return true;
564 }
565
566 private function cutLogSizeDeferred(string $workflowId)
567 {
568 $this->cutQueue[$workflowId] = true;
569 $this->setCutJob();
570 }
571
572 private function setCutJob()
573 {
574 static $inserted = false;
575
576 if (!$inserted)
577 {
578 Main\Application::getInstance()->addBackgroundJob(
579 [$this, 'doBackgroundCut'],
580 [],
581 Main\Application::JOB_PRIORITY_LOW - 10
582 );
583 $inserted = true;
584 }
585 }
586
587 public function doBackgroundCut()
588 {
589 $size = self::getLogSizeLimit();
590 $list = array_keys($this->cutQueue);
591 $this->cutQueue = [];//clear
592
593 foreach ($list as $workflowId)
594 {
595 $this->cutLogSize($workflowId, $size);
596 }
597 }
598
599 private static function getLogSizeLimit(): int
600 {
601 static $limit;
602 if ($limit === null)
603 {
604 $limit = Main\ModuleManager::isModuleInstalled('bitrix24') ? 50 : 0;
605 }
606
607 return $limit;
608 }
609
610 public static function shouldClearCompletedTracksOnly(): bool
611 {
612 if (Main\ModuleManager::isModuleInstalled('bitrix24'))
613 {
614 //more logic later
615 return false;
616 }
617
618 return true;
619 }
620}
621
623{
624 public function fetch()
625 {
626 $result = parent::Fetch();
627
628 if ($result && isset($result['ACTION_NOTE']) && is_string($result['ACTION_NOTE']))
629 {
630 $actionNote = $result['ACTION_NOTE'];
631
632 if (isset($result['TYPE']) && in_array((int)$result['TYPE'], CBPTrackingService::DEBUG_TRACK_TYPES, true))
633 {
634 $decodedActionNote = [];
635 try
636 {
637 $decodedActionNote = \Bitrix\Main\Web\Json::decode($actionNote);
638 }
639 catch (ArgumentException)
640 {}
641
642 if (is_array($decodedActionNote))
643 {
644 array_walk_recursive($decodedActionNote, static function (&$value) {
645 if (is_string($value))
646 {
647 $value = Emoji::decode($value);
648 }
649 });
650 }
651
652 if (isset($decodedActionNote['propertyValue']) && is_string($decodedActionNote['propertyValue']))
653 {
654 $propertyValue = $decodedActionNote['propertyValue'];
656 $propertyValue = self::convertTimestampTag($propertyValue);
657 $decodedActionNote['propertyValue'] = $propertyValue;
658 }
659
660 $result['ACTION_NOTE'] = \Bitrix\Main\Web\Json::encode($decodedActionNote);
661 }
662 else
663 {
664 $actionNote = \CBPTrackingService::parseStringParameter($actionNote, null, false);
665 $actionNote = self::convertTimestampTag($actionNote);
666
667 $result['ACTION_NOTE'] = $actionNote;
668 }
669 }
670
671 return $result;
672 }
673
674 private static function convertTimestampTag($string): string
675 {
676 return preg_replace_callback(
677 '/\[timestamp=(\d+)\].*\[\/timestamp\]/i',
678 static function ($matches)
679 {
680 $timestamp = (int)$matches[1];
681
682 $datetime = new \Bitrix\Bizproc\BaseType\Value\DateTime($timestamp, CTimeZone::GetOffset());
683 if ($datetime->getTimestamp() === null)
684 {
685 return '';
686 }
687
688 return (string)$datetime;
689 },
690 $string
691 );
692 }
693}
694
696{
697 public const Unknown = 0;
698 public const ExecuteActivity = 1;
699 public const CloseActivity = 2;
700 public const CancelActivity = 3;
701 public const FaultActivity = 4;
702 public const Custom = 5;
703 public const Report = 6;
704 public const AttachedEntity = 7;
705 public const Trigger = 8;
706 public const Error = 9;
707 public const Debug = 10;
708 public const DebugAutomation = 11;
709 public const DebugDesigner = 12;
710 public const DebugLink = 13;
711}
$connection
Определения actionsdefinitions.php:38
$type
Определения options.php:106
$arResult
Определения generate_coupon.php:16
static getConnection($name="")
Определения application.php:638
static get($moduleId, $name, $default="", $siteId=false)
Определения option.php:30
static isModuleInstalled($moduleName)
Определения modulemanager.php:125
Определения emoji.php:10
static decode($data)
Определения json.php:50
static encode($data, $options=null)
Определения json.php:22
$result
Определения dbresult.php:16
const ValueInlinePattern
Определения activity.php:28
Определения runtime.php:22
$runtime
Определения runtimeservice.php:5
static deleteByWorkflow($workflowId)
Определения trackingservice.php:110
isForcedMode($workflowId)
Определения trackingservice.php:320
static parseStringParameterMatches($matches, $documentType=null, $htmlSpecialChars=true)
Определения trackingservice.php:244
const DEBUG_TRACK_TYPES
Определения trackingservice.php:17
const CLEAR_LOG_SELECT_LIMIT
Определения trackingservice.php:9
static shouldClearCompletedTracksOnly()
Определения trackingservice.php:610
setCompletedByWorkflow($workflowId, $flag=true)
Определения trackingservice.php:139
static clearOld($days=0)
Определения trackingservice.php:498
static clearOldAgent()
Определения trackingservice.php:158
static getList( $arOrder=["ID"=> "DESC"], $arFilter=[], $arGroupBy=false, $arNavStartParams=false, $arSelectFields=[])
Определения trackingservice.php:384
static parseStringParameter($string, $documentType=null, $htmlSpecialChars=true)
Определения trackingservice.php:223
canWrite($type, $workflowId)
Определения trackingservice.php:325
static clearB24()
Определения trackingservice.php:185
write( $workflowId, $type, $actionName, $executionStatus, $executionResult, $actionTitle="", $actionNote="", $modifiedBy=0)
Определения trackingservice.php:335
static $userGroupsCache
Определения trackingservice.php:13
loadReport($workflowId, int $limit=0)
Определения trackingservice.php:84
doBackgroundCut()
Определения trackingservice.php:587
const CLEAR_LOG_DELETE_LIMIT
Определения trackingservice.php:10
setForcedMode($workflowId)
Определения trackingservice.php:314
static clearB24Agent()
Определения trackingservice.php:176
$forcedModeWorkflows
Определения trackingservice.php:12
deleteAllWorkflowTracking($workflowId)
Определения trackingservice.php:35
static dumpWorkflow($workflowId)
Определения trackingservice.php:40
start(CBPRuntime $runtime=null)
Определения trackingservice.php:24
const Error
Определения trackingservice.php:706
const Debug
Определения trackingservice.php:707
const DebugLink
Определения trackingservice.php:710
const AttachedEntity
Определения trackingservice.php:704
const Unknown
Определения trackingservice.php:697
const CloseActivity
Определения trackingservice.php:699
const CancelActivity
Определения trackingservice.php:700
const DebugDesigner
Определения trackingservice.php:709
const Custom
Определения trackingservice.php:702
const DebugAutomation
Определения trackingservice.php:708
const Report
Определения trackingservice.php:703
const FaultActivity
Определения trackingservice.php:701
const ExecuteActivity
Определения trackingservice.php:698
const Trigger
Определения trackingservice.php:705
Определения dbresult.php:88
$arFields
Определения dblapprove.php:5
</td ></tr ></table ></td ></tr ><?endif?><? $propertyIndex=0;foreach( $arGlobalProperties as $propertyCode=> $propertyValue
Определения file_new.php:729
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
global $DB
Определения cron_frame.php:29
$l
Определения options.php:783
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
$user
Определения mysql_to_pgsql.php:33
$order
Определения payment.php:8
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
</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."%"
Определения waybill.php:936
$matches
Определения index.php:22
$arRes
Определения options.php:104
$dbResult
Определения updtr957.php:3
$arFilter
Определения user_search.php:106
$dbRes
Определения yandex_detail.php:168