Перейти к содержанию

Настройки переходов: полный справочник

Контекст: Тимонов отметил отсутствие документации по флагу «Разрешить ставить дату начала работы в прошлом» --- этот справочник закрывает пробел


Обзор

Каждый переход в маршруте категории --- это строка в таблице 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

  1. CK_StatesRoutesInSubcat --- CycleApproval = 0 OR TransparentApproval = 0. Нельзя одновременно включить сквозное и разовое согласование.
  2. CK_StatesRoutesInSubcat_1 --- TermDateSourceExtParamID IS NULL OR TermMinutes IS NULL. Срок перехода задаётся либо в минутах, либо из ДП --- не одновременно.

Вкладки настройки перехода (UI)

Кроме описанных выше колонок, у каждого перехода есть вкладки в админке:

Вкладка Что настраивает Связанная таблица
Настройки Все колонки StatesRoutesInSubcat (эта страница) ---
Подзадачи на переходе Автосоздание подзадач/связанных задач с синхронизацией ДП StepSubTask
Подписи на переходе Запрос подписей, список акцептантов StatesRoutesSignatures
Доп. параметры Ограничения доступа к ДП при переходе StepExtParamRestrictions
Действия с ДП Формирование файлов по шаблону (настройки в ActionsWithExtParams)
Смарты на переходе Смарт-действия на событиях «Перед переходом» и «После перехода» (через event-систему)

Последовательность действий при переходе

При нажатии кнопки перехода система выполняет шаги (сокращённо):

  1. Проверка статуса подзадач
  2. Проверка прав пользователя (по флагам OwnerOnly, UserOnly, ForAdmin, ForPerfRight, ForAddRight, ForResponsiblePerformer, ForViewver, VisibilitySmartFilterID)
  3. Проверка обязательных ДП (ExtParamsInSubcatValidatorStep)
  4. Проверка динамических подписей
  5. Выполнение смартов «перед сменой статуса»
  6. Запрос подписей (если настроены)
  7. Запрос комментария (если ForceComment = 1)
  8. Выполнение перехода, запись в StepLog
  9. Действия с датой начала работы (TaskStartTimeAction)
  10. Действия с текстом задачи (ChangeTaskText + ChangeTaskTextTemplate)
  11. Сброс срока (если ResetDueTime = 1)
  12. Назначение автоисполнителя
  13. Текст подтверждения (ConfirmText)
  14. Уведомления
  15. Создание подзадач на переходе
  16. Хранимая процедура (StoredProcedures)
  17. Смарты «после перехода»
  18. Обновление денормализации

Принудительная смена статуса (через редактирование поля «Статус» администратором) не выполняет этот маршрут и пропускает все автоматизации.


Полезные запросы

Все переходы категории:

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


Связанные документы