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

Смарт-действия — Администрирование

Раздел охватывает автоматизацию: смарт-правила (событие → условие → пакет действий), смарт-доступ, очереди событий, потоки сообщений и смарт-скрипты. Администрирование использует два механизма:

  • Автоадминка (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 = 1EventID и ParameterValue не используются при вычислении фильтра (это фильтр, не правило; в записи БД поля могут быть заполнены)
  • IsFilter = 0EventID обязателен (определяет триггер)
  • 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.

Ключевые правила, важные для настройки правил:

  1. Отменяемые события (префикс «Перед …»). Если событие начинается со слова «Перед …» (BeforeTaskCreate, BeforeStateChange, BeforeExtParamChange и т. п.), пакет действий может отменить событие через действие Отменить. Используется для запретов («нельзя понизить приоритет, если заказчик — гендиректор»). После «После …» отмена невозможна. При отмене смены значения ДП «Таблица» (BeforeExtParamChange) в модальном окне выводится только текст, заданный в действии Отменить, без системного префикса — единообразно с ДП-лукапами.

  2. Глобализация категорийных событий (с v2.268 Скульптор). Событие, помеченное флагом CanBeGlobal, можно привязать к пакету в Общих SMART без SubcatID — пакет сработает в любой задаче системы. Сначала отрабатывают категорийные пакеты, затем глобальные. Первое событие с флагом — AfterPostComment (29). Список глобализируемых событий расширяется в новых версиях (такие события помечены ⚑ в каталоге). Например, флаг получили смарт-события AI-подсказок в чатах — WhenStartReply (196) и WhenWritingComment (201).

  3. Изначально глобальные группы. Группы Глобальные, Exchange, Пользователи работают только в Общих SMART без привязки к категории — это историческое поведение, не путать с глобализированными.

  4. События ресурсного планирования — два разных «Исполнителя». В контекстных параметрах присутствуют два различающихся параметра:

Параметр Что передаётся Когда использовать
Исполнитель (пользователь) UserID пользователя Для внесения затрат по сотруднику
Исполнитель (задача) TaskID задачи из Справочника ресурсов (раздел «Системный») Для внесения затрат по ресурсу

Не взаимозаменяемы — путаница приводит к ошибочной аналитике.

  1. @eventParam* для специальных событий. Часть событий передаёт массив (например, в ресурсном планировании параметр «Дата» — массив; читается через OPENJSON в SQL). Для EventID=64 («Во время открытия задачи») контекст интерфейса приходит в @eventParam1. Для Exchange-событий (новое письмо, изменено событие в календаре) подробности встречи/письма не приходят в параметры — нужно дополнительно вызвать смарт-действие «Получить встречу» / «Получить письмо».

  2. Нумерация 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 Название события (отображается в интерфейсе)

Назначение

Произвольные события позволяют запустить пакет действий для множества задач категории по условию. Типичные сценарии:

  • Массовый пересчёт данных во всех задачах категории (по кнопке или расписанию).
  • Инициирование обработки задач из другой категории из контекста текущей.

В отличие от смарт-правил, которые реагируют на событие одной задачи, произвольное событие адресуется нескольким задачам сразу через смарт-отбор.

Как настроить

Настройка произвольного события состоит из трёх шагов:

  1. Создать событие — в настройках категории добавить запись с уникальным Code и названием.
  2. Привязать обработчик — создать смарт-правило на системное событие «При произвольном событии», указав конкретный Code.
  3. Вызвать событие — через смарт-действие «Инициировать произвольное событие» из любой категории. В действии указывается:
  4. Целевое событие (категория + код)
  5. Сфера действия: текущая задача / конкретный 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 из указанной категории (снимает ограничение «только из репозитория»)

⚠️ Максимальная глубина рекурсии include5 уровней. В подключаемых скриптах не должно быть вычислений, только определения функций и глобальных переменных.

Интерфейс редактора скриптов

Элементы интерфейса редактора скриптов:

  • — история версий скрипта (каждый 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 (~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)

Колонка «План запроса» отображается при условиях:

  1. СУБД — PostgreSQL
  2. Включено логирование SQL-запросов в общих настройках приложения
  3. Задана настройка LogPlanExecution (порог в миллисекундах)
  4. Фактическое время выполнения превысило порог

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 Не экранировать Работает только для колонок «Большой текст»

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

Смежные разделы: