Смарт-действия — Администрирование¶
Раздел охватывает автоматизацию: смарт-правила (событие → условие → пакет действий), смарт-доступ, очереди событий, потоки сообщений и смарт-скрипты. Администрирование использует два механизма:
- Автоадминка (dbadmin) — 8 форм (SmartAccess, Queues, CustomEvents, MessageFlows и связанные)
- Отдельные SPA-страницы — 3 формы (
general-smart,all-smart,custom-queue-actions) — зарегистрированы в дереве автоадминки, но открывают собственные SPA-страницы - Admin API — 10+ контроллеров для редактора пакетов действий, смарт-правил, конструктора условий, смарт-скриптов
Ограничение: 1F Certificate Edition¶
В сертифицированной редакции 1F Certificate Edition (сборка для ФСТЭК) подсистема смарт-скриптов и смарт-действий полностью исключена из состава продукта. Административные страницы настройки смарт-правил, пакетов действий и редактора смарт-скриптов в этой редакции недоступны. Для функциональности автоматизации используйте полную редакцию.
Механизмы администрирования¶
Автоадминка (dbadmin)¶
Часть настроек смарт-действий ведётся через формы автоадминки над таблицами БД:
| Alias формы | Название | Таблица БД | Полей | Секций | Папка |
|---|---|---|---|---|---|
smart-access |
Смарт-доступ | dbo.SmartAccess | 5 | 1 | Общая бизнес-логика |
smart-access-subcategories |
Смарт доступ — Категории | dbo.SmartAccessSubcategories | 4 | 1 | Служебное |
smart-access-trigger-extparams |
Смарт доступ — Пересчет при смене ДП | dbo.SmartAccessTriggerExtParams | 4 | 1 | Служебное |
smart-access-trigger-groups |
Смарт доступ — Пересчет при добавлении в группу | dbo.SmartAccessTriggerGroups | 4 | 1 | Служебное |
queues |
Очереди событий | dbo.Queues | 6 | 1 | Общая бизнес-логика |
custom-events |
Произвольные события | dbo.CustomEvents | 5 | 1 | Служебное |
message-flows |
Потоки | dbo.MessageFlows | 7 | 1 | Общая бизнес-логика |
custom-queue-actions-2 |
События (Custom Queue Actions) | dbo.CustomQueueActions | 10 | 1 | Служебное |
Отдельные SPA-страницы (в дереве администрирования)¶
Ключевые операции вынесены на отдельные страницы интерфейса администрирования:
| Alias формы | Название | Url | Таблица БД | Папка |
|---|---|---|---|---|
general-smart |
Общие смарты | /administration/smart-packs |
dbo.SmartExpressions | Общая бизнес-логика |
all-smart |
Все смарты | /administration/smart-packs?globalEventsOnly=false |
dbo.SmartExpressions | Общая бизнес-логика |
custom-queue-actions |
Привязка действий к событиям очереди | /administration/queues |
dbo.CustomQueueActions | Общая бизнес-логика |
Помимо страниц, зарегистрированных в дереве автоадминки, существует страница редактирования одного смарт-правила:
| Маршрут | Назначение | Версия |
|---|---|---|
/administration/smart-rule/:id (?subcatId=...&tab=pack|settings) |
Редактор смарт-правила: вкладки «Пакет действий» / «Настройки правила», смена пакета через модалку | с 2.268.358, см. frontend.md |
Admin API контроллеры¶
Редактор пакетов действий¶
API редактора пакетов действий:
| Маршрут | Методы | Назначение |
|---|---|---|
/api/admin/smart/packs |
GET, POST, DELETE | CRUD пакетов, список по категории |
/api/admin/smart/packs-on-events |
GET, POST, DELETE | CRUD смарт-правил (событие → пакет) |
/api/admin/smart/packs |
GET, POST, DELETE | Схема/содержимое пакета, действия внутри пакета |
Конструктор условий и выражений¶
API конструктора условий и смарт-выражений:
| Маршрут | Методы | Назначение |
|---|---|---|
/api/admin/smart/query |
GET, POST | Конструктор запросов |
/api/admin/smart/query-constructor |
GET, POST | Конструктор TSQL-условий |
/api/admin/smart/expressions |
GET, POST, DELETE | CRUD смарт-выражений |
/api/admin/smart/expression-editor |
GET, POST | Редактор выражений (схема интерфейса) |
/api/admin/smart/expression-constructor |
GET, POST | Конструктор выражений |
/api/admin/smart/expression-test-cases |
GET, POST, DELETE | Тест-кейсы для выражений |
Редактор смарт-скриптов¶
API редактора смарт-скриптов:
| Маршрут | Методы | Назначение |
|---|---|---|
/api/admin/smart/scripts/editor |
GET, POST, DELETE | Редактор смарт-скриптов: получение, сохранение, проверка компиляции, выполнение, удаление, параметры действий |
Доступ и скрипты¶
API смарт-доступа, скриптов и расписаний:
| Маршрут | Методы | Назначение |
|---|---|---|
/api/admin/smart/access |
GET, POST, PUT, DELETE | CRUD смарт-доступов (только суперадминистраторам через Permissions.IsUserGod). С 2.268.346 (#2093905, коммит 4083898ea0) в SmartAccessController добавлены honest CRUD-методы — POST (create, возвращает int Id), PUT /{smartAccessId} (update основных полей), DELETE /{smartAccessId}, GET /{smartAccessId}, GET (list). До этого создание шло только через auto-admin форму 44 (POST /api-core/data-source-form/44/action); форма 44 сохранена для backward compatibility со SPA до отдельной миграции. DTO: SmartAccessCreateDto (Name, ActionId, UsersSmartExpressionId, опц. Triggers: SmartAccessAdditionalSettingsDto), SmartAccessUpdateDto (основные поля; триггеры обновляются отдельно через additional-settings — не через PUT), SmartAccessDto (Id, Name, ActionId, UsersSmartExpressionId). MCP-инструменты /mcp-admin-api-smart-access автогенерируются: smart_access_create, smart_access_update, smart_access_delete, smart_access_get, smart_access_list (в дополнение к существовавшим calculate_access, get_additional_settings, delete_smart_access_tasks). Подробности — backend.md § «SmartAccessController — CRUD смарт-доступов» |
/api/admin/smart/scripts |
GET, POST, DELETE | Смарт-скрипты (JS/TSQL) |
/api/admin/smart/recurrences |
GET, POST, PUT | Расписание повторяющихся правил |
Ключевые настройки¶
Смарт-выражения (SmartExpressions)¶
Где настраивается: SPA-страница /administration/smart-packs (пункт general-smart в дереве автоадминки) / Admin API (/api/admin/smart/expressions)
Таблица БД: dbo.SmartExpressions
Смарт-выражения — универсальный механизм, используемый и как условия (фильтры), и как правила автоматизации (событие + пакет действий).
| Поле | Тип | Что контролирует |
|---|---|---|
Content |
nvarchar(max) | JSON-содержимое выражения (дерево условий) |
Name |
nvarchar | Название выражения (отображается в интерфейсе) |
SubcatID |
int | Привязка к категории (NULL = глобальное) |
IsFilter |
bit | Тип: фильтр (true) или правило автоматизации (false) |
EventID |
int | Событие-триггер (для правил) |
ParameterValue |
nvarchar | Значение параметра события (уточнение триггера) |
NoContextMode |
int | Режим без контекста задачи |
AvailAsSmartSearch |
bit | Доступно как смарт-поиск |
TSqlContent |
nvarchar(max) | TSQL-представление выражения |
Public |
bit | Публичное (видимо другим администраторам) |
OwnerUserId |
int | Владелец выражения |
QueryBuilderState |
nvarchar(max) | Состояние визуального конструктора |
OriginID |
int | Происхождение (системное / пользовательское) |
IsDeleted |
bit | Мягкое удаление |
Зависимости между полями:
IsFilter = 1→EventIDиParameterValueне используются при вычислении фильтра (это фильтр, не правило; в записи БД поля могут быть заполнены)IsFilter = 0→EventIDобязателен (определяет триггер)SubcatID = NULL→ глобальное правило/фильтрNoContextMode→ влияет на доступность действий, требующих контекст задачи
Что происходит при выполнении:
Content(дерево условий) вычисляется при срабатывании;TSqlContentиспользуется для серверного выполнения (прямой SQL);EventIDопределяет, на какое событие срабатывает правило (см. Смарт-фильтры).
Пакеты действий (ActionsPacks)¶
Где настраивается: AdminSPA → настройки категории → вкладка «Смарт» / Общие смарты (/administration/smart-packs) / Admin API (/api/admin/smart/packs)
Таблицы БД: dbo.ActionsPacks, dbo.PacksActions, dbo.PacksActionsParameters
Пакеты настраиваются через Admin API (визуальный редактор в SPA). В автоадминке формы для ActionsPacks нет.

Структура:
ActionsPacks— метаданные пакета (имя, GUID, категория)PacksActions— действия внутри пакета (тип, порядок)PacksActionsParameters— параметры каждого действия
Типы действий: 70+ типов — полный каталог в actions-reference.md
Ключевые группы действий:
- Задачи: создание, изменение статуса, полей, исполнителей
- Комментарии: добавление, изменение
- Уведомления: email, push, SMS
- Файлы: генерация документов, копирование
- Интеграции: HTTP-запросы, SQL, внешние системы
- Управление: остановка/возобновление таймеров, JS-скрипты
Создание пакета¶
Пакет можно создать двумя способами:
- С привязкой к событию — создать смарт-правило (событие → пакет) и нажать «Создать» рядом с полем пакета.
- Без привязки — в разделе «Пакеты действий» нажать «Создать пакет». Такой пакет потом можно привязать к событию, расписанию или вызвать вручную.
Пакеты из Общих смартов не поддерживают действия, требующие контекста категории (например, «Принудительно изменить статус»).
Ограничения именования: апострофы (') в названии пакета делают его неработоспособным — использовать только кавычки (").
Привязка к событию через скрипт: если пакет использует смарт-скрипты, привязанные к событию A, он недоступен для выбора в контексте события B.
Добавление действий¶
Кнопка «+Действие» открывает список всех действий, сгруппированных по смысловым блокам. Поддерживается поиск по слову в названии.

После выбора действия открываются его параметры. Для каждого параметра выбирается формат значения:
| Формат | Описание |
|---|---|
| Значение | Фиксированное значение нужного типа |
| Smart / TSQL | Смарт-выражение. Должно возвращать тип, соответствующий параметру. Список — в формате {А, В, С}. Тестовая выборка ограничена 100 записями. |
| Lua-скрипт | Lua-скрипт из репозитория. Требования к типам аналогичны Smart/TSQL. |
| Оставить пустым | Для необязательных параметров — значение не присваивается |
| Текущая задача | Только для параметров типа «Задача» — выполнить в задаче текущего события |
Параметры, обязательные для заполнения, отмечены *.
Поле «Задача»: по умолчанию действие выполняется в контекстной задаче. Чтобы выполнить в другой — указать ID через выражение. Если выражение вернёт несколько ID, действие выполнится для каждой задачи.
Порядок действий изменяется перетаскиванием строк.
Выполнение от имени пользователя¶
Если действие выполняется от имени конкретного пользователя, у него должны быть соответствующие права. Рекомендуется использовать системного робота (настраивается в Общих настройках приложения → «Диспетчер задач») — он обладает максимальными правами.
«Тихий» комментарий¶
При добавлении комментария через смарт-действие можно сделать его «тихим»: без адресатов, без увеличения счётчика непрочитанных, без push-уведомлений — независимо от настроек подписки.
Передача переменных между действиями¶
Некоторые действия возвращают результат (отмечены возвращает XXX в описании). Результат записывается в переменную и доступен в последующих действиях пакета через узел «Переменные» в дереве смарт-выражения.
Циклические пакеты¶
Если пакет должен выполняться многократно для разных объектов — включить флаг циклического выполнения. Дополнительные настройки:
| Настройка | Описание |
|---|---|
| Список итерируемых объектов | Смарт-выражение, возвращающее ID через запятую |
| Условие прерывания цикла | Смарт-выражение: когда истинно — цикл прерывается |
Индекс итерации начинается с 0 и доступен в смарт-выражениях пакета вместе с текущим значением итератора. Переменные цикла доступны в редакторе выражений только если заданы оба поля (список и условие).
⚠️ Проверка глубины рекурсии смарт-пакетов к циклическим пакетам не применяется.
Меню быстрых действий с пакетом¶
Через контекстное меню пакета доступны действия:
| Действие | Описание |
|---|---|
| Редактировать название | Изменить имя пакета |
| Редактировать описание | Произвольный текст (отображается при наведении на кнопку информации) |
| Редактировать модуль | Привязать пакет к модулю; без выбора — глобальный модуль |
| Дублировать пакет | Создать копию в текущей категории |
| Удалить пакет | Удалить пакет |
Автогенерация описания действия: при настройке параметров можно пометить ключевые из них как «Показ превью» — система сгенерирует краткое описание действия в списке пакета.
Что происходит при выполнении:
- действия выполняются последовательно в порядке
ActionOrder; - асинхронные правила уходят в очередь.
Смарт-правила (событие → пакет)¶
Где настраивается: Admin API (/api/admin/smart/packs-on-events)
Таблица БД: dbo.EventsActions
Связывает событие с пакетом действий через условие (смарт-выражение).
Ключевые концепции:
- Правило = событие + (опциональное) условие + пакет действий
- Правила привязаны к категории (
SubcatID) или глобальные - Порядок правил определяет приоритет выполнения (изменение порядка через API)
- Флаг
IsAsync— асинхронное выполнение через очередь - Флаг
Cancelable— возможность отмены пользователем - Флаг
IsActive— если отключён, правило сохраняется, но не срабатывает (удобно для отладки)
Редактор правила (AdminSPA)¶
Экран редактирования смарт-правила (/administration/smart-rule/:id) разделён на две вкладки.
- Пакет действий — список действий пакета. Кнопка «Добавить действие» добавляет новое действие; клик по строке действия открывает его параметры в отдельном окне; удалить действие можно через контекстное меню (правый клик по строке). Порядок действий меняется перетаскиванием строк. Если действие требует скрипта, по клику открывается смарт-редактор в модальном окне.
- Настройки правила — событие-триггер, смарт-фильтр (условие срабатывания), флаги «Активна» и «Асинхронно».
При закрытии окна параметров действия с несохранёнными изменениями выводится предупреждение «Изменения будут утеряны, если их не сохранить.».
Асинхронность правил¶
Флаг IsAsync влияет на порядок выполнения нескольких правил для одного и того же события:
- Синхронное правило — следующие по списку правила ждут его завершения.
- Асинхронное правило — следующие правила запускаются немедленно, не ожидая результата.
⚠️ Включать асинхронность стоит только если все правила события независимы друг от друга и порядок выполнения не важен.
Порядок событий при смене исполнителя / ответственного¶
Нелинейная последовательность событий при делегировании и удалении важна для правильной настройки смарт-правил:
| Действие | Условие | Последовательность событий |
|---|---|---|
| Назначение ответственного | Назначается единственный исполнитель | Перед назначением исполнителя → После назначения исполнителя → Перед сменой ответственного → После смены ответственного |
| Назначение ответственного | Новый ответственный уже в списке исполнителей | Перед сменой ответственного → После смены ответственного |
| Удаление исполнителя | Не ответственный | Перед удалением исполнителя → После удаления исполнителя |
| Удаление исполнителя | Ответственный, других нет | Перед сменой ответственного → После смены → Перед удалением → После удаления |
| Удаление исполнителя | Ответственный, есть один другой | То же, что выше |
| Удаление исполнителя | Ответственный, есть 2+ других | Смарт-события не выполняются — система требует ручного назначения ответственного |
| Делегирование | Новый ответственный уже в списке, «Удалить всех» = OFF | Перед сменой ответственного → После смены → Перед удалением прежнего → После удаления |
| Делегирование | Новый ответственный не в списке, «Удалить всех» = OFF | Перед назначением → После назначения → Перед сменой → После смены → Перед удалением → После удаления |
| Делегирование | «Удалить всех» = ON, несколько исполнителей | Перед сменой → После смены → Перед удалением × N → После удаления × N |
Отображение параметра в списке правил¶
В AdminSPA на странице настройки смарт-правил (привязка событий к пакетам действий) в колонке «Параметр» таблицы отображается расширенная информация о значении параметра события в зависимости от его типа:
- Переход: название перехода, ID, исходный и целевой статусы (например, «Завершить (172060, Выполняется → Завершена)»). Название перехода — ссылка на страницу администрирования маршрута.
- Дополнительный параметр: название параметра, ID, тип (например, «Приоритет (172, Число)»). Название параметра — ссылка на настройки дополнительных параметров категории.
- Статус: название статуса, ID (например, «В работе (27)»).
Каталог событий и контекстные параметры¶
Полный реестр всех EventID (197 событий, значения 0–196) с C#-именами, группами и контекстными параметрами @eventParam* — в reference/automation/smart-events-catalog.md.
Ключевые правила, важные для настройки правил:
-
Отменяемые события (префикс «Перед …»). Если событие начинается со слова «Перед …» (
BeforeTaskCreate,BeforeStateChange,BeforeExtParamChangeи т. п.), пакет действий может отменить событие через действиеОтменить. Используется для запретов («нельзя понизить приоритет, если заказчик — гендиректор»). После «После …» отмена невозможна. При отмене смены значения ДП «Таблица» (BeforeExtParamChange) в модальном окне выводится только текст, заданный в действииОтменить, без системного префикса — единообразно с ДП-лукапами. -
Глобализация категорийных событий (с v2.268 Скульптор). Событие, помеченное флагом
CanBeGlobal, можно привязать к пакету в Общих SMART безSubcatID— пакет сработает в любой задаче системы. Сначала отрабатывают категорийные пакеты, затем глобальные. Первое событие с флагом —AfterPostComment(29). Список глобализируемых событий расширяется в новых версиях (такие события помечены ⚑ в каталоге). Например, флаг получили смарт-события AI-подсказок в чатах —WhenStartReply(196) иWhenWritingComment(201). -
Изначально глобальные группы. Группы
Глобальные,Exchange,Пользователиработают только вОбщих SMARTбез привязки к категории — это историческое поведение, не путать с глобализированными. -
События ресурсного планирования — два разных «Исполнителя». В контекстных параметрах присутствуют два различающихся параметра:
| Параметр | Что передаётся | Когда использовать |
|---|---|---|
| Исполнитель (пользователь) | UserID пользователя |
Для внесения затрат по сотруднику |
| Исполнитель (задача) | TaskID задачи из Справочника ресурсов (раздел «Системный») |
Для внесения затрат по ресурсу |
Не взаимозаменяемы — путаница приводит к ошибочной аналитике.
-
@eventParam*для специальных событий. Часть событий передаёт массив (например, в ресурсном планировании параметр «Дата» — массив; читается черезOPENJSONв SQL). ДляEventID=64(«Во время открытия задачи») контекст интерфейса приходит в@eventParam1. ДляExchange-событий (новое письмо, изменено событие в календаре) подробности встречи/письма не приходят в параметры — нужно дополнительно вызвать смарт-действие «Получить встречу» / «Получить письмо». -
Нумерация enum нелинейная. Числовые
EventIDне совпадают с порядком объявления в C# (AfterSignatureSigned=70объявлен послеBeforeSubscriberAdded=58). При SQL-диагностике используйте точные числовые значения.
Смарт-доступ (SmartAccess)¶
Где настраивается: автоадминка → форма smart-access / Admin API (/api/admin/smart/access)
Таблица БД: dbo.SmartAccess
Динамические права доступа к задачам на основе смарт-выражений.

| Поле | Что контролирует |
|---|---|
Name |
Название правила смарт-доступа |
UsersSmartExpressionID |
Выражение, определяющее набор пользователей |
ActionID |
Действие/право (чтение, запись, и т.д.) |
GUID |
Уникальный идентификатор для миграции |
Связанные формы:
smart-access-subcategories— к каким категориям применяется правило (dbo.SmartAccessSubcategories)smart-access-trigger-extparams— при изменении каких ДП пересчитывать доступ (dbo.SmartAccessTriggerExtParams)smart-access-trigger-groups— при изменении членства в каких группах пересчитывать (dbo.SmartAccessTriggerGroups)
Что происходит при выполнении:
- при изменении триггерного ДП или группы — автоматический пересчёт прав;
- результат кешируется и применяется при проверке доступа к задаче;
- операция тяжёлая — слишком широкие триггеры вызывают массовые пересчёты.
Типы доступа¶
Смарт-доступ может управлять следующими правами:
| Область | Тип доступа | Описание |
|---|---|---|
| Задача | Просмотр | Видимость задачи в списках и карточке |
| Задача | Исполнение | Право выполнять задачу |
| Задача | Редактирование заказчика | Изменение поля «Заказчик» |
| Задача | Редактирование исполнителя | Изменение состава исполнителей |
| Задача | Редактирование акцептантов | Изменение состава акцептантов подписи |
| Задача | Редактирование срока | Изменение дедлайна |
| Задача | Добавление в исполнители | Право стать исполнителем |
| Задача | Добавление в подписчики | Право подписаться на задачу |
| ДП | Просмотр | Видимость ДП в карточке |
| ДП | Редактирование | Изменение значения ДП |
⚠️ Правила смарт-доступа действуют только в уже созданных задачах и не применяются при создании.
Смарт-выражение для пользователей¶
Выражение в поле UsersSmartExpressionID должно возвращать список ID пользователей, которым предоставляется доступ.
| Результат выражения | Поведение |
|---|---|
| Список ID | Доступ предоставлен указанным пользователям |
Пустая строка "" |
Доступ не предоставлен никому (нормальная ситуация) |
null |
Пересчёт прерывается — ошибка конфигурации |
| Ошибка выполнения | Пересчёт прерывается |
⚠️ Возвращайте пустую строку
"", а неnull, если список пользователей пуст. Иначе пересчёт прерывается и предыдущее состояние доступа «замораживается».
Триггеры пересчёта¶
Пересчёт смарт-доступа инициируется при изменении ДП, указанных в форме smart-access-trigger-extparams, или при изменении членства в группах (smart-access-trigger-groups).
⚠️ Пересчёт выполняется только при изменении указанных ДП — даже если смарт-выражение ссылается на другие параметры (заказчик, исполнитель и т.п.). Для подписки на изменение не-DP параметров: создайте вспомогательные ДП, копируйте в них значения основных параметров (через отдельное смарт-правило), и настройте триггер на эти вспомогательные ДП.
При наличии настроенных триггеров по ДП, смарт-доступ пересчитывается также после создания задачи (если ДП уже заполнен при постановке — повторный пересчёт не производится).
Видимость в дереве категорий¶
Если на категорию настроен смарт-доступ, она отображается в дереве категорий всегда — даже если у пользователя нет доступа ни к одной задаче в этой категории.
Действия (меню)¶
Через меню правила смарт-доступа доступны действия:
| Действие | Описание |
|---|---|
| Синк активных задач | Принудительный пересчёт для всех активных задач привязанных категорий |
| Синк всех задач | Пересчёт для всех задач (включая завершённые) привязанных категорий |
| Удалить привязки доступа к задачам | Очистка таблицы SmartAccessViewTasks для данного правила. Выполнить перед удалением самого правила |
| Пересчет при смене ДП | Настройка списка ДП-триггеров |
| Пересчет при добавлении в группу | Настройка групп-триггеров |
⚠️ Ручной синк («Синк активных задач» / «Синк всех задач») необходим при первичном подключении правила — в этом случае автоматического пересчёта ещё не было. Также синк можно привязать к расписанию через смарт-действие «Пересчитать смарт-доступ в задачах».
AdminSPA — сохранение правил ДП¶
В AdminSPA правила смарт-доступа к ДП сохраняются независимо от основной формы настроек ДП. Каждое правило фиксируется сразу при нажатии кнопки «Добавить параметр» в модальном окне. После сохранения форма автоматически очищается для добавления следующего правила. Это предотвращает потерю данных при добавлении множественных правил.
Очереди событий (Queues + CustomQueueActions)¶
Где настраивается: автоадминка → формы queues, custom-queue-actions
Таблицы БД: dbo.Queues, dbo.CustomQueueActions
Очереди — механизм асинхронной обработки событий.
dbo.Queues — определение очереди:
| Поле | Что контролирует |
|---|---|
Alias |
Уникальный псевдоним очереди |
Description |
Описание |
Origin |
Происхождение (системная / пользовательская) |
IsReadOnly |
Запрет редактирования |
dbo.CustomQueueActions — привязка действий к очереди:
| Поле | Что контролирует |
|---|---|
QueueId |
Ссылка на очередь |
OrderID |
Порядок обработки |
Alias |
Псевдоним действия |
SmartFilterID |
Условие (смарт-фильтр) |
ActionPackID |
Пакет действий для выполнения |
Origin |
Происхождение |
IsReadOnly |
Запрет редактирования |
Назначение и типы событий¶
Очереди используются преимущественно при интеграции с внешними системами.
- Исходящее событие — инициируется внутри 1Формы: смарт-действие «Добавить новое событие в очередь» кладёт запись в нужный поток.
- Входящее событие — инициируется внешней системой: настраивается привязка пакета к системному или пользовательскому событию.
На странице «Привязки действий к событиям» пакеты внутри одного события можно переупорядочить перетаскиванием.
Обработка событий запускается заданием QueueEventsJob.
Системные события (из коробки)¶
Готовые системные события очередей:
| Событие | Описание |
|---|---|
ChangeEdocumentStatus |
Изменился статус электронного документа в Диадоке |
ReceiveNewEdocument |
Получен новый электронный документ через Диадок |
Подробнее об архитектуре очередей:
docs/platform/backend/message-queues.md
Что происходит при выполнении:
- при поступлении события в очередь выполняются привязанные действия в порядке
OrderID; - фильтр (
SmartFilterID) определяет, подходит ли событие для данного действия; - обработка очередей идёт в фоновых сервисах.
Произвольные события (CustomEvents)¶
Где настраивается:
- Настройки категории → Смарты → вкладка «Произвольные события»
- Общие смарты (
/administration/smart-packs) → вкладка «Произвольные события» (глобальные) - Автоадминка → форма
custom-events
Таблица БД: dbo.CustomEvents
| Поле | Что контролирует |
|---|---|
SubcatId |
Категория, к которой привязано событие |
Code |
Уникальный код события. Только буквы латиницы и цифры, без пробелов. Уникален в рамках категории. |
Description |
Название события (отображается в интерфейсе) |
Назначение¶
Произвольные события позволяют запустить пакет действий для множества задач категории по условию. Типичные сценарии:
- Массовый пересчёт данных во всех задачах категории (по кнопке или расписанию).
- Инициирование обработки задач из другой категории из контекста текущей.
В отличие от смарт-правил, которые реагируют на событие одной задачи, произвольное событие адресуется нескольким задачам сразу через смарт-отбор.
Как настроить¶
Настройка произвольного события состоит из трёх шагов:
- Создать событие — в настройках категории добавить запись с уникальным
Codeи названием. - Привязать обработчик — создать смарт-правило на системное событие «При произвольном событии», указав конкретный
Code. - Вызвать событие — через смарт-действие «Инициировать произвольное событие» из любой категории. В действии указывается:
- Целевое событие (категория + код)
- Сфера действия: текущая задача / конкретный ID / ID из смарт-выражения / список ID / смарт-отбор коллекции
Потоки сообщений (MessageFlows)¶
Где настраивается: автоадминка → форма message-flows (страница «Потоки» в разделе очередей)
Таблица БД: dbo.MessageFlows
Потоки определяют стратегию обработки событий в очереди. Рекомендуется создавать отдельные потоки для событий из разных внешних систем — это позволяет изолировать ошибки одной интеграции от другой. Обработка запускается заданием QueueEventsJob.
| Поле | Что контролирует |
|---|---|
FlowName |
Имя потока |
IsStoppable |
Можно ли остановить поток при ошибках |
HasErrors |
Флаг наличия ошибок (красный индикатор в списке) |
FailedAttemptsCounter |
Накопленный счётчик неудачных попыток |
ActionOnError |
Стратегия при ошибке: skip (пропустить) / stop (остановить) |
Стратегии при ошибке¶
Поведение потока при ошибке обработки события:
| Стратегия | Поведение | Счётчик попыток |
|---|---|---|
| Пропускать | Ошибочное событие пропускается, остальные продолжают обрабатываться | Не увеличивается |
| Останавливать | После ошибки обработка всего потока прекращается | Увеличивается |
При стратегии «Останавливать»: администратор должен удалить ошибочное событие из очереди или устранить причину ошибки, после чего запустить повторную обработку вручную.
Подробнее об архитектуре:
docs/platform/backend/message-queues.md
Смарт-скрипты¶
Где настраивается: Admin API (/api/admin/smart/scripts/editor)
Нет формы автоадминки — настраиваются только через API/SPA
Базовый путь: /api/admin/smart/scripts/...
Смарт-скрипты — произвольный код на 5 языках (Lua/JavaScript/Python/OneScript/C#), выполняемый как действие в пакете или по расписанию.
Получение списка скриптов¶
Список смарт-скриптов возвращает запрос:
POST /api/admin/smart/scripts/list
Возвращает список смарт-скриптов для списка в AdminSPA — используется в общих смартах и на вкладке «Скрипты» в настройках категории.
Параметры запроса (SmartScriptsQueryRequestDto):
| Параметр | Тип | Назначение |
|---|---|---|
IsContextual |
bool? |
Фильтр по признаку контекстности: true — только контекстные скрипты, false — только неконтекстные. Игнорируется, если задан ContextType |
ContextType |
enum | Фильтр по конкретному типу контекста скрипта; имеет приоритет над IsContextual |
SubcatId |
int? |
Категория |
EventId |
int? |
Событие |
IsLibrary |
bool? |
Фильтр библиотечных скриптов |
DescriptionFilter, ScriptFilter |
string? |
Поиск по названию и по коду |
Skip, Take, OrderBy, Order |
— | Пагинация и сортировка |
Создание нового скрипта¶
Новый скрипт создаётся отправкой объекта редактора:
editor_dto = {
"script": {
"id": 0, # 0 = новый (сервер назначит ID)
"description": "Название",
"scriptCode": js_code,
"language": "JavaScript", # "Lua" | "JavaScript" | "Python" | "OneScript" | "CSharp"
"contextType": "None", # СТРОКА, не null, не ""
"isLibrary": False,
"isDisabled": False
},
"context": None # null при программном создании
}
# POST /api/admin/smart/scripts/editor
Проверка компиляции скрипта в редакторе¶
Проверить компиляцию кода без выполнения:
POST /api/admin/smart/scripts/editor/compile
Компилирует код из редактора без выполнения и возвращает ошибки компиляции. Применяется редактором для проверки C#-скриптов (Roslyn) до сохранения или запуска — в отличие от editor/execute, который компилирует и сразу выполняет скрипт.
Значения language (enum ScriptLanguage / LanguageId в БД):
| Строка | LanguageId |
Движок | Модель | Таймаут | Возврат результата | Доступ к API платформы |
|---|---|---|---|---|---|---|
"Lua" |
0 |
NLua | Внутренний | 5 мин | RESULT = value |
SQL, SMART, HTTP, CACHE, REGISTRY, FILES, UTILS |
"JavaScript" |
1 |
Jint | Внутренний | 5 мин | RESULT = value |
SQL, SMART, HTTP, CACHE, REGISTRY, FILES, UTILS |
"Python" |
2 |
Python Executor (HTTP) | Внешний сервис (Docker) | 30 сек | return value из execute(ctx) |
Нет — только данные из ctx |
"OneScript" |
3 |
OneScript | Внутренний | 5 мин | RESULT = value |
SQL, SMART, HTTP, CACHE, REGISTRY, FILES, UTILS |
"CSharp" |
4 |
Roslyn | Внутренний | 5 мин | Последнее выражение | прямой доступ к API платформы |
Различия движков: Lua, JS, OneScript и C# выполняются внутри сервера. Python — внешний сервис (Docker): получает только сериализуемые данные через
ctx.
Контекстные переменные¶
Основные переменные (CONTEXT, EVENTPARAMS, SESSION_USER) — см. academy-patterns.md. Дополнительные:
| Переменная | Доступна в | Описание |
|---|---|---|
DB_TYPE |
Lua, JS, OneScript | Тип СУБД: "MSSQL" или "PG". Используется для условного ветвления SQL-кода |
SYSTEM_INFO |
Lua, JS, OneScript | Объект с полями: version — версия приложения, app — имя приложения (TC или Uniform) |
RESULT |
Все языки | Выходной параметр скрипта. В Lua/JS/OneScript: RESULT = value. В Python: return value из execute(ctx). В C#: последнее вычисленное выражение |
Репозиторий и include()¶
Скрипты-библиотеки подключаются функцией include:
include(id)— по ID (рекомендуется)include("Description")— по названию (не рекомендуется)include(id, subcatId)— по ID из указанной категории (снимает ограничение «только из репозитория»)
⚠️ Максимальная глубина рекурсии
include— 5 уровней. В подключаемых скриптах не должно быть вычислений, только определения функций и глобальных переменных.
Интерфейс редактора скриптов¶
Элементы интерфейса редактора скриптов:
- ⏱ — история версий скрипта (каждый POST в
/editorсоздаёт новую версию) - ··· — меню: «Из репозитория/библиотеки» (пометка библиотечного скрипта), переход в «Репозиторий»
- Выполнить — тестовый запуск скрипта. Результаты отображаются в нижней панели
- Параметры выполнения (раскрывающаяся панель) — поля «Id контекста» и параметры события для тестирования
Обновление существующего¶
Чтобы обновить скрипт, изменяйте только код, остальные поля сохраняйте как есть:
# 1. GET текущий DTO
resp = GET(f"/api/admin/smart/scripts/{script_id}/editor")
dto = resp["data"]
# 2. Обновить ТОЛЬКО код — остальные поля НЕ ТРОГАТЬ
dto["script"]["scriptCode"] = new_code
# 3. POST обратно
POST("/api/admin/smart/scripts/editor", {"script": dto["script"], "context": None})
Критически важно: при деплое менять только scriptCode. Все остальные поля (eventId, language, contextType, subcatId) — из GET, как есть. Ручная установка eventId — только при создании нового SS (id=0).
Версии и откат¶
GET /api/admin/smart/scripts/{scriptId}/versions — возвращает не более 10 последних версий скрипта, отсортированных по убыванию номера версии. Версия создаётся автоматически при каждом POST в /editor.
Откат: получить scriptCode нужной версии → POST в /editor с тем же id. Это создаст новую версию (не перезапишет).
Удаление версий: DELETE /{scriptId}/versions/{version} (одна) или DELETE /{scriptId}/versions/ (все). Текущая активная версия не удаляется.
Таблица SmartScripts — колонки БД¶
Реальные имена колонок таблицы SmartScripts отличаются от ожидаемых:
| Ожидаемое | Реальное | Ловушка |
|---|---|---|
SmartScriptId |
Id |
Invalid column name 'SmartScriptId' |
Language |
LanguageId |
Enum int, не строка в БД |
Name |
Description |
Нет колонки Name |
URL — частая ошибка¶
smart-scripts (дефис) → 404. Правильно: smart/scripts (слеш).
GET /api/admin/smart/scripts/{id}/editor— читатьPOST /api/admin/smart/scripts/editor— сохранить
Типичные ошибки SmartScript API¶
Частые ошибки при работе со смарт-скриптами через API:
| Проблема | Причина | Решение |
|---|---|---|
| 500 при POST | Тело запроса без обёртки {script, context} |
Всегда {script: {...}, context: null} |
EVENTPARAMS не определён при выполнении |
eventId сброшен в null после GET→POST |
Проверить что GET вернул правильный eventId. Если null — восстановить оригинальное значение |
contextType ошибка |
Передали null или пустую строку | Строка "None" (или "Task", "User") |
GET /editor vs GET /{id}/editor |
Первый = новый пустой объект, второй = существующий | Для чтения: /{id}/editor |
include(503) → crash |
SS 503 занят другим скриптом | Проверить ID скрипта перед include() |
| Jint StatementsCountOverflow | Лимит инструкций при выполнении | MaxStatements(100_000_000) по умолчанию. Для больших выборок — разбивать на части |
languageId вместо language |
API молча игнорирует languageId, ставит Lua=0 |
Поле называется language. Значения: "JavaScript" (строка) или 1 (int). Enum: Lua=0, JavaScript=1, Python=2, OneScript=3, CSharp=4 |
RESULT is not defined |
Jint ReferenceError при if (!RESULT) |
Использовать typeof RESULT === "undefined" или var RESULT; в начале |
include(N) → 500 без диагностики |
Ошибка при загрузке include — до try/catch | Отладка: POST /api/admin/smart/scripts/editor/execute. Тестировать include по одному |
| Публикация → 500 без деталей | Publication endpoint глотает ошибки SS | Для отладки: editor/execute возвращает {success, error, output, result} |
HTTP из SmartScript¶
Особенности HTTP-запросов из смарт-скриптов:
| Проблема | Причина | Решение |
|---|---|---|
HTTP.send_http_request + multipart → FormatException |
StringContent(body, enc, contentType) ломается на boundary |
Не подходит для multipart. Использовать HTTP.post_multipart |
HTTP.post_multipart без filename |
Value (без FileId) → StringContent без filename= |
Для загрузки файлов: только через FileId (из хранилища 1Формы) |
| Большой SS-код через shell → crash | jq --argjson / переменные > 64KB |
Python для отправки больших SS: urllib.request + json.dumps() |
HTTP-опции: изоляция cookie (DisableCookieContainer)¶
По умолчанию «простые» HTTP-запросы из скриптов переиспользуют общий клиент с общим хранилищем cookie (~2 минуты). Если внешний сервис выдаёт сессионную cookie, при повторном запросе на тот же домен Set-Cookie повторно не приходит — подставляется ранее сохранённая.
Опция DisableCookieContainer отправляет запрос через отдельный одноразовый клиент без общего хранилища cookie: каждый вызов изолирован, внешний сервис всегда отдаёт Set-Cookie заново. По умолчанию выключена. Полезна для ротации сессий с лимитом одновременных соединений (например, внешний «Спарк»: нужно явно закрывать каждую сессию и каждый раз получать новый идентификатор).
Имя ключа зависит от языка скрипта (внимание на регистр):
| Язык | Ключ |
|---|---|
| Lua | disable_cookie_container (snake_case) |
| JS-Jint | DisableCookieContainer (PascalCase) |
| C# (Roslyn) | DisableCookieContainer |
Lua:
-- Прямой таблицей:
local opts = { disable_cookie_container = true }
local resp = HTTP:send_http_request('POST', url, {}, headers, body, opts)
-- Или через json_decode (ключи в JSON тоже snake_case):
local opts = UTILS:json_decode('{"disable_cookie_container": true}')
JS-Jint:
var resp = HTTP.send_http_request('POST', url, null, headers, rawBody,
{ DisableCookieContainer: true });
C# (Roslyn SS):
var resp = await HTTP.send_http_request_async("POST", url,
@params: null, headers: headers, rawBody: rawBody,
options: new ScriptHttpRequestOptions { DisableCookieContainer = true });
Когда использовать. Включайте флаг для запросов, где сервер выдаёт сессионную cookie и она должна доходить до скрипта при каждом вызове (закрытие/ротация сессий, аутентификация по короткоживущим токенам). Для обычных интеграций оставляйте выключенной — переиспользование хранилища cookie экономит соединения. Флаг действует только на текущий запрос; другие запросы того же скрипта без флага продолжают использовать общий клиент.
Таблицы логов SmartScript¶
AutomationScriptsLog: Id, Type, ObjectKey, ObjectParams, AdditionalInfo, TaskId, UserID, ThreadId, Duration, Date, ObjectName, PlanExecution, AppPool
- НЕ существует:
Tag,Message,ScriptId,EventName,CreatedDate - API
/api/admin/smart/scripts/logsненадёжен — может вернуть невалидный JSON. Использовать SQL.
Lua SmartScript — особенности¶
Особенности и подводные камни Lua-скриптов:
| Проблема | Симптом | Решение |
|---|---|---|
SQL:query(sql) без второго аргумента |
Запросы молча возвращают nil | Всегда SQL:query(sql, {}) — второй аргумент обязателен, даже если пустой |
| PG: кавычки вокруг идентификаторов | "Tasks" → relation "Tasks" does not exist |
На dev-pg таблицы/колонки lowercase без кавычек (схема dbo) |
PG: CASE ветки с разными типами |
42804: CASE types text and timestamp cannot be matched |
Обе ветки CASE должны возвращать одинаковый тип |
PG: WITH RECURSIVE |
syntax error at or near "UNION" |
PG требует WITH RECURSIVE. MSSQL не принимает. Решение: WITH {PG}RECURSIVE{/PG} |
Журнал автоматизации¶
Журнал фиксирует выполнение смарт-автоматизаций: смарт-запросов, действий, расписаний, пакетов, смарт-доступа и смарт-скриптов. Запись SQL-запросов — через NLog.
Пороги логирования (Общие настройки приложения)¶
Для каждого типа смарт-операции задаётся отдельный порог в миллисекундах. Логика общая:
- поле пустое → логирование выключено;
- 0 → логируются все вызовы;
- >0 → логируются только вызовы дольше порога.
⚠️ Минимально допустимое значение — 100 мс (форма не позволит сохранить меньше). Рекомендуемое значение для большинства типов — 200 мс.
| Настройка | Тип | Рекомендация |
|---|---|---|
| Логировать время выполнения smart-запросов дольше, мс | smart expressions | 200 |
| Логировать время выполнения smart-действий дольше, мс | actions | 200 |
| Логировать выполнение smart-пакетов дольше, мс | packs (с 2.264 «Кассиопея» — также смарт-расписания) | 200 |
| Логировать выполнение smart-доступа дольше, мс | smart access | 200 |
| Логировать SQL-запросы | NLog SQL | 200 (по умолчанию) |
| Логировать обращение в WS из БД дольше, мс | внешние HTTP-вызовы из SQL | 5000 |
| Логировать обращения к опубликованным объектам дольше, мс | publications | по необходимости |
| Ограничение длины трейса ошибок, кб | exception traces | 2 кб (по умолчанию) |
Связанные тонкие настройки:
- Логировать тело запроса к WS из БД — флаг. Если включён, тело запроса пишется в «Входящие параметры», тело ответа — в «Доп. информация» лога автоматизации.
- Запускать SMART-запросы и фильтры с использованием ReadUncommitted транзакций — устаревшая (не используется). Для MS SQL Server включала отдельную транзакцию с уровнем изоляции
READ UNCOMMITTEDдля смарт-выражений; на PostgreSQL не применяется (требовала бы prepared transactions). На PG разрешено подавление ambient-транзакции (SuppressTransaction) для смарт-выражений с отдельной строкой подключения (SmartConnectionString).
Глубина рекурсии смарт-пакетов¶
Параметр «Глубина рекурсии смарт-пакетов» (значение по умолчанию — 10) ограничивает количество рекурсивных вызовов смарт-действия в рамках одного потока (поток определяется TaskID + UserID + текущим контекстом). При превышении смарт-действие не выполняется, ошибка фиксируется в журнале ошибок.
⚠️ Проверка не применяется к пакетам, выполняющимся в рамках расписаний, и к циклическим пакетам.
Уровень детализации скриптов¶
Настройка SmartScriptLogLevel управляет объёмом записей от скриптов.
| Значение | Записываются | Макс. сообщений за выполнение |
|---|---|---|
Debug |
Все: debug + info + error | debug ≤ 10, info ≤ 30, error ≤ 50 |
Info |
Информационные + ошибки | info ≤ 30, error ≤ 50 |
Error (по умолчанию) |
Только ошибки | error ≤ 50 |
Методы в скриптах: SS.logDebug(), SS.logInfo(), SS.logError() (Lua/JS/OneScript); console.log(), console.warn(), console.error() (JS). Сообщения сверх лимита отбрасываются.
⚠️
SS.logError()иconsole.error()дублируются в журнал исключений (ExceptionsLog) независимо отSmartScriptLogLevel. Ошибки скриптов всегда видны в журнале «Ошибки» как типSmartScript.⚠️ При ручном запуске скрипта из интерфейса администрирования в журнал автоматически записывается текст исполняемого скрипта и пользователь-инициатор.
Идентификация в стек-трейсах и ExceptionsLog: формат SmartScript {ID} ("{Название}").
Реализация и затронутые файлы — см. known-issues.md § 6 «SmartScript Execution Logger».
План запроса (только PostgreSQL)¶
Колонка «План запроса» отображается при условиях:
- СУБД — PostgreSQL
- Включено логирование SQL-запросов в общих настройках приложения
- Задана настройка
LogPlanExecution(порог в миллисекундах) - Фактическое время выполнения превысило порог
CustomSettings — таймауты и логирование скриптов¶
Ключи пользовательских настроек, влияющие на выполнение и логирование скриптов:
| Ключ | Тип / По умолчанию | Назначение |
|---|---|---|
SmartScriptJSEngineTimeoutMinutes |
int (мин) | Таймаут выполнения JavaScript SmartScript в движке Jint. Применяется как к таймауту скрипта, так и к PromiseTimeout. Изменение вступает в силу без перезапуска сервера |
LogPlanExecution |
int (мс) | Порог для записи плана выполнения SQL-запроса в журнал автоматизации (только PG, см. выше) |
Расписание (SmartRecurrence)¶
Где настраивается:
- Настройки категории → Смарты → Расписания
- Общие смарты (
/administration/smart-packs) — для расписаний без привязки к конкретной категории - Admin API (
/api/admin/smart/recurrences, GET/POST/PUT) — программное создание расписаний
Механизм периодического запуска пакетов действий по таймеру. В отличие от смарт-правил, не привязан к событию — запускается заданием SmartRecurrenceJob.
Список расписаний¶
Расписания с ошибками выделены красным. Колонка «Из лимита» — накопленное число неудачных попыток; «Лимит» — максимально допустимое (соответствует настройке «Попыток выполнения»).
Поля формы¶
Поля формы расписания:
| Настройка | Описание |
|---|---|
| Активно | Включает/выключает расписание. Отключённое расписание сохраняется, но не запускается. |
| Интервал | Частота запуска: Ежеминутно / Ежедневно / Еженедельно / Ежемесячно / Ежегодно. Синтаксис отличается от cron — настраивается через форму, не строкой. |
| Начало повторения | Дата и время первого запуска. |
| Прекратить после | Дата и время, после которых расписание не запускается, даже если интервал наступает. |
| Повторять до | Конечная дата действия расписания; после достижения выполнение прекращается. |
| Вложенные файлы | Режим работы с файлами задач: «Не копировать» / «Использовать ссылки на оригинал» / «Создать новые копии». |
| Попыток выполнения | Максимальное число повторных попыток при ошибке. По умолчанию: 5, минимум: 1. При превышении расписание становится красным и не запускается до сброса счётчика. |
| Асинхронно | Пакет выполняется в отдельном потоке. По умолчанию все расписания используют один поток — «тяжёлый» пакет может задержать остальные. Флаг устраняет это: пакет запускается параллельно. |
| Режим выполнения | «Вне контекста задачи» — пакет выполняется независимо от конкретной задачи (доступен ограниченный набор действий). «Для каждой задачи [смарт-фильтр]» — пакет выполняется для каждой задачи категории, удовлетворяющей условию фильтра. |
| Пакет действий | Пакет, который запускается в назначенное время. |
| Игнорировать ошибки в процессе выполнения | Если включено — при ошибке на одной задаче выполнение продолжается для следующих. По умолчанию выключено: ошибка прерывает весь запуск. |
Операции со строкой расписания¶
Действия над строкой расписания:
| Действие | Как вызвать |
|---|---|
| Создать | Кнопка «Создать смарт-расписание» над таблицей |
| Редактировать | Клик по строке или контекстное меню → «Редактировать» |
| Принудительно выполнить | Контекстное меню → «Выполнить» — запускает пакет вне графика |
| Сбросить счётчик ошибок | Контекстное меню → «Сбросить счётчик неудачных попыток» — расписание перестаёт быть красным и снова доступно |
| Удалить | Контекстное меню → «Удалить» |
Ограничения¶
Ограничения расписаний:
- Расписание в настройках категории работает только в рамках этой категории и только при наличии хотя бы одной задачи. Для задач из другой категории — используй расписания в Общих смартах.
- Пакеты с действием «Отменить» недоступны для расписаний.
- Проверка глубины рекурсии смарт-пакетов (см. выше) к расписаниям не применяется.
Смарт-фильтр в режиме «для каждой задачи»¶
Если фильтр был создан как смарт-выражение, а затем преобразован в TSQL, он по умолчанию содержит условие привязки к контексту задачи:
WHERE ([Extent1].[TaskID] = @ContextID) AND [...]
При использовании в расписании это условие нужно убрать: у расписания нет контекста одиночной задачи.
Логирование¶
С версии 2.264 «Кассиопея» выполнение расписаний логируется через настройку «Логировать выполнение smart-пакетов дольше, мс» (см. раздел «Журнал автоматизации» выше).
Типичные ошибки настройки¶
Частые проблемы настройки смарт-действий и где их искать:
| Симптом | Причина | Где проверить | SQL-диагностика |
|---|---|---|---|
| Правило не срабатывает | Неверный EventID или ParameterValue | Форма general-smart → EventID, ParameterValue |
select ID, Name, EventID, ParameterValue, IsFilter, SubcatID from dbo.SmartExpressions where SubcatID = {id} and IsFilter = 0 |
| Правило срабатывает дважды | Дубль в EventsActions + правило на глобальном уровне | привязки событий к пакетам | select * from dbo.EventsActions where SubcatID = {id} and EventID = {eventId} |
| Смарт-доступ не пересчитывается | Не настроены триггеры (ExtParams/Groups) | Формы smart-access-trigger-* |
select sa.Name, count(te.Id) as TriggerEP, count(tg.Id) as TriggerGrp from dbo.SmartAccess sa left join dbo.SmartAccessTriggerExtParams te on sa.ID = te.SmartAccessId left join dbo.SmartAccessTriggerGroups tg on sa.ID = tg.SmartAccessId group by sa.Name |
| Массовые тормоза при изменении ДП | Слишком широкий триггер смарт-доступа (все ДП категории) | Форма smart-access-trigger-extparams |
select sa.Name, count(*) as TriggerCount from dbo.SmartAccessTriggerExtParams te inner join dbo.SmartAccess sa on te.SmartAccessId = sa.ID group by sa.Name order by count(*) desc |
| Действие в пакете не выполняется | Асинхронное правило, очередь заполнена / остановлена | Форма message-flows → HasErrors |
select FlowName, HasErrors, FailedAttemptsCounter from dbo.MessageFlows where HasErrors = 1 |
| Произвольное событие не вызывается | Неверный Code или SubcatId | Форма custom-events |
select * from dbo.CustomEvents where SubcatId = {id} |
JSON-синтаксис модификации ДП¶
Форматы значений для смарт-действий «Изменить значение ДП», «Копировать значение ДП» и аналогичных. Для сложных типов ДП платформа ожидает JSON-строку.
SelectUsers — Выбор пользователей¶
Формат значения для ДП «Выбор пользователей»:
{"Users":{"Added":[ID1,ID2],"Deleted":[ID3]},"Groups":{"Added":[ID4]},"OrgUnits":{"Deleted":[ID5]}}
- Ключи верхнего уровня:
Users,Groups,OrgUnits - Операции внутри:
Added(добавить),Deleted(удалить) - Значения — ID (int), преобразованные в строку
- Три способа указания значений: напрямую (ID), через другое ДП, через SQL-запрос
При изменении через смарт-действие: если ДП допускает несколько элементов, новые значения добавляются к существующим, а не замещают их.
Email — Адресаты¶
Формат значения для ДП «Адресаты»:
{"ValsToAdd":[{"UserId":1821},{"Email":"user@example.com"}],"ValsToDelete":[{"UserId":14}]}
ValsToAdd— добавить адресатовValsToDelete— удалить адресатов- Каждый адресат:
{"UserId": ID}или{"Email": "address"}
Таблица — строки и ячейки¶
Ячейка: {ID_колонки:{"First":"значение","Second":"доп.значение"}}
First— основное значение (тип должен соответствовать типу колонки)Second— только для выпадающих списков (колонка значения). Для остальных типов — пропускается илиnull
| Операция | Префикс | Синтаксис | Пример |
|---|---|---|---|
| Добавить строку | + |
'+[{111:{"First":"текст"},222:{"First":"123"}}]' |
ID строки не указывается |
| Изменить строку | = |
'={"First":"ID_строки","Second":{111:{"First":"новое"}}}' |
ID строки в кавычках |
| Удалить строку | - |
'-ID_строки' |
'-111' |
| Массовое обновление | = |
'=[{"First":"1","Second":{...}},{"First":"2","Second":{...}}]' |
Массив объектов |
| Заменить все (full replace) | # |
'#{"1":{11:{"First":"x"}},"2":{11:{"First":"y"}}}' |
Удаляет отсутствующие строки, изменяет существующие, добавляет новые |
| Пересоздать все | \| |
'|{"1":{...},"2":{...}}' |
Удаляет все строки, затем создаёт из переданных данных |
⚠️ Если ID существующих строк неизвестны — используйте оператор
\|. При#строки с отсутствующими ID будут удалены.⚠️ Если в таблице есть скрытые колонки — они обязаны быть заполнены, иначе возникнет ошибка.
Несколько операций в одном выражении объединяются через #:
'-111#222|||текст_комментария'
Массовое обновление нескольких строк — через массив объектов (префикс =).
Выбор нескольких задач¶
Операции с ДП «Выбор нескольких задач»:
| Операция | Синтаксис | Пример |
|---|---|---|
| Добавить задачу | ВСтроку(ID) |
"123456" |
| Добавить несколько | ID + "]\|\|[" + ID |
"111111]\|\|[222222]\|\|[333333" |
| Удалить задачу | "-" + ВСтроку(ID) |
"-123456" |
| Обновить комментарий | "=" + ID + "\|\|" + "текст" |
"=123456\|\|комментарий" |
| Полная замена | "$" + ID + "]\|\|[" + ID |
"$123]\|\|[456]\|\|[789" — заменяет все значения |
| Несколько операций | Через # |
"-111111#222222\|\|коммент" |
Файл¶
Режимы и форматы значений для ДП «Файл»:
| Режим | Описание |
|---|---|
| Единичный | Без признака «Мультифайл» — обращение как к одному объекту |
| Мультифайл | С признаком «Мультифайл» — обращение как к коллекции |
| Добавить к существующим | Префикс +: '+id1,id2,id3' |
| Версия файла | Формат FileID.VersionID |
| Из другой задачи | Через SQL-запрос к FileStorageFiles + FileStorageFileToTaskLinks |
Экранирование в значениях¶
Правила экранирования спецсимволов в значениях:
| Символ | Экранирование | Пример |
|---|---|---|
" |
\" |
"начало \"ABC\" продолжение" |
\ |
\\ |
"начало \\\\ продолжение" |
' |
'' |
"начало ''ABC'' продолжение" |
\n, \r |
Не экранировать | Работает только для колонок «Большой текст» |
Связанные документы¶
Смежные разделы:
- Каталог действий — 70+ типов смарт-действий с параметрами
- Паттерны и примеры
- Известные проблемы