Автоматизация
Триггеры кнопок
У колонки-кнопки в Интеграме есть действие: промпт ИИ-агенту базы, формула по полям строки или запрос (отчёт). Действие запускается событием: нажатием, при показе, при создании, изменении или удалении записи — при любом способе записи, из таблицы, карточки, API или импорта. Результат пишется в поле записи, и вместо кнопки в ячейке видно готовое значение.
Примеры даны для https://ideav.ru и базы mydb: подставьте адрес своей установки и имя базы. Команды чтения и записи — в справочнике API.
Как это устроено
Кнопка с действием
Колонка базового типа «Кнопка» показывается в таблице как кнопка. Что делает кнопка, записано в её модификаторе — JSON-описании действия. Типов четыре: ссылка, промпт ИИ, формула, запрос.
- Нажатие кнопки выполняет действие прямо из таблицы или карточки записи.
- Триггер — то же действие, запущенное событием записи: созданием, изменением, удалением или показом.
- Настраивается одно и то же: в окне «Редактирование колонки» (шестерёнка колонок → колонка) при базовом типе «Кнопка» появляется блок «Действие кнопки».
Кто может настроить действие? Тот, кто редактирует структуру базы: право на кнопки — то же, что на таблицы и колонки.
Когда срабатывает
За запуск отвечают галки «Запуск» в настройке кнопки (ключ on в JSON):
| Запуск | Событие | Где выполняется |
|---|---|---|
| по нажатию | PRESS | браузер (по умолчанию) |
| при показе | READ | браузер: пустая ячейка заполняется при показе таблицы |
| при создании | CREATE | сервер, после создания записи |
| при изменении | UPDATE | сервер, после изменения записи |
| при удалении | DELETE | сервер, по значениям удалённой записи |
- Создание, изменение и удаление ловит сервер, поэтому триггер срабатывает при любом способе записи: таблица, карточка, API, пакетная запись, импорт.
- Колонка без «по нажатию» кнопку не показывает — в ячейке только значение.
- Ссылка запускается только нажатием; остальные типы работают с любыми событиями.
- Событий может быть несколько:
["CREATE","UPDATE"]— и при создании, и при изменении.
Результат действия
У промпта, формулы и запроса есть галка «Записывать результат в поле записи» (ключ write).
- С галкой результат сохраняется в значение этой колонки у записи, и вместо кнопки в ячейке видно значение — с кнопками «Пересчитать» и «Удалить результат».
- Без галки результат показывается на месте (у промпта — в окне) и никуда не пишется.
- Если поменять настройку колонки, записанные результаты остаются как были.
- С событием «при показе» можно включить «Пересчитывать при каждом показе» (ключ
recompute): значение считается всегда, не пишется и не показывается сохранённым.
Массовый прогон по строкам
Чтобы выполнить действие по многим строкам сразу: включите выбор строк (чекбоксы), отметьте нужные — на панели таблицы появится кнопка колонки с числом отмеченных строк. Она выполняет действие по отмеченным строкам по очереди.
Массовый прогон работает только у колонок с запуском по нажатию. Чтобы пересчитать колонку с триггерами, добавьте кнопке событие «по нажатию» — или выполните действие командой _m_action (см. «Настройка через API»).
Четыре типа действий
Ссылка
Переход по адресу — в новой вкладке (по умолчанию) или в этой же.
Модификатор
{"type":"link","url":"https://ideav.ru/card/[ID]","label":"Открыть"}
- В адресе работают подстановки
[ID]и[VAL]— их подставляет и сервер, поэтому ссылка одна и та же из таблицы, карточки и API. - Только нажатие: ссылка не бывает триггером.
- Колонка без действия, но с адресом в
defaultмодификатора — тоже обычная ссылка.
Промпт ИИ
Текст уходит ИИ-агенту базы и выполняется под учёткой пользователя: того, кто нажал, или заданного в «Выполнять от имени». Агент делает то, что написано в промпте: ищет, считает, создаёт и меняет записи, отвечает текстом.
Модификатор
{"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 | подпись кнопки | без подписи — только значок |
write | true — записывать результат в поле записи | false |
recompute | true — при 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 — сами записи значений.