Документация для разработчиков
Темная тема

TrackedObject

Методы подготовки данных


TrackedObject - подготовка данных об элементе.

TrackedObject - это объект, который используется для подготовки данных для записи в историю. Он конфигурируется фабрикой и зависит от типа сущности и конкретного элемента, который этот объект представляет.


Рекомендуется получать объект класса TrackedObject через соответствующий метод фабрики. Не инстанцируйте его самостоятельно!


Сам класс TrackedObject является абстрактным. Для каждого типа элемента у него есть наследник. В нем определяется набор полей, для которых будет записываться история изменений. Так же в нем могут быть переопределены сообщения о различных событиях.

TrackedObject умеет работать только с объектами классов EntityObject и \Bitrix\Crm\Item.

Подготовка данных для EventHistory - это основная задача TrackedObject. Для этого у TrackedObject есть семейство публичных методов prepare*EventData, которые отдают объект EventHistoryData, заполненный данными для конкретного события. Данные формируются на основе переданного в TrackedObject элемента и с учетом особенностей типа сущности (конфигурации, которая происходит в фабрике).

Зависимые объекты


makeThisObjectDependant и другие.

К элементу CRM могут быть привязаны зависимые сущности (контакты, товарные позиции). В случае, когда меняется состав сущностей, которые привязаны к элементу CRM, или когда меняется какое-то значимое поле привязанной сущности, это тоже нужно заносить в историю элемента. Здесь это делается посредством механизма "зависимых объектов".

TrackedObject можно сделать зависимым с помощью метода makeThisObjectDependant(string $ownerFieldName). После вызова этого метода объект будет подготавливать данные с учетом того, что он — зависимый. Это повлияет на сообщения и поля, отвечающие за привязку события к элементу.

Параметр string $ownerFieldName показывает, к какому полю родителя относится этот зависимый объект. Допустим, что контакты хранятся в поле 'CONTACTS'. Соответственно, при вызове makeThisObjectDependant мы передадим 'CONTACTS' в качестве аргумента.

Чтобы привязать зависимый объект TrackedObject к другому TrackedObject, который будет выступать в качестве родительского, необходимо использовать метод addDependantTrackedObject(TrackedObject $dependant).


ВАЖНО! Добавляемый объект должен быть сконфигурирован как зависимый через makeThisObjectDependant. Иначе будет выброшено исключение.

ВАЖНО! В родительском элементе в поле $ownerFieldName должна храниться коллекция EntityObject или \Bitrix\Crm\Item. Работа с массивом ID или иными типами данных не поддерживается.

Алгоритм подготовки данных об обновлении в методе prepareUpdateEventData


Так как подготовка данных об обновлении элемента — самый сложный кейс в работе TrackedObject, не лишним будет пояснить, как это работает.

При вызове метода объект проходится по всем полям, изменения которых необходимо записать в историю. Они складываются из тех полей, которые заданы в наследнике, и полей, к которым привязаны зависимые объекты, добавленные через addDependantTrackedObject.


  1. Собираем данные для конкретного поля.
    • Если поле обычное и оно изменилось, подготавливаем данные об изменении.
    • Если поле зависимое (т.е. к нему привязан зависимый TrackedObject), то сравниваем коллекции привязанных объектов до и после сохранения. Найденные отличия (добавленые/удаленные объекты, изменения в значимых полях) собираем.
  2. Если текущий объект является зависимым (сконфигурирован через makeThisObjectDependant), то дополнительно модифицируем данные.
© «Битрикс», 2001-2024, «1С-Битрикс», 2024