====== Создание триггера ======
Триггер в ADVANTA содержит указание, когда он должен сработать, набор проверок, когда нужно выполнить набор действий, и сам набор действий. \\
Кнопка создания триггера расположена в разделе "**Управление триггерами**". \\
{{:product:triggers:снимок_экрана_2022-08-18_в_17.14.21.png?nolink|}}
==== Страница создания нового триггера ====
{{:product:triggers:снимок_экрана_2022-08-18_в_17.29.25.png?nolink|}}
Содержит следующие поля: \\
1. **Название** \\
2. **Описание** \\
3. **Теги** — используются для дальнейшего поиска триггера в списке на странице "Управление триггерами" \\
4. **Таймаут**, сек \\
5. Выпадающий список "**Порядок обработки событий**" с 3 вариантами:
* **Через очередь данного триггера** – соответствующие события, на которые подписан триггер, обрабатываются в рамках одной очереди данного триггера: новое событие не будет обработано, пока не завершится обработка предыдущего события этого триггера.
* **Через глобальную очередь** – все события, на которые подписан созданный триггер, обрабатываются в рамках одной глобальной очереди модуля триггеров (каждый соответственно своим триггером).
* **Параллельно** – все события, на которые подписан триггер, обрабатываются параллельно (каждый соответственно своим триггером).
6. Переключатель «**Выполнять повторно при сбое**». \\
7. Выпадающий список «**События**» – перечень всех событий, которые генерирует Система при выполнений каких либо действий в ней. Исчерпывающий перечень событий на которые можно создать триггер. \\
8. Окно «**Условие**» – окно для записи, отображения и изменения кода C#. \\ В данном окне необходимо написать код условия, который должен возвращать либо значение false, либо значение true. Необходимо вернуть false, если скрипт выполнять не требуется. \\ {{:product:triggers:снимок_экрана_2022-08-18_в_17.34.59.png?nolink|}}
9. Окно «**Скрипт**» – окно для записи, отображения и изменения кода C#. \\ В данном окне необходимо написать код основной логики (действий) триггера, который будет выполняться при выполнении Условия. \\
10. Кнопки "**Опубликовать**" и "**Удалить**". \\
==== Немного о создании триггеров в целом ====
Половина работы триггера: это понять, на какие события он должен реагировать.
Фильтрация событий проходит в несколько этапов с помощью 3 основных инструментов, которые дополняют друг друга.
- Простой фильтр на события, и связанные с ними объекты, который есть прямо в интерфейсе модуля триггеров в **выпадающем списке**.
- **LINQ-запрос(ы)** - используются (при необходимости) в фильтрации событий и в самих скриптах. Подробнее о настройке LINQ-запросов - [[product:linq:new|здесь]].
- Дополнительная логика, прописанная в окне **"Условие"** для последней тонкой фильтрации событий.
События, которые попали под условия фильтров, запускают написанный скрипт. Результатом работы скрипта могут быть небольшие вычисления, создание новых записей в справочнике, новых объектов, изменение статусов, изменение значений реквизитов, их блокировка и т.д. Здесь мы описали [[product/triggers/library|примеры готовых решений]] на основе триггеров.
В Системе можно создать [[product:linq:new|источник данных LINQ]] и задать ему референсный ключ, чтобы в дальнейшем по нему вызвать этот источник в **Условии** триггера или в самом **Скрипте**.
==== Вызов API в триггерах ====
Триггеры работают через [[product/api/list|интеграционное API]] ADVANTA ⇒ Всё, что можно сделать через API, триггер может сделать в системе.
Перед вызовом API нужно везде указывать ''await'', иначе произойдет инициация кода вызова без ожидания результата.
Создание нового объекта - пример:
var newItem = new Api.Projects.CreateProjectDataContract
{
// some code ...
};
// create new Item using ADVANTA API
var newItemID = await Api.Projects.CreateProjectAsync(newItem);
Триггер по мере необходимости создает SOAP-клиенты для взаимодействия с SOAP API (иначе пришлось бы перед каждым вызовом API создавать нужные SOAP-клиенты). \\ По завершению триггера все открытые триггером SOAP-клиенты закрываются.
Если не дождаться через ''await'' вызова API, то может произойти завершение работы триггера раньше, чем завершится вызов. \\ В итоге произойдет ошибка при вызове.
==== Локальные функции ====
Если требуется определить собственную локальную функцию/процедуру для использования в скрипте триггера, то ее описание должно быть сделано с использованием префикса ''async'' в следующем формате \\
async Task MyFunctionName()
{
// your code ...
return result;
}
где вместо ''string'' необходимо указать тип переменной, которая будет возвращаться из локальной функции.
\\
Если возвращать из функции ничего не требуется, то определение функции будет в формате:\\
async Task MyFunctionName()
{
// your code ...
}
\\
Для вызова созданной таким образом локальной функции/процедуры внутри скрипта триггера, рекомендуется использовать префикс ''await'' для ожидания ее завершения.
var result = await MyFunctionName();
\\
Пример объявления локальной функции и ее вызова:
async Task CreateLog(string Text)
{
TriggerConsole.WriteLine(Text);
await System.Threading.Tasks.Task.Delay(1000);
}
for(int i = 0; i < 10; i++)
{
await CreateLog(i.ToString());
}
==== Встроенные переменные ====
''Context.ApplicationId'' - ID приложения Адванты, если настроено \\
''Context.EventId'' - ID сообщения в шине \\
''Context.EventSentTime'' - Время отправки сообщения из системы \\
''Context.Host'' - Адрес системы, по которому она установлена \\
''Context.PersonId'' - ID пользователя вызвавшего появление события \\
''Context.PrincipalId'' - ID внутреннего пользователя системы (обычно не используется) \\
''Context.SessionId'' - ID сессии, от которой модуль триггеров работает в системе. Нужен для передачи в API методы \\
''Event'' - Содержит параметры события, на которое сделан триггер. \\ Контекстно определяется тем событием, на которое написан триггер. \\ В общем случае разные типы событий содержит разный набор полей.
[[product/triggers/start|← К оглавлению]]
[[/product/triggers/monitoring|Мониторинг→]]