TimelineEntry
CRUD операции с событиями таймлайна осуществляются через \Bitrix\Crm\TimelineEntry
. При этом, для каждого типа события существует свой наследник, реализующий метод create
. Добавление новых событий осуществляется именно через него.
В рамках работы над таймлайном смарт-процессов был написан сервис \Bitrix\Crm\TimelineEntry\Facade
, позволяющий через единую точку входа создавать различные типы событий. А факт того, что это сервис, облегчает
тестирование кода и дает возможность мокать необходимое поведение.
Внутреннее устройство
Важно! Данный блок написан исключительно с информационной целью. Пожалуйста, не используйте таблеты в явном виде. Этим вы нарушаете инкапсуляцию и усложняете сопровождение кода!
Данные о событиях таймлайна хранятся в трех таблицах:
-
b_crm_timeline (
\Bitrix\Crm\Timeline\Entity\TimelineTable
) - хранит основную часть данных (тип события, автор, описание и т.д.).Поля
ASSOCIATED_ENTITY_TYPE_ID
иASSOCIATED_ENTITY_ID
описывают, про какой элемент идет речь в событии. Если был создан или изменен элемент, то здесь будет указание на этот элемент. Если было создано дело (Activity), то здесь будет указание на дело.Поле
TYPE_ID
указывает на тип события. Здесь хранятся константы класса\Bitrix\Crm\Timeline\TimelineType
. Обычно каждый тип события имеет собственную константу, но тем не менее несколько событий могут иметь одно и то же значение. Например, многие типы "дел" (Activity) имеют один и тот жеTYPE_ID = TimelineType::ACTIVITY
. -
b_crm_timeline_bind (
\Bitrix\Crm\Timeline\Entity\TimelineBindingTable
) - хранит данные о том, в таймлайнах каких сущностей необходимо отобразить событие. Имеет связь "один ко многим" сb_crm_timeline
. Соответственно, одно и то же событие может быть отражено в нескольких таймлайнах одновременно. -
b_crm_timeline_search (
\Bitrix\Crm\Timeline\Entity\TimelineSearchTable
) - хранит полнотекстовый индекс для поиска по событиям.
Когда в компоненте crm.timeline
происходит выборка событий, которые нужно отрисовать в таймлайне элемента с конкретными entityTypeId
и entityId
, осуществляется фильтрация по b_crm_timeline_bind.ENTITY_TYPE_ID = entityTypeId AND b_crm_timeline_bind.ENTITY_ID = entityId
. Все события, прошедшие такой фильтр, попадают в интерфейс.