Автоматизация

Триггеры кнопок

У колонки-кнопки в Интеграме есть действие: промпт ИИ-агенту базы, формула по полям строки или запрос (отчёт). Действие запускается событием: нажатием, при показе, при создании, изменении или удалении записи — при любом способе записи, из таблицы, карточки, API или импорта. Результат пишется в поле записи, и вместо кнопки в ячейке видно готовое значение.

Примеры даны для https://ideav.ru и базы mydb: подставьте адрес своей установки и имя базы. Команды чтения и записи — в справочнике API.

Как это устроено

Кнопка с действием

Колонка базового типа «Кнопка» показывается в таблице как кнопка. Что делает кнопка, записано в её модификаторе — JSON-описании действия. Типов четыре: ссылка, промпт ИИ, формула, запрос.

  • Нажатие кнопки выполняет действие прямо из таблицы или карточки записи.
  • Триггер — то же действие, запущенное событием записи: созданием, изменением, удалением или показом.
  • Настраивается одно и то же: в окне «Редактирование колонки» (шестерёнка колонок → колонка) при базовом типе «Кнопка» появляется блок «Действие кнопки».

Кто может настроить действие? Тот, кто редактирует структуру базы: право на кнопки — то же, что на таблицы и колонки.

Когда срабатывает

За запуск отвечают галки «Запуск» в настройке кнопки (ключ on в JSON):

ЗапускСобытиеГде выполняется
по нажатиюPRESSбраузер (по умолчанию)
при показеREADбраузер: пустая ячейка заполняется при показе таблицы
при созданииCREATEсервер, после создания записи
при измененииUPDATEсервер, после изменения записи
при удаленииDELETEсервер, по значениям удалённой записи
  • Создание, изменение и удаление ловит сервер, поэтому триггер срабатывает при любом способе записи: таблица, карточка, API, пакетная запись, импорт.
  • Колонка без «по нажатию» кнопку не показывает — в ячейке только значение.
  • Ссылка запускается только нажатием; остальные типы работают с любыми событиями.
  • Событий может быть несколько: ["CREATE","UPDATE"] — и при создании, и при изменении.

Результат действия

У промпта, формулы и запроса есть галка «Записывать результат в поле записи» (ключ write).

  • С галкой результат сохраняется в значение этой колонки у записи, и вместо кнопки в ячейке видно значение — с кнопками «Пересчитать» и «Удалить результат».
  • Без галки результат показывается на месте (у промпта — в окне) и никуда не пишется.
  • Если поменять настройку колонки, записанные результаты остаются как были.
  • С событием «при показе» можно включить «Пересчитывать при каждом показе» (ключ recompute): значение считается всегда, не пишется и не показывается сохранённым.

Массовый прогон по строкам

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

Массовый прогон работает только у колонок с запуском по нажатию. Чтобы пересчитать колонку с триггерами, добавьте кнопке событие «по нажатию» — или выполните действие командой _m_action (см. «Настройка через API»).

Четыре типа действий

Промпт ИИ

Текст уходит ИИ-агенту базы и выполняется под учёткой пользователя: того, кто нажал, или заданного в «Выполнять от имени». Агент делает то, что написано в промпте: ищет, считает, создаёт и меняет записи, отвечает текстом.

Модификатор

{"type":"prompt","prompt":"Составь короткое описание товара: {Название}, цена {Цена} ₽. Ответь одним предложением.","write":true,"on":["CREATE"]}
  • С галкой «Записывать результат» к промпту добавляется требование ответить одним значением для поля; ответ пишется в колонку с пометкой ИИ.
  • Задачи кнопок хранятся отдельно от чата; если агент предлагает изменения на подтверждение, они подтверждаются в ИИ-чате базы.
  • Оплата ИИ — как в чате базы: не оплачено, промпт не выполняется (строка в журнале).

Формула

Значение считается по полям строки. Это не JavaScript: доступно только перечисленное в разделе «Формулы и подстановки».

Модификатор

{"type":"formula","formula":"ROUND({Цена} * {Количество}, 2)","write":true,"label":"Сумма","on":["CREATE","UPDATE"]}

Формула пересчитывается при каждом событии из on: в примере — при создании записи и при изменении Цены или Количества (в действии есть ссылки на эти колонки).

Запрос

Выполняется запрос (отчёт) базы по имени или id, результат — первое значение первой строки. Кнопка с запросом — способ вытащить в строку агрегат из других записей: долг контрагента, сумму заказов, ближайшую дату поставки.

Модификатор

{"type":"query","query":"Долг клиента","params":"FR_Клиент=[VAL]","write":true,"label":"Долг","on":["UPDATE"]}

Запрос выполняется так же, как чтение отчёта через API: report/{запрос}?JSON_KV и параметры из params. Как устроены запросы, формулы и фильтры отчётов — в справочнике API, раздел «Запросы (отчёты)».

Запросы в триггерах

Как включить запрос

  • Создайте запрос, если его ещё нет: раздел «Запросы» в базе или команда _d_new (см. «Создать запрос» в справочнике API).
  • В редакторе колонок поставьте базовый тип «Кнопка», в блоке «Действие кнопки» выберите тип «Запрос» и запрос по имени.
  • Впишите параметры — строку фильтров (следующий раздел). Без параметров запрос выполнится с собственными фильтрами, сохранёнными в нём.
  • Включите «Записывать результат в поле записи» — иначе результат показывается на месте и не сохраняется.
  • Отметьте события «Запуск»: обычно «при создании» и «при изменении» колонок, от которых зависит результат.

То же командой API — запрос «Долг клиента» пересчитывается при изменении записи:

Команда

curl -s -X POST -H "X-Authorization: $TOKEN" \
  -F "_xsrf=$XSRF" \
  -F 'action={"type":"query","query":"Долг клиента","params":"FR_Клиент=[VAL]","write":true,"label":"Долг","on":["UPDATE"]}' \
  "https://ideav.ru/mydb/_d_action/643?JSON"

Параметры запроса

params — строка параметров адреса, как у чтения отчёта через API: FR_Колонка=значение — фильтр «равно», TO_Колонка=значение — верхняя граница. Пробелы в именах колонок отчёта пишутся подчёркиванием: FR_Дата_заказа=01.10.2026.

  • В параметрах работают подстановки: FR_Клиент=[VAL] — фильтр по значению первой колонки этой записи, FR_Заказ=[ID], FR_Менеджер={Менеджер}.
  • Параметры перекрывают фильтры, сохранённые в самом запросе, — одна формула запроса работает для всех строк.
  • Результат — первое значение первой строки, как у чтения отчёта с JSON_KV.

Как кнопка выполняет запрос

report/Долг%20клиента?JSON_KV&FR_Клиент=%D0%A0%D0%BE%D0%BC%D0%B0%D1%88%D0%BA%D0%B0

Как выполняется на сервере

Триггер с запросом (и с промптом) выполняется сервером после ответа пользователю: сервер посылает запрос сам себе, как это сделал бы браузер.

  • Запрос идёт с токеном исполнителя — работают его права на запрос.
  • Адрес, по которому сервер обращается к себе: BUTTON_TRIGGER_BASE_URL в include/connection.php, иначе https://{имя сервера} из конфигурации веб-сервера. Заголовок Host клиента не используется — в запросе едет токен исполнителя.
  • Внутренние события передаются дальше параметром bt_chain — см. «Цепочки триггеров».

Если в журнале ошибка связи «запрос …: …», сервер не достучался до себя по https://{имя сервера} (внутренняя сеть, сертификат). Задайте BUTTON_TRIGGER_BASE_URL — адрес, по которому сервер видит сам себя.

Куда пишется результат

  • Первое значение первой строки результата, с галкой «Записывать результат» — в колонку записи от имени исполнителя.
  • При DELETE писать некуда — write не действует, запрос выполняется ради побочных действий.
  • Запрос не вернул строк — результата нет, колонка не меняется.
  • Запрос, удаляющий саму запись, результата не запишет — см. «Граничные случаи».

Формулы и подстановки

Подстановки [ID], [VAL], {Колонка}

Во всех шаблонах действия — адресе, промпте, формуле, параметрах запроса, условии — доступны:

ПодстановкаЗначение
[ID]id записи
[VAL]значение первой колонки записи
{Название колонки}значение поля этой строки (по отображаемому имени колонки, регистр не важен)

Колонки, на которые ссылается действие, определяют и момент срабатывания UPDATE: триггер запускается, когда изменилась хотя бы одна из них. Действие без ссылок срабатывает на любое изменение записи, кроме записи в свою колонку.

Синтаксис формул

  • Числа (1.5), строки в кавычках ("текст"), [ID], [VAL], {Колонка}. Значения полей, похожие на число (1 250,5), считаются числами.
  • Арифметика + - * / %; & склеивает строки, + тоже склеивает, если хотя бы одна сторона не число.
  • Сравнение = == != <> < <= > >=, логика && || !, условие a ? b : c.
  • Функции: ROUND(x,n) FLOOR CEIL ABS MIN MAX SUM AVG NUM IF(c,a,b) LEN UPPER LOWER TRIM LEFT(s,n) RIGHT(s,n) CONCAT TODAY() DAYS(до, от) ADDDAYS(дата, n).
  • Даты — в формате ДД.ММ.ГГГГ. TODAY() — дата сервера с поправкой на часовой пояс пользователя.

Примеры

ROUND({Цена} * {Количество}, 2)
IF({Долг} > 0, "Есть долг", "Расчёты закрыты")
{Фамилия} & " " & {Имя}
ADDDAYS({Дата отгрузки}, 14)

Условие запуска

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

Промпт только для оплаченных заказов — командой API

curl -s -X POST -H "X-Authorization: $TOKEN" \
  -F "_xsrf=$XSRF" \
  -F 'action={"type":"prompt","prompt":"Напиши письмо-благодарность для {Название}","when":"{Статус} = \"Оплачен\"","write":true,"on":["UPDATE"]}' \
  "https://ideav.ru/mydb/_d_action/643?JSON"

Типовые сценарии: «когда создают запись — заполни поле» это on:["CREATE"] и галка записи результата; «когда меняется Цена» это on:["UPDATE"] и ссылка {Цена} в действии или в условии.

Исполнитель и права

От чьего имени выполняется

«Выполнять от имени» (ключ user) — логин пользователя, под которым выполняется действие: запрос, промпт, запись результата. Пусто — текущий пользователь (у триггеров без нажатия — исполнитель по умолчанию).

  • Исполнитель хранится id записи пользователя, поэтому переименование логина ничего не ломает; команда _d_action принимает и логин, и id.
  • Ограничений на выбор исполнителя нет: кто может добавить кнопку, тот владеет базой.
  • Исполнитель удалён или закрыт (нет роли) — действие не выполняется, в ответе и журнале предупреждение.
  • У исполнителя нет токена — он выпускается автоматически, как при входе.

Права

  • Настроить действие — право редактирования типов, как у прочих изменений структуры.
  • Выполнить действие командой _m_action — право на чтение записи.
  • Запрос выполняется под токеном исполнителя — работают его права на запрос, промпт расходует его оплату ИИ.
  • Результат в колонку пишется от имени исполнителя — в журнале видно, кто «нажал».

Настройка через API

Команда _d_action

Действие записывается в модификатор колонки командой _d_action; права — как у прочих изменений структуры.

Задать действие

curl -s -X POST -H "X-Authorization: $TOKEN" \
  -F "_xsrf=$XSRF" \
  -F 'action={"type":"formula","formula":"ROUND({Цена} * {Количество}, 2)","write":true,"label":"Сумма","on":["CREATE","UPDATE"]}' \
  "https://ideav.ru/mydb/_d_action/643?JSON"

Снять действие

curl -s -X POST -H "X-Authorization: $TOKEN" \
  -F "_xsrf=$XSRF" \
  -F "action=" \
  "https://ideav.ru/mydb/_d_action/643?JSON"
  • Ошибка «Неверное описание действия кнопки: …» называет причину: не JSON, неизвестный type, неизвестное событие, ссылка с событием кроме PRESS, пользователь из user не найден.
  • Поля, не относящиеся к выбранному типу, отбрасываются; строки обрезаются до 8000 символов.
  • Редактор структуры (_d_attrs) сохраняет действие, меняя только стандартные флаги модификатора.

Ключи действия

Действие — JSON под ключом action модификатора; остальные ключи (required, alias, …) не трогаются. Общие ключи (кроме link, у которой только label):

КлючЗначениеПо умолчанию
onмассив событий из PRESS, CREATE, UPDATE, DELETE, READ; строка "CREATE,UPDATE" тоже принимается["PRESS"]
labelподпись кнопкибез подписи — только значок
writetrue — записывать результат в поле записиfalse
recomputetrue — при READ считать при каждом показеfalse
whenформула-условие; действие выполняется, если она истиннавсегда
userисполнитель: логин или id записи пользователя (таблица 18)текущий пользователь

Ключи со значением по умолчанию в модификатор не пишутся. У каждого типа свои поля: link — url и newTab (по умолчанию true), prompt — prompt, formula — formula, query — query (имя или id) и params.

Выполнение и запись результата

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

Выполнить действие

curl -s -X POST -H "X-Authorization: $TOKEN" \
  -F "_xsrf=$XSRF" \
  "https://ideav.ru/mydb/_m_action/641?JSON&col=643"
  • Действие выполняется от имени user колонки; ответ — {"result":"…","written":true} или для промпта {"job":{…}} — задача агенту, результат придёт в колонку.
  • nowrite=1 — не записывать результат (показ с пересчётом).
  • Записать результат вручную можно и прямой записью в колонку; пустое значение результат удаляет.

Записать результат в колонку 643 записи 641

curl -s -X POST -H "X-Authorization: $TOKEN" \
  -F "_xsrf=$XSRF" \
  -F "t643=Итого: 1250,50" \
  "https://ideav.ru/mydb/_m_set/641?JSON"

Готовые примеры

  • Считать сумму при создании и при изменении цены или количества — формула с on:["CREATE","UPDATE"] (пример в «Команде _d_action»).
  • Заполнить поле ИИ при создании записи — промпт с on:["CREATE"] и галкой записи результата (пример в «Промпт ИИ»).
  • Пересчитывать долг клиента при изменении записи — запрос с FR_Клиент=[VAL] (пример в «Как включить запрос»).
  • Писать письмо только оплаченным — промпт с условием {Статус} = "Оплачен" (пример в «Условие запуска»).

Событие UPDATE срабатывает только когда изменилась колонка, на которую ссылается действие. Триггер «на любое изменение» — действие без ссылок на колонки; в свою колонку изменение не запускает повторный пересчёт.

Конструктор действия

Собрать JSON действия

Отметьте тип действия, события запуска и заполните поля — конструктор соберёт JSON и готовую команду curl для _d_action. Ключи со значениями по умолчанию в JSON не попадают — как и требует ядро.

Имена колонок в {…} должны совпадать с отображаемыми именами в метаданных таблицы; имя запроса — с названием запроса в базе.

Конструктор работает на странице в браузере: откройте https://ideav.ru/triggers.html#builder.

Интерактивный конструктор действия работает на странице в браузере: откройте https://ideav.ru/triggers.html#builder.

Как выполняются серверные триггеры

Сначала ответ, потом работа

Пользователь получает ответ не дожидаясь триггеров. Синхронно проверяются только исполнитель, условие, формула (пробное вычисление) и лимит промптов — их отказы приходят в warnings ответа. Запись результата, запрос и промпт выполняются после отправки ответа, по порядку колонок; каждое действие перечитывает запись и видит результаты предыдущих.

  • Срабатывают после успешных _m_new, _m_set, _m_save (копия записи — это CREATE), _m_del и каждой операции _m_batch.
  • UPDATE — если изменилась колонка, на которую ссылается действие ({Колонка} в формуле, промпте, параметрах, условии; [VAL] — первая колонка). Изменения определяются сравнением записи до и после.
  • DELETE — по значениям записи до удаления; write не действует.
  • Собственные записи ИИ-агента (client=ai) триггеров не запускают — агент не будит сам себя.

Цепочки триггеров

Запись триггера сама может запустить триггеры других колонок: формула посчитала сумму — другой триггер увидел новую сумму и сработал.

  • Цепочка (id колонок) общая для всех записей запроса и передаётся дальше параметром bt_chain и в контекст ИИ-агента.
  • Одна колонка не срабатывает дважды в одной цепочке.
  • Длина цепочки — не больше 3.

Лимиты и оплата ИИ

  • Промптов — не больше 60 задач триггеров в час на базу; сверх лимита — предупреждение в ответе и в журнале.
  • Оплата ИИ проверяется как в чате базы: не оплачено — промпт молча пропускается (строка в журнале).
  • Пока задача по этой записи и колонке в работе (до 15 минут), повторная не ставится — двойное сохранение не плодит задачи.
  • Формула и запрос пересчитываются с каждого запуска: последний запуск побеждает.

Журнал

Всё, что делают триггеры, видно в журналах базы: logs/{db}_log.jsonl и {db}_sql.jsonl.

  • Запись триггера — под логином исполнителя (ivanov), запись ответа агента — ivanov~ai.
  • Служебные строки триггеров — с префиксом [button].
  • Задачи промптов кнопок хранятся отдельно от задач чата: ai_agent_trigger_jobs_{db}.json во временном каталоге сервера.

Граничные случаи

Что если…

СитуацияПоведение
Запрос или промпт триггера удаляет саму записьОтвет пользователю уже отдан. Результат в удалённую запись не пишется, остальные триггеры по этой записи пропускаются (строка в журнале).
Запись удалена или изменена, пока шла задача ИИПеред записью ответа проверяется, что запись есть и её id не занят другой. Если значение колонки с постановки задачи поправил человек — ответ не пишется.
Несколько триггеров одной записи и событияВыполняются по порядку колонок; каждый пишет только свою колонку и видит результаты предыдущих.
Запрос триггера меняет другие записи той же таблицыИх триггеры запускаются с той же цепочкой: та же колонка не срабатывает повторно, глубина не больше 3.
Запись триггера нарушает уникальность или другую проверку ядраПользовательская запись уже сохранена и отдана; отказ — в журнал, остальные триггеры выполняются.
Триггер в пакете _m_batchСобытия определяются по каждой операции, работа идёт после ответа на весь пакет. Повтор того же события по той же записи за запрос выполняется один раз.
Исполнитель удалён, закрыт или без токенаУдалён или закрыт — триггер не выполняется, предупреждение; нет токена — выпускается.
Тот же триггер срабатывает дважды подрядПромпт: пока задача в работе (до 15 минут), вторая не ставится. Формула и запрос: последний запуск побеждает.

Если триггер не срабатывает

Что проверить

  • В карточке записи нет кнопки с промптом, формулой или запросом — так задумано: такие действия выполняются из таблицы, в карточке работают только кнопки-ссылки.
  • Промпт молча не сработал — проверьте оплату ИИ базы и лимит 60 задач в час.
  • Триггер «при изменении» не запускается — в действии нет ссылок на изменённую колонку: UPDATE ловит только колонки из {…} действия и условия ([VAL] — первая колонка).
  • Запрос не вернул строк — результата нет. Проверьте запрос отдельно: report/Имя запроса?JSON_KV с теми же параметрами.
  • В журнале ошибка связи «запрос …: …» — сервер не достучался до себя; задайте BUTTON_TRIGGER_BASE_URL в include/connection.php.
  • Исполнитель удалён или закрыт — назначьте живого исполнителя в «Выполнять от имени».
  • Запись результата отклонена проверкой ядра (уникальность, обязательность) — отказ в журнале, запись пользователя при этом не страдает.
  • Ссылка не срабатывает при создании записи — ссылки работают только по нажатию.

Журнал — первый источник правды: строки триггеров помечены [button], в _log.jsonl видно исполнителя и предупреждения, в _sql.jsonl — сами записи значений.