Коротко — приоритет привязок в «ядре» Битрикса менять «по‑флагу» нельзя (это не настраиваемая опция). Но проблему можно решить не переписывая crm.activity.list, а перехватывая момент создания/обновления активности и приводя первичную привязку в нужный вид (или подчёркивая фильтр «Моих дел»). Варианты подходов:
1) Правильная первичная привязка при создании — лучший вариант
- Если задачи создаёт ваш робот / бизнес‑процесс / код — настроить его так, чтобы при создании активности OWNER_TYPE_ID/OWNER_ID (или первичная привязка) устанавливались в нужную сущность (contact/lead и т.д.), а смарт‑процесс добавлялся как дополнительная привязка, но не как основная.
- В API при создании активности можно передать Bindings/OWNER_* и задать первичную.
2) Перехват создания и принудительная коррекция первичной привязки (рекомендуемый универсальный способ)
- Подключить обработчик события добавления/обновления активности и, если активность имеет одновременно привязку к смарт‑процессу и к контактам/лидам — установить первичной контакт/лид.
- Для этого использовать события CRM (OnAfterCrmActivityAdd / OnAfterCrmActivityUpdate или подходящие события в вашей версии), получить список привязок через ActivityBindingTable (или через API), и при необходимости вызвать CCrmActivity::Update (или API ORM) чтобы поменять OWNER_TYPE_ID/OWNER_ID на нужную сущность.
Примерная схема (скетч, нужно адаптировать под вашу версию API):
- регистрация обработчика (init.php ваших расширений):
Bitrix\Main\EventManager::getInstance()->addEventHandler('crm', 'OnAfterCrmActivityAdd', ['\My\\Namespace\\Handlers','onAfterActivityAdd']);
- обработчик:
public static function onAfterActivityAdd($arFields)
{
$activityId = (int)$arFields['ID'];
if($activityId <= 0) return;
// получить все привязки активности
$res = \Bitrix\Crm\Activity\ActivityBindingTable::getList(['filter'=>['=ACTIVITY_ID'=>$activityId]]);
$bindings = [];
while($b = $res->fetch()) $bindings[] = $b;
// проверить есть ли привязка к контакту (или лиду) и есть ли привязка к смарт‑процессу
$hasContact = false; $hasSmart = false; $contactBinding = null;
foreach($bindings as $bind)
{
if($bind['OWNER_TYPE_ID'] == \CCrmOwnerType::Contact) { $hasContact = true; $contactBinding = $bind; }
if($bind['OWNER_TYPE_ID'] == /* ID типа смарт‑процесса в вашей системе */) $hasSmart = true;
}
// если есть контакт и смарт‑процесс, но в основной привязке стоит смарт — поменять на контакт
if($hasContact && $hasSmart)
{
// обновить активность — установить OWNER_TYPE_ID/OWNER_ID в Contact
\CCrmActivity::Update($activityId, ['OWNER_TYPE_ID' => \CCrmOwnerType::Contact, 'OWNER_ID' => $contactBinding['OWNER_ID']]);
}
}
- Важно: не правьте таблицу b_crm_act напрямую — используйте API (CCrmActivity::Update / ORM), чтобы не нарушить логику и индексы.
3) Исправление уже существующих записей
- Одноразовый скрипт/миграция: пройти по b_crm_act (или ActivityBindingTable) и для активностей, где в привязках есть контакт и смарт‑процесс, привести OWNER_* к контакту через API.
4) Меняем логику отображения в «Моих делах» (альтернатива)
- Если изменить поведение создания/обработки неудобно: добавить на страницу «Мои дела» дополнительный фильтр/расширение, чтобы компонент также показывал активности, у которых в списке привязок есть контакт, даже если OWNER_* — смарт‑процесс. Это требует вмешательства в настройки страницы/добавления обработчика фильтра, и возможно небольшого расширения, но сложнее и менее «чисто», чем корректировка привязок.
Резюме и рекомендация
- Изменить «приоритет» привязок «в ядре» нельзя безопасно без правок Битрикс. Надёжный путь — перехватывать создание/обновление активности и выставлять первичную привязку вручную (или править генератор задач/робот), плюс разовый скрипт для исправления истории. Это не трогает crm.activity.list и решает проблему «Моих дел», т.к. у активности будет нужная основная привязка.
Если хотите — пришлите:
- как именно создаются задачи сейчас (робот, бизнес‑процесс, REST/webhook, модуль), и
- какая версия Битрикса/имена типов смарт‑процессов (ID OWNER_TYPE для смарт‑процесса),
— и я подготовлю точный код‑обработчик и/или миграционный скрипт для конкретно вашей системы.