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

Подписи — Администрирование

Обзор

Домен signatures охватывает настройку подписей (согласований), типов резолюций, привязку подписей к шагам маршрута и подключение ЭЦП (КриптоПро, DSS). Администрирование использует:

  • Автоадминка (dbadmin) -- 5 форм (подписи, резолюции, группы подписей, КриптоПро, DSS)
  • Кастомная форма AdminSPA -- выбор плагина ЭЦП (/spa/administration/eds-plugin-settings, v2.268+)
  • Admin API -- 3 контроллера (управление подписями, привязка к шагам маршрута, настройка плагина ЭЦП)

Механизмы администрирования

Автоадминка (dbadmin)

Alias формы Название Таблица БД Полей Секций Папка
signatures Подписи dbo.Signatures 3 1 Категории и процессы
signature-resolution-types Типы резолюций dbo.SignatureResolutionTypes 13 1 Служебное
equal-users-for-signature Подписи группы dbo.EqualUsersForSignature 6 1 Служебное
cryptopro-verification-centers КриптоПро dbo.CryptoProCertificationCenters 6 1 Подключения
dsscryptopro-service-settings Сервис DSSCryptoPro dbo.DSSCryptoProCredentials 14 1 Подключения

Кастомная форма AdminSPA

Страница Роут Назначение
КриптоПро: Выбор плагина /spa/administration/eds-plugin-settings Выбор плагина ЭЦП: CryptoPro / RuToken / DefineOnClient (v2.268+)

Admin API контроллеры

Контроллер Маршрут Методы Назначение
SignaturesController /api/admin/signatures GET, POST, DELETE CRUD подписей, привязка резолюций
StepSignatureController /api/admin/subcat/step/signatures GET, POST, DELETE Подписи на шагах маршрута, SQL-маршруты
EdsPluginController /api/admin/eds/plugin GET, PUT Настройки плагина ЭЦП (глобально, по категории, по группе)

Подробная спецификация эндпоинтов -- см. backend.md разделы 1.3--1.4.

Ключевые настройки

Подписи (Signatures)

Где настраивается: автоадминка -> форма signatures / Admin API -> SignaturesController Таблица БД: dbo.Signatures

Подпись -- базовая сущность согласования. Форма содержит всего 3 поля (имя, описание, тип), основная настройка идёт через Admin API. В UI карточки задачи должностные и личные подписи запрашиваются на разных вкладках (см. business.md секция «Должностные и личные»).

Эндпоинт Назначение
POST /api/admin/signatures Создание подписи
GET /api/admin/signatures/{id} Карточка подписи
GET /api/admin/signatures/{id}/resolutions Список привязанных резолюций
POST .../resolutions/add Привязать резолюцию
POST .../resolutions/remove Отвязать резолюцию
GET .../subcategories Где используется подпись

Типы резолюций (SignatureResolutionTypes)

Где настраивается: автоадминка -> форма signature-resolution-types Таблица БД: dbo.SignatureResolutionTypes

13 полей, определяющих поведение каждого типа решения (Согласовано, Отклонено, На доработку и т.д.):

Группа полей Что контролирует
Имя, описание Отображение в UI
Тип действия Accept / Reject / Delegate / Escalate и т.д.
Цвет, иконка Визуальное оформление
Требует комментарий Обязательность текста при резолюции
Влияет на статус Автоматический переход задачи при резолюции

Эффект в runtime: проверяется SignatureResolutionConfigurationService при обработке резолюции в TaskSignaturesController.

Подписи на шагах маршрута (StepSignatures)

Где настраивается: Admin API -> StepSignatureController Маршрут: /api/admin/subcat/step/signatures

Привязка подписей к переходам между статусами (шагам маршрута). Ключевые возможности:

Эндпоинт Назначение
GET .../step/{stepId}/id/{stepSignatureId} Детальная настройка подписи на переходе
POST /api/admin/subcat/step/signatures Добавление подписи на переход
GET .../route-from-sql SQL-маршрут (динамическое определение акцептантов)
POST .../route-from-sql Обновление SQL-маршрута
POST .../step/{stepId}/add-owner-signature Быстрое добавление подписи заказчика

Связь с categories: привязка подписей к маршрутам -- часть настройки категории, но управляется отдельным контроллером.

Справочник body-форматов

Создание шаблона подписи (POST /api/admin/signatures):

DTO: SignatureCreateRequestDto — всего 2 поля.

{ "name": "TM_Signature", "canBeDynamic": true }

Ответ: { "data": 2460 } — ID созданной подписи.

Обновление шаблона (POST /api/admin/signatures/{id}):

DTO: SignatureDto (полный DTO, аналогичный ответу GET). Ключевые поля:

{
  "id": 2460,
  "description": "TM_Signature",
  "canBeDynamic": true,
  "acceptorsEvalutionBaseUser": "Owner",
  "acceptorsEvalutionMethod": "ByGroup",
  "actionIfNotSigned": 0,
  "signatureAcceptorsByGroups": [
    { "groupId": 2085, "aceptorUsers": [], "aceptorGroups": [] }
  ]
}

Ответ: 204 No Content.

Привязка подписи к шагу маршрута (POST /api/admin/subcat/step/signatures):

DTO: StepSignaturePayloadDto — 30+ полей. Минимальный рабочий body:

{
  "StepId": 216570,
  "SignatureId": 2460,
  "IsNecessary": true,
  "SignatureOrder": 1,
  "Enabled": true,
  "AcceptorsEvalutionBaseUser": 0,
  "Description": "",
  "IsSignRestriction": false,
  "IsSignInfo": false,
  "IsOwnerSignature": false,
  "IsEds": false,
  "StepsIfNotSigned": [],
  "StepSignExtParamsIdForRestriction": [],
  "StepSignExtParamsIdForInfo": [],
  "StepSignatureConditions": [],
  "EdsSignSettings": []
}

Ответ: 200 OK с полным StepSignatureDto (+ поле id — stepSignatureId).

Gotchas: - StepId — это PK из таблицы StatesRoutesInSubcat (не StateID!). Поиск: SELECT StepID, StateID, StateNextID, StepDescr FROM StatesRoutesInSubcat WHERE SubcatID = X - AcceptorsEvalutionBaseUser — число (0=Owner, 1=Performer, 2=ResponsiblePerformer, 3=Requester, 4=SmartExpression), не строка - SignatureOrder — этап согласования (1-based). Несколько подписей на одном шаге с разными order = последовательное согласование - IsNecessary: true — подпись обязательна (блокирует переход до получения) - Массивы StepsIfNotSigned, StepSignExtParamsIdForRestriction и т.д. можно передавать пустыми [] - С 2.267: вместо плоского массива StepSignExtParamsIdForRestriction используется stepExtParamRestrictions: [{ extParamId, isRequiredForSign, isReadOnlyOnSign }]. Два независимых флага: - IsRequiredForSign (default = 1) — ДП обязателен к заполнению перед акцептом подписи (старое поведение, сохранено для всех существующих записей). - IsReadOnlyOnSign (default = 0) — ДП блокируется (становится readonly) на время, пока на шаге активна подпись. - Флаги независимы: один ДП может быть одновременно обязательным к заполнению и блокируемым при подписи (сценарий «заполнить → отправить на подпись → заморозить»). Хранение: колонки IsRequiredForSign и IsReadOnlyOnSign в таблице dbo.StepSignExtParamRestrictions. - Идемпотентность: API не проверяет дубли — при повторном POST создаст дублирующую привязку. Проверяйте через GET ?stepId=X

Runtime: IsWaitingSign и параллельные подписи (v2.268.104)

Флаг IsWaitingSign на задаче определяет, ожидает ли задача подписи. Логика сброса при выполнении шага:

  • До 2.268.104: IsWaitingSign = false при завершении любого шага подписи — даже если на других шагах оставались активные подписи. Это приводило к некорректному состоянию задачи.
  • С 2.268.104: IsWaitingSign сбрасывается только если нет активных подписей на других шагах. Проверка: hasActiveSignaturesExceptStep в TaskActionService.ExecuteStepAction().

Сценарий: задача на маршруте с параллельными подписями (несколько StepSignature с разными SignatureOrder или на разных шагах). При завершении одной подписи остальные продолжают удерживать задачу в состоянии «ожидание подписи».

Подписи группы (EqualUsersForSignature)

Где настраивается: автоадминка -> форма equal-users-for-signature Таблица БД: dbo.EqualUsersForSignature

Определяет, какие пользователи из группы могут подписывать за друг друга (взаимозаменяемость подписантов). 6 полей: SignatureId, GroupId, UserId, настройки доступа.

КриптоПро (CryptoProCertificationCenters)

Где настраивается: автоадминка -> форма cryptopro-verification-centers Таблица БД: dbo.CryptoProCertificationCenters

Подключение к удостоверяющим центрам КриптоПро для электронной подписи. 6 полей: URL, сертификат, настройки подключения.

DSS КриптоПро (DSSCryptoProCredentials)

Где настраивается: автоадминка -> форма dsscryptopro-service-settings Таблица БД: dbo.DSSCryptoProCredentials

Подключение к сервису облачной ЭЦП КриптоПро DSS. 14 полей:

Параметр Описание
Сервис Предварительно созданный сервис с типом DSSCryptoPro (страница Сервисы)
SignServer Сервер подписания
StsAppName Сервер регистрации
Host Стенд
Auth with password Тип аутентификации: One-factor authentication with password (логин + пароль) или Two-factor authentication with MyDSS (логин + код на привязанный телефон). При 2FA при смене устройства требуется перевыпуск.
ClientId ID клиента
ClientSecret Секретный код клиента
Waiting sign time Максимальное время ожидания подтверждения подписи с телефона при двухфакторной аутентификации, секунды. При превышении транзакция прерывается.

Порядок подключения (4 шага): установить и настроить DSSCryptoPro по документации производителя → создать сервис в 1Форме → заполнить параметры подключения → указать сервис в настройках подписи на переходе.

PayControl

Owner: ../integrations/admin.md — параметры сервиса (system_id, Server Signer API, ДП пользователя) описаны там.

Здесь — только то, что не покрыто интеграциями: перерегистрация при утере телефона. Перевыпуск сертификата по истечении срока, утеря смартфона или переустановка приложения 1F Mobile — через API PayControl (обновление ключа server_signer: true на сервере PayControl вручную).

Подробнее — раздел PayControl в integrations/admin.md.

Контур.Облако (УКЭП без локального токена)

Owner: ../integrations/admin.md — подключение и параметры описаны там.

Позволяет подписывать документы УКЭП или НЭП без локального носителя; подтверждение — SMS-кодом.

Подробнее — раздел Контур.Облако в integrations/admin.md.

Настройка рабочего места пользователя для ЭЦП

КриптоПро (токен КриптоПро):

  • Плагин КриптоПро — установить и включить в браузере
  • КриптоПро CSP — криптопровайдер
  • Корневой сертификат УЦ, выдавшего ЭП — установить в доверенные корневые центры сертификации

РуТокен:

  • Плагин РуТокен — установить и включить в браузере
  • Корневой сертификат УЦ, выдавшего ЭП

Выбор на клиенте: если выбран плагин «Определять на клиенте» — в момент подписания у пользователя запрашивается, какой плагин использовать. Требуется установка обоих плагинов.

Источник: admin.md (порядок настройки), admin.md

JS API КриптоПро и смарт-автоматизация для сертификатов

УЦ КриптоПро управляет сертификатами (выдача, проверка, отзыв, приостановка, возобновление). Серверные действия автоматизируются смарт-действиями, клиентские (считывание токена) — JS API.

Смарт-действия (CryptoPro CA)

Смарт-действие Назначение Ключевые параметры
Issue certificate Выпуск сертификата ID CA, ID ДП с GUID пользователя в УЦ, ID ДП со строкой запроса, ID ДП с Request ID, ID ДП для записи сертификата
New or update user Привязка сертификата к пользователю 1Формы ID CA, ID ДП с XML данными пользователя, Task number
Pause certificate Приостановка сертификата ID CA, ID ДП с сертификатом (base64), дата начала/конца, причина
Resume certificate Возобновление сертификата ID CA, ID ДП с сертификатом
Revoke certificate Отзыв сертификата ID CA, ID ДП с сертификатом, дата отзыва, причина
Get Thumbprint Получение отпечатка подписи ID ДП с сертификатом, ID ДП для записи отпечатка

JS API (выполняется на клиенте)

Метод Что делает Параметры
tcCryptoLogic.newRequest(taskId, RequestString_EP_ID, Request_EP_ID, {extParamsId:{ContainerName: 'Container_EP_ID'}}) Создать запрос на сертификат ID ДП со строкой запроса, ID ДП для записи Request, ID ДП с названием носителя
tcCryptoLogic.installCertificate(taskId, Certificate_EP_ID) Записать сертификат на носитель ID ДП с сертификатом
tcCryptoLogic.changePin(thumbprint_EP_ID) Сменить PIN-код (CryptoPro) ID ДП с отпечатком. Для RuToken — без параметров

Формат XML данных о пользователе (для Issue certificate / New or update user):

<ProfileAttributesChange>
  <From>
    <Attribute Oid="2.5.4.3" Value="Иванов Иван Иванович"/>
    <Attribute Oid="2.5.4.4" Value="Иванов"/>
    <Attribute Oid="2.5.4.42" Value="Иван Иванович"/>
    <Attribute Oid="1.2.840.113549.1.9.2" Value="29U6MCO"/>
    <Attribute Oid="2.5.4.10" Value="ООО Ромашка"/>
    <Attribute Oid="2.5.4.12" Value="Заместитель директора"/>
  </From>
  <To>
    <!-- аналогично для целевых значений -->
  </To>
</ProfileAttributesChange>

Формат атрибутов сертификата:

[
  {"rdn": "commonName", "cpn": "CN", "value": "ИвановИИ"},
  {"rdn": "surname", "cpn": "SN", "value": "Иванов"},
  {"rdn": "givenName", "cpn": "G", "value": "Иван Иванович"},
  {"rdn": "organizationName", "cpn": "O", "value": "ООО Ромашка"},
  {"rdn": "title", "cpn": "T", "value": "Директор"},
  {"rdn": "emailAddress", "cpn": "E", "value": "ivanov@romashka.ru"}
]

Источник: admin.md

Выбор плагина ЭЦП

Где настраивается: AdminSPA → /spa/administration/eds-plugin-settings (v2.268+)

Три уровня настройки: 1. Глобальный -- плагин по умолчанию для всей системы 2. По категории -- переопределение для конкретных категорий 3. По группе -- переопределение для групп пользователей

Варианты плагинов: CryptoPro, RuToken, DefineOnClient (определить на клиенте).

Удаление записей (категории или группы из списка) выполняется мгновенно, отдельным запросом — без нажатия «Сохранить».

Admin API:

Эндпоинт Назначение
GET /api/admin/eds/plugin Получить текущие настройки плагина: плагин по умолчанию, настройки для категорий и групп
PUT /api/admin/eds/plugin Полностью заменить настройки категорий и групп (full replace)

До v2.268 настройка выполнялась через EntityEditor (/spa/administration/entity/cryptoProPlugin); этот механизм упразднён.

SignaturesGridSettings — настройка колонок списка подписей

Версии: v2.256 Феникс — v2.265 Цефей. С v2.266 — нативная настройка колонок. Где настраивается: пользовательский ключ SignaturesGridSettings (SettingsCustom)

Формат ключа:

{"columns":[{"key": "...", "type": "...", "isHidden": true/false}]}

Механика isHidden

  • isHidden: false — колонка отображается
  • isHidden: true — колонка скрыта даже из меню «доступных колонок» (недоступна для включения пользователем)

Тип extparam

Для вывода значений ДП в список подписей: в качестве type указать "extparam", в key — ID нужного ДП. Работает для обычных ДП; информационные ДП (отображаются серыми блоками под строкой) этим не управляются.

Системные колонки

key Колонка type
taskText Текст задачи general
signatureReason Причина запроса подписи general
signatureOrderedTime Срок general
description Описание general
signatureAndText Подпись и текст задачи general
signatureAcceptants Согласующие general
signatureInitializeDate Дата запроса general
subcatName Категория general
ownerName Заказчик general
responsiblePerformer Исполнитель general
requestorName Запросивший подпись general
timeToSign Время на подпись general
actions Действия general
commentsFromMeCount Вопросы от меня general
commentsToMeCount Вопросы мне general
isAnyUnAnswered Мои вопросы general
taskId Номер задачи general
taskState Статус general
activeSubtasks Активных подзадач general
totalSubtasks Всего подзадач general
subtasksRes Подзадачи general
taskPriority Приоритет general
{ExtParamId} Любой ДП (ID задаётся в key) extparam

Источник: admin.md

Совмещение статической и динамической подписи

Одна и та же подпись может быть одновременно статической и динамической: на переходе она запрашивается как статическая (привязана к шагу), но в рамках того же перехода допускается запросить её динамически.

При отклонении динамической подписи параметр «Прерывать согласование на переходе, если подпись отклонена» (блок «Динамическая подпись» в настройках подписи) определяет поведение:

  • Прервать — всё согласование на переходе останавливается
  • Продолжить — остальные подписи на переходе продолжают выполняться

Оба типа маршрутов (статический и динамический) детально описаны в business.md секции «Статическая подпись» и «Динамическая подпись», а также в backend.md.

Сводная матрица настроек подписей (~25 тем)

Таблица группирует все параметры подписей по функциональным задачам, а не по форме настройки. Колонки: Где настраивается, Область действия (подпись/переход/группа/категория), Смарт-события и смарт-действия.

Тема Где настраивается Область Смарт-события / смарт-действия
Акцептанты Подпись → блок «Акцептанты» Подпись
Акцептанты на переходе Настройки подписи на переходе, колонка «Акцептанты» Переход
Акцептанты динамической подписи Подпись → блок «Динамическая подпись», параметр «Акцептант определяется по» Подпись
Акцептанты от имени группы Группа → вкладка «Подписи» Подпись\Группа
Изменение списка акцептантов Группа → вкладка «Права на категорию» / Категория → вкладка «Доступ» Категория\Группа
Предупреждение при пустом акцептанте Подпись → параметр «Не слать ошибку, если акцептант не указан» Подпись
Добавление в подписчики Подпись → параметр «Добавлять в подписчики акцептанта» Подпись Смарт-действие: «Добавить акцептанта динамической подписи»
Срок подписи Подпись → блок «Срок», параметры «Минимальное время» и «Время по умолчанию» Подпись
Срок на конкретном переходе Настройки подписи на переходе, колонка «На подписание» Переход
Обязательность срока Подпись → блок «Срок», параметр «Срок обязателен» Подпись
Изменение срока Подпись → блок «Срок», параметр «Срок можно менять» Подпись Смарт-событие: «После истечения срока подписи»
Доступные резолюции Подпись → блок «Резолюции» Подпись
Запрос подписи на переходе Настройки маршрута категории, колонка «Подписи» Категория Смарт-событие: «Перед запросом подписи на переходе»
Обязательность подписи на переходе Настройки подписи на переходе, колонка «Обязательна» Переход
Причина запроса подписи Настройки подписи на переходе, колонка «Причина» Переход
Причина для динамической подписи Подпись → блок «Динамическая подпись», параметр «Причина запроса для динамической подписи обязательна» Подпись
Изменение причины Настройки подписи на переходе, колонка «Причину запроса подписи можно менять» Переход Смарт-действие: «Изменить причину динамической подписи»
Комментарий при акцепте Подпись → параметр «Запрашивать комментарий при подписании» Подпись
Комментарий на переходе Настройки подписи на переходе, колонка «Запрашивать комментарий при подписании» Переход
Обязательность причины у резолюции Резолюция → параметр «Обязательна причина» Резолюция События: «Перед акцептом/делегированием/отклонением/удалением подписи»
Эскалирование Подпись → параметр «Можно эскалировать» Подпись События: «Перед эскалированием», «После эскалирования динамической подписи»
Эскалирование на переходе Настройки подписи на переходе, колонки «Можно эскалировать», «Эскалировать, когда просрочена» Переход
Подпись начальника Подпись → блок «Подпись начальника» Подпись
Отзыв подписи Категория → параметры «Разрешить исполнителям отзывать...» Категория Смарт-действие: «Отозвать запрошенную подпись». События: «Перед/После отзыва подписи»
Динамическая подпись Подпись → блок «Динамическая подпись», параметр «Может быть динамической» Подпись Смарт-действия: «Запросить динамическую подпись», «Запросить подпись пользователя». События: «Перед/После запроса динамической подписи»
Право запрашивать динамическую подпись Группа → вкладка «Специальные права», параметр «Запрашивать динамическую подпись» Группа
Право создавать динамическую подпись Группа → вкладка «Специальные права», параметр «Создавать динамическую подпись» Группа
Повторный запрос подписи Подпись → параметр «Не запрашивать повторно» Подпись
Повторный запрос на переходе Настройки подписи на переходе, колонка «Не запрашивать повторно» Переход
Отдельная копия каждому акцептанту Настройки подписи на переходе, колонка «Каждому акцептанту отдельную копию» Переход
Условия запроса Настройки подписи на переходе, колонки «Обязательные ДП», «Условия запроса» Переход
Последовательность подписей Настройки подписи на переходе, колонка «Этап согласования» Переход
Действие при отклонении Настройки подписи на переходе, колонки «При отклонении», «В статус если отклонена», «При отклонении выполнить переход» Переход
Действие при отклонении динамической Подпись → блок «Динамическая подпись», параметр «Прерывать согласование...» Подпись
SQL-процедура на переходе Настройки подписи на переходе, колонка «Процедура» Переход
Активность подписи Настройки подписи на переходе, колонка «Активна» Переход

Источник: admin.md (строки 411–828)

CustomSettings — прочие ключи подписей

Ключ Тип Назначение
IsOldSignTicker bool Если true — клик на индикатор подписей в SPA открывает старый список подписей (legacy-grid). Используется при переходе на новый интерфейс для совместимости

appsettings.json — серверная криптография подписей

Ключ Default Назначение
DecodeEdsSignatures true Серверная криптографическая верификация подписей ЭЦП при акцепте (выполняется SignedCms.Decode() + CheckSignature() из System.Security.Cryptography.Pkcs). Только для КриптоПро / РуТокен (EbdsTypes.CryptoProRuToken). Для DSS КриптоПро и Контур.Облако серверная проверка не выполняется (верификация на стороне облачного провайдера). При ошибке возвращается Eds_CryptographicException. ⚠️ Отключать (false), если на сервере не установлен КриптоПро CSP или недоступны корневые сертификаты УЦ — иначе акцепт упадёт

Типичные ошибки настройки

Симптом Причина Где проверить SQL-диагностика
«Подпись недоступна» на переходе Подпись не привязана к шагу маршрута StepSignatureController select ss.*, s.Name from dbo.StepSignatures ss inner join dbo.Signatures s on ss.SignatureId = s.SignatureID where ss.StepId = {stepId}
«Нет доступных резолюций» К подписи не привязаны типы резолюций SignaturesController -> resolutions select s.Name, srt.* from dbo.SignatureResolutions sr inner join dbo.Signatures s on sr.SignatureId = s.SignatureID inner join dbo.SignatureResolutionTypes srt on sr.ResolutionTypeId = srt.Id where s.SignatureID = {id}
ЭЦП не работает Неверные настройки КриптоПро / DSS Формы cryptopro-verification-centers, dsscryptopro-service-settings select * from dbo.CryptoProCertificationCenters; select * from dbo.DSSCryptoProCredentials
Подпись требует комментарий, но нет поля Тип резолюции требует комментарий Форма signature-resolution-types select * from dbo.SignatureResolutionTypes where Id = {resTypeId}
Динамическая подпись не появляется Неверный SQL-маршрут или не настроена видимость StepSignatureController -> route-from-sql select * from dbo.StepSignatures where StepId = {stepId} and IsDynamic = 1

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

  • docs/domains/signatures/backend.md -- backend-архитектура (контроллеры, сервисы, runtime подписей)
  • docs/domains/categories/admin.md -- настройка маршрутов (подписи привязываются к шагам категории)
  • docs/platform/backend/admin-architecture.md -- общая архитектура администрирования
  • docs/reference/database/dbadmin-forms-map.md -- карта всех форм автоадминки