Как избежать повторного срабатывания триггера?
Скопировать ссылку на статью
Скопировано

Возможные причины и варианты их решения:

1. В коде триггера отсутствует обращение к объекту changeSet для событийного запуска триггера после необходимого изменения заказа или карточки клиента

Диагностика:

Анализируем фильтр и условие триггера на наличие кода обращения к истории заказа, которое производится с помощью объекта changeSet [Набор изменений]. Он может выглядеть по-разному, но в коде всегда будет присутствовать слово changeSet, например:

changeSet.hasChangedField("status") and changeSet.newValue("status").code == "did-not-get-through"

Или так:

changeSet | contains ( c => c.fieldName == 'order_product.status' and c.newValue.code == 'otklonen' and c.oldValue.code == 'new')

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

Важно понимать отличие проверки:

changeSet.hasChangedField("delivery_type") and changeSet.newValue("delivery_type").code == "russian-post"

от

order.deliveryType.сode == "russian-post"

В первом случае триггер сработает только в момент изменения типа доставки на "Почта России". Во втором случае триггер сработает в момент изменения типа доставки на "Почта России" и при каждом последующем изменении заказа до тех пор, пока не будет выбран отличный от "Почты России" тип доставки.

Решение:

Сформировать и добавить код обращения к набору изменений (changeSet) с проверкой изменения в необходимом поле.

2. Условие, по которому срабатывает триггер, выполняется при изменении заказа или карточки клиента несколько раз

Если по каким-то причинам в вашем бизнес-процессе допустимы случаи повторного внесения таких изменений, которые удовлетворяют условию срабатывания триггера, то возможно умышленное ограничение срабатывания триггера с помощью доп.функций языка выражений.

Диагностика:

Проанализировать код триггера, узнав, на изменение какого поля он срабатывает. Это можно сделать с помощью разбора выражения обращения к набору изменений, например: changeSet.hasChangedField("status") and changeSet.newValue("status").code == "did-not-get-through" - данный код срабатывает на изменение поля с кодом status, что свидетельствует изменению статуса заказа (эту информацию вы можете найти в справочнике объектов, произведя поиск по найденному коду поля).

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

Решение:

Добавить в условие триггера функцию last_run(), которая проверяет последний запуск триггера по переданным в функцию параметрам. Первым параметром функции можно передать временной интервал, по которому необходимо осуществлять проверку в формате "1 day", "3 month", "5 years" и т.д.. Вторым параметром функции можно передать символьный код триггера, по которому необходимо осуществить проверку в формате "initial_trigger_code". Третьим параметром функции entity можно передать одну из двух доступных сущностей: order (заказ) и customer (клиент).

Пример триггера, который срабатывает 1 раз в час после определённого триггера в определённой сущности. // some conditions - это условия триггера.

...
// some conditions
...
and not last_run("60 minutes", "initial_trigger_code", entity)
Благодарим за отзыв.
Была ли статья полезна?
Нет
  • Рекомендации не помогли
  • Нет ответа на мой вопрос
  • Текст трудно понять
  • Не нравится описанный функционал
Да
Предыдущая статья
Особенности сегментных триггеров
Рассмотрим, как настроить триггер так, чтобы он реагировал на попадание и выход клиента из сегмента.
Следующая статья
Как настроить триггерную цепочку?
Триггерная цепочка - последовательность коммуникаций, которые направлены на автоматическое информирование клиента о продвижении в работе с заказом и своевременном уведомлении о его статусе или этапе обработки. В статье рассмотрим пример информирования при работе с доставкой.