Настройки переходов: полный справочник¶
Каждый переход в маршруте категории — это строка в таблице dbo.StatesRoutesInSubcat. Переход определяет: из какого статуса в какой идёт задача, кто видит кнопку, что происходит автоматически при нажатии. Настройки перехода доступны в админке: Категория → Бизнес-процесс → Маршрут → клик на переход → вкладка «Настройки». Первичный ключ — StepID (автоинкремент), переход привязан к категории (SubcatID). Документ описывает все колонки таблицы StatesRoutesInSubcat, связанные таблицы, CHECK-ограничения, UI-вкладки, последовательность действий при переходе и полезные SQL-запросы.
Таблица StatesRoutesInSubcat — все колонки¶
Идентификация и маршрут¶
Идентификаторы перехода и его привязка к статусам и категории:
| Колонка | Тип | По умолчанию | UI-название | Описание |
|---|---|---|---|---|
StepID |
INT (PK, IDENTITY) | авто | Переход | Уникальный ID перехода |
StateID |
INT (FK → States) | — | Из статуса | Статус-источник |
StateNextID |
INT (FK → States) | — | В статус | Целевой статус |
SubcatID |
INT (FK → Subcategories) | — | — | Категория, которой принадлежит переход. CASCADE DELETE |
ActionID |
INT (FK → Actions, NULL) | NULL | Право (легаси, скрыта с 2.268.x) | ID действия из dbo.Actions. До 2.268.x значение Actions.Description отображалось в админском гриде переходов категории (/spa/administration/subcategory-route-states/{subcatId}) в колонке «Право». Колонка скрыта как неинформативная: значение не отражает реальные настройки прав на переходе — они задаются через карточку перехода, роли (BpRoles/BpRolesSteps) и переопределение доступа категории. Прямые правки StatesRoutesInSubcat.ActionID в БД на отображение в админке не влияют. Само поле БД сохранено для обратной совместимости. |
GUID |
UNIQUEIDENTIFIER | newsequentialid() | — | Глобальный идентификатор для миграции |
OrderId |
INT (NULL) | NULL | Порядок кнопки перехода | Порядок отображения кнопок на карточке задачи |
row_version |
ROWVERSION | авто | — | Версия строки для оптимистичной блокировки |
В выпадающих списках «Из статуса» (StateID) и «В статус» (StateNextID) каждый статус отображается в формате «Название (ID): Описание» — название, идентификатор в круглых скобках и описание (поле Description таблицы States). Если у статуса описание не заполнено, отображается только «Название (ID)». Формат единообразен в выпадающем списке и в значении поля после сохранения перехода.
Поле «Произвольный статус начала маршрута» категории использует тот же формат — см. business.md § Статусы задач.
Название и подсказки¶
Текст кнопки перехода и всплывающие подсказки:
| Колонка | Тип | По умолчанию | UI-название | Описание |
|---|---|---|---|---|
StepDescr |
VARCHAR(100) | — | Название кнопки | Текст кнопки перехода на карточке задачи |
StepToolTip |
VARCHAR(400) | NULL | Подсказка для кнопки | Всплывающая подсказка при наведении |
StepOwnerToolTip |
VARCHAR(400) | NULL | Подсказка для заказчика | Подсказка, видимая только заказчику задачи |
StepUserToolTip |
VARCHAR(400) | NULL | Подсказка для исполнителя | Подсказка, видимая только исполнителю задачи |
LocalizedStepDescrId |
INT (FK → LocalizedBusinessObjects, NULL) | NULL | (мультиязычность) | Локализованное название кнопки |
LocalizedStepTooltipId |
INT (FK, NULL) | NULL | (мультиязычность) | Локализованная подсказка кнопки |
LocalizedStepOwnerTooltipId |
INT (FK, NULL) | NULL | (мультиязычность) | Локализованная подсказка для заказчика |
LocalizedStepUserTooltipId |
INT (FK, NULL) | NULL | (мультиязычность) | Локализованная подсказка для исполнителя |
LocalizedConfirmTextId |
INT (FK, NULL) | NULL | (мультиязычность) | Локализованный текст подтверждения |
Автоисполнитель¶
Автоматическое назначение исполнителя при переходе:
| Колонка | Тип | По умолчанию | UI-название | Описание |
|---|---|---|---|---|
IsButtonPresserAutoPerformer |
BIT | 0 | Автоисполнитель: «Нажавший кнопку» | Нажавший кнопку перехода автоматически назначается исполнителем |
AutoPerformerSignatureID |
INT (NULL) | NULL | Автоисполнитель (роль) | ID роли, члены которой назначаются исполнителями на данном шаге |
AutoPerformerSourceExtParamID |
INT (FK → ExtParams, NULL) | NULL | Автоисполнитель берётся из ДП | Сотрудник из указанного ДП назначается исполнителем. ДП должен быть типа «выпадающий список» с ID пользователя |
AutoperformerAssingAction |
INT (NULL) | NULL | Действия при автоматическом назначении исполнителя | Определяет поведение при назначении автоисполнителя (значения: 1 — удалять старых и назначать ответственным, 2 — не удалять старых, не назначать ответственным, 3 — не удалять старых, назначать ответственным, 4 — удалять из исполнителей и подписчиков, назначить ответственным) |
AutoAssignCustomer |
BIT | 0 | Назначить заказчика исполнителем | При переходе заказчик задачи назначается исполнителем |
Сроки и время¶
Срок этапа и его источник:
| Колонка | Тип | По умолчанию | UI-название | Описание |
|---|---|---|---|---|
TermMinutes |
INT (NULL) | NULL | Срок перехода | Время на выполнение этапа (в минутах). Отображается в скобках на кнопке перехода |
TermDateSourceExtParamID |
INT (FK → ExtParams, NULL) | NULL | Срок перехода берётся из ДП | Значение ДП задаёт срок перехода. Взаимоисключающе с TermMinutes (CHECK constraint) |
OnOverduePerformStepID |
INT (FK → StatesRoutesInSubcat, NULL) | NULL | Альтернативный переход (выполнить когда просрочен) | Переход, выполняемый автоматически по истечении TermMinutes. Если не задан — просроченный срок отображается красным |
ResetDueTime |
BIT | 0 | Сбросить срок | При переходе поле «Срок» очищается. В просроченных задачах запрашивается причина |
RequireChangeDateBefore |
BIT | 0 | Требовать смену срока перед переходом | Перед переходом появляется окно смены срока задачи |
Дата начала работы¶
Что происходит с полем «Дата начала работы» при переходе:
| Колонка | Тип | По умолчанию | UI-название | Описание |
|---|---|---|---|---|
TaskStartTimeAction |
TINYINT | 0 | Действие с датой начала работы | Что делать с полем «Дата начала работы» при переходе. Значения: 0 = Не менять, 1 = Очищать, 2 = Заполнять текущим временем, 3 = Заполнять текущим временем, если пустая |
AskPermissionToPerformTSTAction |
BIT | 0 | Запрашивать подтверждение действия с датой начала работы | Если включено, при переходе у пользователя запрашивается подтверждение для изменения даты начала работы |
Важно: «Разрешить ставить дату начала работы в прошлом» — это настройка категории (Subcategories.AllowSetStartTimeInPast), а не перехода. См. раздел ниже.
Согласование и подписи¶
Поведение согласования и подписей на переходе:
| Колонка | Тип | По умолчанию | UI-название | Описание |
|---|---|---|---|---|
TransparentApproval |
BIT | 0 | Сквозное согласование | Переход выполняется вне зависимости от решения акцептантов. Взаимоисключающе с CycleApproval (CHECK constraint) |
CycleApproval |
BIT | 0 | Разовое согласование | Акцептант, давший положительную резолюцию, не получает повторный запрос подписи на новом цикле. Процесс продолжается, пока все подписи не акцептованы |
RequestDirectorSignatureOnReject |
BIT | 0 | Эскалировать при отклонении | При отклонении подписи запрашивается подпись руководителя отклонившего |
DisallowRevisionsOnSign |
BIT | 0 | Запретить отправлять на согласование документы с непринятыми правками | Если вложен файл с непринятыми правками, подпись не запрашивается — показывается предупреждение |
RemoveCommentsOnSignWhenEP |
INT (NULL) | NULL | Удалять примечания из docx, когда проставлен ДП | Если вложен docx с примечаниями и значение указанного ДП ненулевое, примечания удаляются из файла |
Текст и подтверждение¶
Комментарии, подтверждение и автогенерация текста задачи:
| Колонка | Тип | По умолчанию | UI-название | Описание |
|---|---|---|---|---|
ForceComment |
BIT | 0 | Требовать написания комментария при переходе | Перед переходом отображается окно «Требуется комментарий». Переход заблокирован, пока комментарий не введён. Введённый текст сохраняется в ленте задачи как обычный комментарий автора перехода и одновременно передаётся в поле «Причина запроса» (TaskSignatures.Reason) всех подписей, запрошенных на этом переходе. Для аналогичного поведения на стороне подписи (только обрабатываемой) — опция RequestReasonOnAccept в StatesRoutesSignatures, см. бизнес-документацию подписей |
ConfirmText |
VARCHAR(200) | NULL | Текст подтверждения | Комментарий, добавляемый в задачу после перехода |
StepConfirmationMode |
INT | 0 | Режим подтверждения | Режим текста подтверждения: 0 = Нет подтверждения, 1 = Фиксированное значение (используется ConfirmText), 2 = Смарт-выражение (используется StepConfirmationSmartExpressionId) |
StepConfirmationSmartExpressionId |
INT (FK → SmartExpressions, NULL) | NULL | Смарт-выражение для подтверждения | Смарт-выражение, генерирующее текст подтверждения (при StepConfirmationMode = 2) |
ChangeTaskText |
BIT | 0 | Изменить текст задачи | При переходе текст задачи меняется по шаблону из ChangeTaskTextTemplate |
ChangeTaskTextTemplate |
NVARCHAR(MAX) | NULL | Шаблон для автогенерации текста задачи | Шаблон с макросами $ExtНомерДП и $Text. Работает только при включённом ChangeTaskText |
Видимость кнопки и права¶
Кому видна кнопка перехода:
| Колонка | Тип | По умолчанию | UI-название | Описание |
|---|---|---|---|---|
HiddenStep |
BIT (NULL) | 0 | Кнопка скрыта | Кнопка не отображается на карточке задачи. Переход доступен только программно, через смарты или через ленту основного маршрута (если переход входит в основной маршрут). API: параметр HiddenStep в DTO обязателен как bool (не nullable). При создании перехода через POST /api/admin/subcategories/steps без указания HiddenStep применяется false. В БД колонка остаётся BIT NULL DEFAULT(0), но бэкенд гарантирует запись 0 при отсутствии значения. |
OwnerOnly |
BIT | 0 | Для заказчика | Кнопка видна только заказчику задачи |
UserOnly |
BIT | 0 | Для пользователя | Кнопка видна только назначенному исполнителю |
ForAdmin |
BIT | 0 | Для администратора | Кнопка видна только администраторам категории |
ForViewver |
BIT | 0 | Для просматривающего | Кнопка видна пользователям с правом «Просмотр всех задач» |
ForPerfRight |
BIT | 0 | Для права «Исполнять» | Кнопка видна пользователям с правом «Исполнять» |
ForAddRight |
BIT | 0 | Для права «Создавать» | Кнопка видна пользователям с правом «Создавать» |
ForResponsiblePerformer |
BIT | 0 | Для ответственного исполнителя | Кнопка видна только ответственному исполнителю (при мультизавершении) |
VisibilitySmartFilterID |
INT (FK → SmartExpressions, NULL) | NULL | Смарт-фильтр видимости кнопки | Смарт-выражение, определяющее видимость кнопки. Если результат false — кнопка скрыта |
По умолчанию (все флаги = 0, смарт-фильтр = NULL) кнопка перехода видна пользователям с правом «Исполнять» в категории.
Автоматизация¶
Автоматическое выполнение перехода и хранимые процедуры:
| Колонка | Тип | По умолчанию | UI-название | Описание |
|---|---|---|---|---|
AutoPerformStepOnSubtasksClose |
BIT | 0 | Автоматически делать переход при завершении всех подзадач | Переход выполняется автоматически, когда все подзадачи в текущем статусе завершены |
IsAutoPerfomedOnPostTask |
BIT | 0 | (Шаг при постановке) | Переход выполняется автоматически после создания задачи. Только один переход в категории может иметь этот флаг (UNIQUE filtered index). Пользователь должен иметь право на переход |
StoredProcedures |
VARCHAR(100) | NULL | Процедура при переходе (SQL) | Имя хранимой процедуры, вызываемой при переходе. Параметр: @TaskID int. Использование — только после сертификации |
Уведомления¶
Почтовые и внутренние уведомления при переходе:
| Колонка | Тип | По умолчанию | UI-название | Описание |
|---|---|---|---|---|
DisableMail |
BIT | 0 | Отключить посылку писем | Почтовые уведомления не отправляются при выполнении перехода |
NotifyUsersInSubcat |
BIT | 0 | Уведомить пользователей в категории | Уведомление о переходе отправляется всем, кто имеет право просмотра задач в категории |
NotifyUsersInSubcatGroupID |
INT (NULL) | NULL | Только группу | Ограничивает уведомление указанной группой (работает при NotifyUsersInSubcat = 1) |
NotifyUsersInSubcatText |
VARCHAR(8000) | NULL | Текст уведомления | Текст уведомления для пользователей, не подписанных на задачу |
Основной маршрут¶
Принадлежность перехода к основному (эталонному) маршруту:
| Колонка | Тип | По умолчанию | UI-название | Описание |
|---|---|---|---|---|
IsMainRouteStep |
BIT | 0 | Основной маршрут | Переход входит в основной (эталонный) маршрут. Основной маршрут визуализируется лентой на карточке задачи |
IsMainRouteAvailable |
BIT | 0 | Доступен через Ленту маршрута | Устаревшая настройка. Определяла, можно ли выполнить переход через ленту основного маршрута |
Побочные эффекты¶
Прочие эффекты перехода:
| Колонка | Тип | По умолчанию | UI-название | Описание |
|---|---|---|---|---|
DoSetComplainted |
BIT | 0 | Становится обжалованной | После перехода исполнители, ранее завершившие задачу, перестают отображаться зачёркнутым — задача снова видна в «Мои задачи». Дублирует глобальную настройку — действует, если хотя бы одна из двух включена |
ActionsWithExtParams |
INT | 0 | Действия с ДП | Количество настроенных действий с ДП (формирование файлов по шаблону). Значение > 0 = есть действия |
RedirectUrlAfterStepSmartExpressionID |
INT (FK → SmartExpressions, NULL) | NULL | Перейти по ссылке после перехода | Смарт-выражение, генерирующее URL. После перехода браузер откроет эту ссылку. Может возвращать номер задачи (откроется карточка) или строку-URL в кавычках |
Матрица доступа к ДП¶
Управление доступом к ДП на переходе через матрицу доступа к сущностям задачи:
| Колонка | Тип | По умолчанию | UI-название | Описание |
|---|---|---|---|---|
TaskEntityPermissionControl |
BIT | 0 | Права по матрице доступа | Включает управление правами на ДП через матрицу доступа для этого перехода |
TaskEntityPermissionSetID |
INT (FK → TaskEntityPermissionsSet, NULL) | NULL | Набор прав доступа | ID набора прав, определяющего доступ к ДП на данном переходе |
Связанная настройка категории: «Разрешить ставить дату начала работы в прошлом»¶
Настройка «Разрешить ставить дату начала работы в прошлом» относится к категории, а не к переходу, поэтому вынесена отдельно.
Таблица: dbo.Subcategories
Колонка: AllowSetStartTimeInPast (BIT, по умолчанию 0)
Добавлена: в версии v2.267
Что контролирует: разрешает или запрещает устанавливать дату начала работы (TaskStartTime) раньше даты создания задачи (CreationDate). Если флаг выключен (по умолчанию) и пользователь пытается поставить дату начала работы в прошлом — система блокирует это.
Где найти в UI: Настройки категории → раздел сроков.
Связанный флаг: AllowSetTimeParamsInPast (тоже в Subcategories) — разрешает ставить срок (DueDate) в прошлом. При добавлении AllowSetStartTimeInPast начальное значение инициализируется из AllowSetTimeParamsInPast (миграция копирует значение).
Логика проверки:
Если новая дата начала < даты создания задачи И AllowSetStartTimeInPast = false
→ блокировка с ошибкой
Проверка срабатывает при ручном изменении даты начала, при изменении через переход (когда TaskStartTimeAction = 2, «Заполнять текущим временем») и при создании задачи через чат.
Связанные таблицы и CHECK-ограничения¶
Переход связан с несколькими таблицами:
| Таблица | Связь | Что хранит |
|---|---|---|
StatesRoutesSignatures |
FK StepID → StepID | Подписи на переходе |
StepSubTask |
FK StepID → StepID | Подзадачи, создаваемые при переходе |
StepExtParamRestrictions |
FK StepId → StepID | Ограничения доступа к ДП на переходе |
ExtParamsInSubcatValidatorStep |
FK StepId → StepID | Обязательные ДП при переходе |
BpRolesSteps |
FK StepId → StepID | Роли на переходе (вход/выход/условие) |
StepLog |
FK StepId → StepID | Журнал выполнения переходов |
TaskSignaturesQueue |
FK StepID → StepID | Очередь запрошенных подписей |
StatesRoutesSignaturesService |
FK Id → StepID | Настройки сервиса подписей на переходе |
SmartExpressions |
FK через VisibilitySmartFilterID, RedirectUrlAfterStepSmartExpressionID, StepConfirmationSmartExpressionId | Смарт-выражения |
CHECK-ограничения, наложенные на таблицу StatesRoutesInSubcat:
CK_StatesRoutesInSubcat—CycleApproval = 0 OR TransparentApproval = 0. Нельзя одновременно включить сквозное и разовое согласование.CK_StatesRoutesInSubcat_1—TermDateSourceExtParamID IS NULL OR TermMinutes IS NULL. Срок перехода задаётся либо в минутах, либо из ДП — не одновременно.
Вкладки настройки перехода (UI)¶
Кроме описанных выше колонок, у каждого перехода есть вкладки в админке:
| Вкладка | Что настраивает | Связанная таблица |
|---|---|---|
| Настройки | Все колонки StatesRoutesInSubcat (эта страница) |
— |
| Подзадачи на переходе | Автосоздание подзадач/связанных задач с синхронизацией ДП | StepSubTask |
| Подписи на переходе | Запрос подписей, список акцептантов | StatesRoutesSignatures |
| Доп. параметры | Ограничения доступа к ДП при переходе | StepExtParamRestrictions |
| Действия с ДП | Формирование файлов по шаблону | (настройки в ActionsWithExtParams) |
| Смарты на переходе | Смарт-действия на событиях «Перед переходом» и «После перехода» | (через event-систему) |
Последовательность действий при переходе¶
При нажатии кнопки перехода система выполняет шаги (сокращённо):
- Проверка статуса подзадач
- Проверка прав пользователя (по флагам
OwnerOnly,UserOnly,ForAdmin,ForPerfRight,ForAddRight,ForResponsiblePerformer,ForViewver,VisibilitySmartFilterID) - Проверка обязательных ДП (
ExtParamsInSubcatValidatorStep) - Проверка динамических подписей
- Выполнение смартов «перед сменой статуса»
- Запрос подписей (если настроены)
- Запрос комментария (если
ForceComment = 1) - Выполнение перехода, запись в
StepLog - Действия с датой начала работы (
TaskStartTimeAction) - Действия с текстом задачи (
ChangeTaskText+ChangeTaskTextTemplate) - Сброс срока (если
ResetDueTime = 1) - Назначение автоисполнителя
- Текст подтверждения (
ConfirmText) - Уведомления
- Создание подзадач на переходе
- Хранимая процедура (
StoredProcedures) - Смарты «после перехода»
- Обновление денормализации
Принудительная смена статуса (через редактирование поля «Статус» администратором) не выполняет этот маршрут и пропускает все автоматизации.
Полезные запросы и связанные документы¶
Все переходы категории:
SELECT s.StepID, st1.Description AS [Из], st2.Description AS [В], s.StepDescr AS [Кнопка],
s.HiddenStep, s.TaskStartTimeAction, s.AutoPerformStepOnSubtasksClose
FROM StatesRoutesInSubcat s
JOIN States st1 ON st1.StateID = s.StateID
JOIN States st2 ON st2.StateID = s.StateNextID
WHERE s.SubcatID = @SubcatID
ORDER BY s.OrderId, s.StepID
Переходы с автодействиями по дате начала работы:
SELECT s.StepID, s.StepDescr, s.TaskStartTimeAction, s.AskPermissionToPerformTSTAction
FROM StatesRoutesInSubcat s
WHERE s.SubcatID = @SubcatID AND s.TaskStartTimeAction > 0
Категории с разрешённой датой начала в прошлом:
SELECT SubcatID, Description
FROM Subcategories
WHERE AllowSetStartTimeInPast = 1
Связанные документы:
- Маршруты и статусы (бизнес) — обзор маршрутов
- Настройки перехода — описание настроек с иллюстрациями
- Подписи на переходах
- Подзадачи на переходе
- Смарты на переходе