Набор изменений
Скопировать ссылку на статью
Скопировано

Особенности работы с набором изменений

Объект 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')

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

Благодарим за отзыв.
Была ли статья полезна?
Нет
  • Рекомендации не помогли
  • Нет ответа на мой вопрос
  • Текст трудно понять
  • Не нравится описанный функционал
Да
Следующая статья
Как использовать набор изменений для разных типов полей
Поля в системе могут быть разных типов, и соответственно проверка значения поля в истории будет отличаться в зависимости от его типа. Расскажем подробнее о том, как выстроить работу с каждым из доступных типов полей.