Особенности работы с набором изменений
Объект changeSet
(тип Change/EntityChangeSet
) представляет интерфейс получения информации об изменениях при редактировании объектов (например заказа или клиента). В справочнике объектов можно увидеть доступные методы данного объекта.
Для того чтобы узнать, какое из действий сейчас совершается с объектом (создание, изменение, удаление), в changeSet предусмотрены соответствующие методы:
changeSet.isCreate() # создание
changeSet.isUpdate() # изменение
changeSet.isDelete() # удаление
Например, если создать триггер или валидацию для заказа с указанием параметра changeSet.isCreate()
, условие выполнится в момент создания заказа.
Наиболее часто используемые методы – это hasChangedField()
, oldValue
и newValue
. C помощью hasChangedField()
можно определить, изменялось ли поле, а oldValue
и newValue
позволяют получить соответственно старое и новое значение поля.
changeSet.hasChangedField("status") and changeSet.newValue("status").code == "complete" # Статус заказа изменился и его новое значение "Выполнен"
Данные методы принимают в качестве параметра служебное название поле в формате underscore
, доступные для использования служебные названия полей можно посмотреть в справочнике объектов. Если мы обращаемся ко вложенному полю, то вложенность указывается через точку.
changeSet.hasChangedField("status") and changeSet.newValue("status").group.code == "complete" # Статус заказа изменился и его новое значение из группы статусов "Выполнен"
В данном примере производится обращение к вложенному в status
объекту group
, в котором в свою очередь вложено поле code, соответственно эта проверка выполнится в случае, если производится изменение статуса заказа - на статус, который находится в группе "Выполнен".
Важно понимать отличие проверки
changeSet.hasChangedField("delivery_type") and changeSet.newValue("delivery_type").code == "russian-post" # тип доставки изменился и его новое значение "Почта России"
от
order.deliveryType.code == "russian-post" # тип доствки в заказе "Почта России"
Первое условие сработает только в момент, когда мы изменяем тип доставки на «Почта России». Второе сработает в момент изменения типа доставки на «Почта России», а также при всех последующих изменениях заказа, пока мы не сменим тип доставки на что-либо другое.
changeSet.hasChangedField("status") # Определяем, изменилось ли поле Статус заказа
changeSet.oldValue("delivery_cost") # Получаем прежнее значение поля Стоимость доставки
changeSet.newValue("delivery_address.city") # Получаем новое значение поля Город доставки
changeSet.hasChangedField("delivery_type") and changeSet.newValue("delivery_type").code == "russian-post" # Тип доставки изменился и его новое значение "Почта России"
В данных примерах мы смотрим изменения полей:
order.status # статус заказа
order.deliveryCost # стоимость доставки
order.deliveryAddress.city # город доставки
order.deliveryType # тип доставки
Изменение пользовательских полей
Изменения в пользовательских полях хранятся с приставкой custom_
. Например, чтобы определить наличие изменения в пользовательском поле transaction_id
, следует написать:
changeSet.hasChangedField("custom_transaction_id")
Важно!
В случае отслеживания изменений с помощью методов
newValue
илиoldValue
в пользовательских полях с типом "Число" и "Целое число" значение полей будет в числовом формате, все остальные типы пользовательских полей хранят значения в текстовом формате.
Для разных типов пользовательских полей необходимо предусмотреть соответствующую типу поля проверку, примеры таких проверок имеются в статье "Как использовать набор изменений для разных типов полей".
Получение автора изменения
Иногда бывает необходимо получить менеджера, который произвел изменение определенного поля: например можно назначить менеджера ответственным за заказ, если он изменил его состав.
Для того чтобы узнать, какой менеджер изменил то или иное поле, нужно воспользоваться функцией authorOfChange
, которая возвращает менеджера, который произвел изменение (User)
или null
, если изменение сделано самой системой, через API или в триггере.
changeSet.authorOfChange("status")
В случае изменения статуса заказа пользователем системы, вышеуказанный пример вернёт объект User
.
Для проверки наличия изменения в конкретном поле можно использовать функцию sourceOfChange
, которая возвращает символьный код источника изменений:
api # API
user # Менеджер
rule # Триггер
code # Система
combine # Объединение с другим объектом
copy # Копирование объектов
split # Разделение заказа
Данная проверка сработает в случае, если статус заказа будет изменен по API или триггером:
changeSet.sourceOfChange("status") in ["api", "rule"]
Также можно проверить наличие любых изменений от определенного источника с помощью использования функции hasChangesWithSource
с указанием в параметрах функции соответствующего источнику изменений символьного кода:
changeSet.hasChangesWithSource("api")
Данная проверка сработает в случае, если изменение будет инициировано по API.
Отслеживание изменений с помощью pipe-фильтров
В системе предусмотрены фильтры, которые позволяют работать с массивами данных, соответственно, с помощью них можно производить отслеживание изменений в объекте changeSet
. Ознакомится с доступными фильтрами можно в статье «Язык выражений».
Например, можно проверить изменение статуса товара в заказе:
changeSet | contains (product => product.fieldName == 'order_product.status' and product.oldValue.code == 'new' and product.newValue.code == 'otklonen')
Данная проверка сработает в случае, если произойдет изменение статуса хотя бы у одного товара из состава заказа.