Настройки переходов: полный справочник¶
Контекст: Тимонов отметил отсутствие документации по флагу «Разрешить ставить дату начала работы в прошлом» --- этот справочник закрывает пробел
Обзор¶
Каждый переход в маршруте категории --- это строка в таблице dbo.StatesRoutesInSubcat. Переход определяет: из какого статуса в какой идёт задача, кто видит кнопку, что происходит автоматически при нажатии.
Настройки перехода доступны в админке: Категория -> Бизнес-процесс -> Маршрут -> клик на переход -> вкладка «Настройки».
Первичный ключ --- StepID (автоинкремент). Переход привязан к категории (SubcatID).
Таблица 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 | --- | ID действия (таблица Actions). Используется редко |
GUID |
UNIQUEIDENTIFIER | newsequentialid() | --- | Глобальный идентификатор для миграции |
OrderId |
INT (NULL) | NULL | Порядок кнопки перехода | Порядок отображения кнопок на карточке задачи |
row_version |
ROWVERSION | авто | --- | Версия строки для оптимистичной блокировки |
Название и подсказки¶
| Колонка | Тип | По умолчанию | 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 | Действие с датой начала работы | Enum TaskStartTimeStepActions --- что делать с полем «Дата начала работы» при переходе. Значения: 0 = Не менять (None), 1 = Очищать (Clear), 2 = Заполнять текущим временем (SetCurrent), 3 = Заполнять текущим временем, если пустая (SetCurrentIfEmpty) |
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 | Требовать написания комментария при переходе | Перед переходом отображается окно ввода комментария. Переход заблокирован, пока комментарий не введён |
ConfirmText |
VARCHAR(200) | NULL | Текст подтверждения | Комментарий, добавляемый в задачу после перехода |
StepConfirmationMode |
INT | 0 | Режим подтверждения | Enum StepConfirmationMode: 0 = Нет подтверждения (None), 1 = Фиксированное значение (Value) --- используется ConfirmText, 2 = Смарт-выражение (Smart) --- используется 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, default 0)
Миграция: v2.267, скрипт 1772710842.2054846-add-AllowSetStartTimeInPast.sql
Что контролирует: разрешает или запрещает устанавливать дату начала работы (TaskStartTime) раньше даты создания задачи (CreationDate). Если флаг выключен (по умолчанию) и пользователь пытается поставить дату начала работы в прошлом --- система блокирует это.
Где найти в UI: Настройки категории -> раздел сроков.
Связанный флаг: AllowSetTimeParamsInPast (тоже в Subcategories) --- разрешает ставить срок (DueDate) в прошлом. При добавлении AllowSetStartTimeInPast начальное значение инициализируется из AllowSetTimeParamsInPast (миграция копирует значение).
Логика проверки (из кода):
Если newStartTime < taskCreationDate И AllowSetStartTimeInPast = false
→ блокировка с ошибкой
Проверка выполняется в трёх местах:
- Task.cs --- при ручном изменении даты начала
- TaskActionService.cs --- при изменении через переход (когда TaskStartTimeAction = SetCurrent)
- ChatManageService.cs --- при создании задачи через чат
Связанные таблицы¶
| Таблица | Связь | Что хранит |
|---|---|---|
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 constraints¶
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
Связанные документы¶
- Маршруты и статусы (бизнес) --- обзор маршрутов
- Настройки перехода --- описание настроек с иллюстрациями
- Подписи на переходах
- Подзадачи на переходе
- Смарты на переходе