Комментарии 2
В некоторые сущности, например, в компанию \Bitrix\Crm\Service\Factory\Company не получится наследовать из-за final, что тогда делать?
Да, в некоторых стандартных сущностях, например, класс Bitrix\Crm\Service\Factory\Company имеет final. Самый простой вариант, использовать события, пока не уберут "final". Но на самом деле final можно обойти используя ReflectionAPI. Вам понадобиться:
1. Наследовать ваш класс, например CompanyFactory от абстрактного класса \Bitrix\Crm\Service\Factory
2. Использовать композицию $this->factory = Container::getInstance()->getFactory(\CCrmOwnerType::Company);, например в конструкторе
3. Переопределить публичные методы:
public function isNewRoutingForDetailEnabled(): bool
{
$method = str_replace([__CLASS__, '::'], '', METHOD);
$args = func_get_args();
return $this->factory->$method(...$args);
}
4.Переопределить наследуемые и приватные методы protected function configureAddOperation(Operation $operation): void
{
$method = str_replace([__CLASS__, '::'], '', METHOD);
$args = func_get_args();
$reflectionMethod = new \ReflectionMethod($this->factory, $method);
$reflectionMethod->setAccessible(true); // Разрешаем доступ
$reflectionMethod->invoke($this->factory, ...$args);
}
Так вы сможете сохранить базовую логику и при этом добавить свою. Конечно у такого подхода есть минус, при обновлении ядра нужно проверять не измениться ли базовый класс фабрики, если да, то добавить/убрать методы в своём классе.

Битрикс24 Factory, Operation, Action разбираемся с новым API CRM и строим масштабируемую архитектуру для смарт-процессов