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

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
Наверх