Справочник переменных смарт-действий¶
Переменные вида @ContextID, @EventParam0, @cycle_value и т.д., которые подставляются в SmartExpressions (T-SQL / ESQL), смарт-фильтрах, CustomFlex SQL. Одно место для поиска вместо обхода трёх разных доменных файлов.
Переменные
@authorId,@subcatIdв таблице ниже — SQL-параметры хранимых процедур и JS-скриптов, не SMART-переменные платформы. Они включены со сноской для полноты.
Таблица переменных¶
| Переменная | Регистр | Тип | Значение | Где доступна | Источник |
|---|---|---|---|---|---|
@ContextID |
регистронезависим (@ContextId = то же) |
int | ID текущей задачи (TaskID) | SmartExpression T-SQL, ESQL-обёртка WrapCommandTextInContext() |
docs/domains/smart-filters/backend.md:341, docs/domains/smart-actions/academy-patterns.md:291 |
@EventParam0 |
регистронезависим | зависит от события | Параметр 0 текущего события; для события подписи — ID задачи-акцептанта | SmartExpression с привязкой к событию (eventId != null) |
docs/domains/smart-actions/academy-patterns.md:292,352 |
@EventParam1 |
регистронезависим | зависит от события | Параметр 1 события; для события «открытие задачи» — контекст открытия; для ДП Lookup — ID текущей категории | SmartExpression с привязкой к событию; ДП Lookup смарт-фильтр | docs/domains/smart-actions/known-issues.md:64, docs/domains/ext-params/lookup/settings-reference.md:35 |
@EventParam2 |
регистронезависим | зависит от события | Параметр 2 события; для ДП Lookup — ID задачи-источника; для портала (каскадный dropdown) — выбранное значение родительского параметра | SmartExpression с привязкой к событию; каскадные dropdown в портале | docs/domains/ext-params/lookup/settings-reference.md:36, docs/domains/portal/admin.md:105 |
@EventParam3 |
регистронезависим | string (JSON) | Параметр 3 события; для ДП Lookup — JSON значений строки таблицы (если Lookup в колонке ДП Таблица) | ДП Lookup смарт-фильтр | docs/domains/ext-params/lookup/settings-reference.md:37 |
@EventParam4 |
регистронезависим | int | Параметр 4 события; для ДП Lookup — ID блока | ДП Lookup смарт-фильтр | docs/domains/ext-params/lookup/settings-reference.md:38 |
@EventParam{N} |
регистронезависим | зависит от события | Параметр с индексом N (от 0); именуются @EventParam0, @EventParam1, ... |
SmartExpression с eventId; T-SQL — через AddNeededQueryParams() по тексту |
docs/domains/smart-filters/backend.md:154–155 |
@eventParamRaw{N} |
регистронезависим | любой (TVP-compatible) | «Сырой» вариант параметра события N; поддерживает TVP для IEnumerable<int/string/DateTime> |
SmartExpression T-SQL (только через RawParamsProvider, не в XSLT/ESQL) | docs/domains/smart-filters/backend.md:164 |
@cycle_value |
строчный | string | Текущее значение итератора в цикле пакета действий | SmartExpression внутри циклического пакета (IsCyclic = true) |
docs/domains/smart-filters/backend.md:185,339, docs/domains/smart-filters/backend.md:80 |
@cycle_idx |
строчный | int | Индекс текущей итерации (от 0) | SmartExpression внутри циклического пакета | docs/domains/smart-filters/backend.md:184,340 |
@CurrentSessionUserID |
строчный | int | ID текущего пользователя (сессионный); в ShowTasksFeed текстово заменяется на @UserID до исполнения |
SmartExpression T-SQL; CustomFlex SQL в ShowTasksFeed | docs/domains/smart-filters/backend.md:342, docs/domains/grids/showtasksfeed.md:381 |
Примечание: переменные в JS-скриптах и SP (не SMART-переменные платформы)¶
Следующие идентификаторы встречаются в SQL-параметрах SP и JS-скриптах Анфисы — это обычные SQL-параметры, не «подстановочные» переменные платформы SmartExpressions:
| Идентификатор | Контекст | Источник |
|---|---|---|
@authorId |
SQL-параметр в JS-скриптах Анфисы (agent-tools-user.js, agent-persist.js) | docs/domains/ai/scripts/module-agent-tools-user.js:54 |
@subcatId |
SQL-параметр SP и JS-фильтров Анфисы | docs/domains/ai/scripts/module-agent-tools-user.js:196 |
@SubcatID |
SQL-параметр большинства системных SP (ShowTasksFeed, tc_SubcategoryDenormalize и др.) | docs/domains/grids/showtasksfeed.md:88 |
@UserID |
SQL-параметр ShowTasksFeed; итоговое имя после замены @CurrentSessionUserID |
docs/domains/grids/showtasksfeed.md:387 |
Механизм подстановки¶
T-SQL ветка (TSqlContent)¶
Провайдеры сканируют текст T-SQL на наличие своих имён параметров (AddNeededQueryParams) и добавляют ObjectParameter[]:
ExpressionParamsProvider—@EventParam0..@EventParamNRawParamsProvider—@eventParamRaw0..@eventParamRawNCycleExpressionVarsProvider—@cycle_value,@cycle_idxExpressionVarsProvider— именованные переменные из результатов предыдущих действий пакета
ESQL ветка (XML Content)¶
XSLT-трансформация ExpressionXmlToESQL.xslt генерирует ESQL-строку. Затем WrapCommandTextInContext() оборачивает в:
SELECT value (<expr>) FROM Tasks as t WHERE t.TaskID = @ContextID
XML-узлы и соответствующие провайдеры:
| XML-узел | Результат в SQL |
|---|---|
<eventparameter index="N"> |
@EventParamN |
<cyclevariable name="X"> |
@cycle_value / @cycle_idx |
<variable name="X"> |
@X_ (результат действия пакета) |
Источник: docs/domains/smart-filters/backend.md:134–137
Примеры контекстов¶
SmartExpression T-SQL: расчёт срока по контекстной задаче¶
SELECT
CASE
WHEN Extparam84NativeValue IS NOT NULL
AND Extparam71NativeValue > GETDATE()
THEN dbo.tc_AddWorkingDays(Extparam71NativeValue, 1)
ELSE dbo.tc_AddWorkingDays(GETDATE(), 1)
END
FROM TasksInSubcat21Denormalized
WHERE Taskid = @ContextID
Источник: docs/domains/smart-actions/academy-patterns.md:300–313
SmartExpression T-SQL: проверка акцептантов подписи¶
Для акцептантов контекст задачи передаётся через @eventParam0 (не @ContextId):
if exists (
select u.UserID
from TasksInSubcat22Denormalized t22 (nolock)
join ExtParamSelectUsersValues epvu (nolock)
on t22.TaskID = epvu.TaskID and epvu.ExtParamID = 76
join Users u (nolock)
on u.UserID = epvu.UserID
where t22.TaskID = @ContextId -- ← обычный контекст
and u.IsFired_2 = 0
)
select 1
else
select 0
Для случая подписи: параметр задачи —
@eventParam0, не@ContextId.
Источник: docs/domains/smart-actions/academy-patterns.md:331–352
SmartExpression T-SQL: циклический пакет¶
select ExtParam1567NativeValue
from TasksInSubcat1725Denormalized
where taskid = try_cast(@cycle_value as int)
@cycle_value — текущий элемент итератора (string). Используется try_cast, так как тип итератора — string.
Источник: docs/domains/smart-filters/backend.md:78–80
ESQL ветка (XML Content): сравнение параметра события с полем задачи¶
<?xml version="1.0" encoding="utf-16"?>
<smartfilter>
<property name="TaskID" />
<operator key="eq" />
<eventparameter index="1" />
</smartfilter>
Результат ESQL: t.[TaskID] = @EventParam1, обёрнутый в:
SELECT value (t.[TaskID] = @EventParam1) FROM Tasks as t WHERE t.TaskID = @ContextID
Источник: docs/domains/smart-filters/backend.md:56–70
ДП Lookup: смарт-фильтр с контекстными параметрами¶
При открытии карточки задачи SmartFilter ДП Lookup получает:
@eventParam1— ID текущей категории (SubcatId)@eventParam2— ID задачи-источника (TaskId)@eventParam3— JSON значений строки таблицы (если Lookup в колонке ДП Таблица)@eventParam4— ID блока
Источник: docs/domains/ext-params/lookup/settings-reference.md:35–38
Событие «Открытие задачи»: нетипичное использование @eventParam¶
Событие WhenOpenTask передаёт контекст открытия в @eventParam1 (не @eventParam0). @eventParam0 у данного события не используется — нетипичное поведение.
Источник: docs/domains/smart-actions/known-issues.md:64
Ограничения¶
-
@ContextIDв фильтре расписания. Фильтр расписания — T-SQL, возвращающий список задач (не boolean).@ContextIDв нём не имеет смысла: нет «текущей задачи». ЕслиWHERE TaskID = @ContextIDостался от конвертации смарт-выражения в TSQL — убрать. Источник:docs/domains/smart-actions/action-package-pitfalls.md:101 -
@EventParam{N}доступен только при наличии eventId.ExpressionParamsProviderсоздаётся только еслиeventId.HasValue. В SE без привязки к событию@EventParamN— не подставляется. Источник:docs/domains/smart-filters/backend.md:150 -
@cycle_valueи@cycle_idx— только в циклическом пакете.CycleExpressionVarsProviderсоздаётся только приActionPackContext.CycleContext != null. В обычном пакете эти переменные недоступны. Источник:docs/domains/smart-filters/backend.md:182–185 -
@cycle_value— строка, не int. Типstring; при использовании как ID задачи применятьtry_cast(@cycle_value as int). Источник:docs/domains/smart-filters/backend.md:254 -
@cycle_valueне может быть null. Если итератор возвращает null-элемент —CycleExpressionVarsProviderвыбрасываетArgumentNullException(известная ошибка, не пофиксена). Источник:docs/domains/smart-filters/backend.md:263–283 -
@CurrentSessionUserID— текстовая замена в ShowTasksFeed. В SmartExpression это SQL-параметр. В SPShowTasksFeedон текстово заменяется на@UserID(строка 263 SP) до вызоваsp_executesql. Источник:docs/domains/grids/showtasksfeed.md:381 -
generateDummyParams: trueподставляет@ContextId = -1. При тестировании SE через Admin API с этим флагом JOIN на контекстную задачу вернёт пустой результат, но синтаксическая валидация пройдёт. Источник:docs/domains/smart-filters/admin.md:182,206 -
Регистр переменных. В T-SQL-ветке провайдеры сканируют текст без учёта регистра (
@ContextID,@ContextId,@contextid— одно и то же). В ESQL-ветке регистр определяется XSLT. На практике — писать как угодно, платформа найдёт.
Связанные документы¶
- academy-patterns.md — практические паттерны SmartExpressions и T-SQL
- admin.md — настройка SmartActions, событий, пакетов
- ../smart-filters/backend.md — провайдеры параметров, XSLT, ESQL-механика
- ../smart-filters/admin.md — Admin API, тестирование SE, dummy params
- ../ext-params/lookup/settings-reference.md — контекстные @eventParam в ДП Lookup
- ../grids/showtasksfeed.md — CustomFlex SQL параметры, @CurrentSessionUserID
Review log¶
(Заполнит main Claude при ревью.)