Возможные причины и варианты их решения:
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)