Как в списке «Мои дела» отображать задачи, связанные с контактами и со смарт‑процессами, не внося изменений в компонент crm.activity.list?

Возникла проблема: задачи автоматически создаются с привязкой и к контакту, и к смарт‑процессу. В таблице b_crm_act видно, что в результате меняется основная привязка задачи, и некоторые задачи получают в качестве основной привязки смарт‑процесс. При этом раздел «Мои дела» не показывает задачи, у которых основная привязка — смарт‑процесс, из‑за внутреннего фильтра компонента. Переписывать стандартный компонент crm.activity.list не хочется. Вопрос: можно ли изменить приоритет привязок, который определяет, какая сущность становится основной при привязывании задачи к смарт‑процессу? Сейчас иногда лид становится основной привязкой, даже если к задаче также привязан смарт‑процесс (а контакта нет). Нужно, чтобы смарт‑процесс считался основной только если у задачи нет других привязок. Кто‑то сталкивался с подобным и как решил отображение задач, привязанных к смарт‑процессам, в «Моих делах»?
  • 15 июля 2026 г. 9:00
Ответы на вопрос 2
Коротко — приоритет привязок в «ядре» Битрикса менять «по‑флагу» нельзя (это не настраиваемая опция). Но проблему можно решить не переписывая 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 для смарт‑процесса),
— и я подготовлю точный код‑обработчик и/или миграционный скрипт для конкретно вашей системы.
Попробуйте при создании события подменять привязку. <br/> Это можно на событии сделать OnActivityAdd
Похожие вопросы