Из-за чего не срабатывает событие?

Ссылка скопирована
1 ответ

По вводным:, пробую писать свой модуль, который ловит дубликаты контактов при создании/изменении.
По вводным: сделал всё по шаблонам, добавил файлы:
По вводным: local/modules/duplicates.control.contact/install/index.php

<?php require_once __DIR__.'/../functions.php'; use Bitrix\Main\Localization\Loc; use Bitrix\Main\EventManager; use Bitrix\Main\ModuleManager; Loc::loadMessages(__FILE__); class duplicates_control_contact extends CModule { public $MODULE_ID = 'duplicates.control.contact'; public function __construct() { $arModuleVersion = []; include __DIR__ . '/version.php'; $this->MODULE_VERSION = $arModuleVersion['VERSION']; $this->MODULE_VERSION_DATE = $arModuleVersion['VERSION_DATE']; $this->MODULE_NAME = Loc::getMessage('DUPLICATES_CONTACTPROCESSOR_NAME') ?: 'Обработчик контактов (мой)'; $this->MODULE_DESCRIPTION = Loc::getMessage('DUPLICATES_CONTACTPROCESSOR_DESC') ?: 'Автоматическая обработка создания и изменения контактов в CRM'; $this->PARTNER_NAME = 'ООО Закон и порядок'; $this->PARTNER_URI = 'https://example.com'; } public function DoInstall() { $this->InstallEvents(); ModuleManager::registerModule($this->MODULE_ID); // если нужно — копировать файлы, создавать таблицы: $this->InstallFiles(); $this->InstallDB(); } public function DoUninstall() { $this->UnInstallEvents(); ModuleManager::unRegisterModule($this->MODULE_ID); } public function InstallEvents() { $eventManager = EventManager::getInstance(); wh_log('install/index.php: InstallEvents запущен'); // После добавления контакта try{ $eventManager->registerEventHandler( 'crm', 'OnBeforeCrmContactAdd', $this->MODULE_ID, '\\Duplicates\\Control\\Contacts', 'cancelCrmContactSave' ); wh_log("install/index.php: OnBeforeCrmContactAdd зарегистрирован"); // После изменения контакта $eventManager->registerEventHandler( 'crm', 'OnBeforeCrmContactUpdate', $this->MODULE_ID, '\\Duplicates\\Control\\Contacts', 'cancelCrmContactUpdate' ); wh_log("install/index.php: OnBeforeCrmContactUpdate зарегистрирован"); } catch(\Throwable $e){ wh_log("install/index.php: ОШИБКА регистрации: " . $e->getMessage() . " " . $e->getTraceAsString()); } return true; } public function UnInstallEvents() { $eventManager = EventManager::getInstance(); $eventManager->unRegisterEventHandler( 'crm', 'OnBeforeCrmContactAdd', $this->MODULE_ID, '\\Duplicates\\Control\\Contacts', 'cancelCrmContactSave' ); $eventManager->unRegisterEventHandler( 'crm', 'OnBeforeCrmContactUpdate', $this->MODULE_ID, '\\Duplicates\\Control\\Contacts', 'cancelCrmContactUpdate' ); return true; } }

По вводным: local/modules/duplicates.control.contact/install/version.php

<?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die(); $arModuleVersion = [ 'VERSION' => '1.0.0', 'VERSION_DATE' => '2026-02-16' ];

По вводным: local/modules/duplicates.control.contact/lang/ru/install/index.php

<?php $MESS['DUPLICATES_CONTACTPROCESSOR_NAME'] = 'Контроль дубликатов контактов по телефону и почте'; $MESS['DUPLICATES_CONTACTPROCESSOR_DESC'] = 'Данный обработчик перехватывает запись контакт и проверяет: 1. Заполнено ли одно из полей: телефон или почта; 2. Проверяет наличие в базе контактов с указанными телефонами; 3. Проверяет наличие в базе контактов с указанными почтами; Если есть хоть один контакт - прерывает сохранение и даёт пользователю список ID в которых указаны такие же данные.';

По вводным: local/modules/duplicates.control.contact/lib/contacts.php

<?php namespace Duplicates\Control; class Contacts { public static function cancelCrmContactSave(&$arFields) { wh_log('Отработало событие в модуле'); //самописная функция, логирования которая работает 100% //логика обработки } public static function cancelCrmContactUpdate(&$arFields) { wh_log('Отработало событие в модуле'); //самописная функция, логирования которая работает 100% //логика обработки }

Сейчас ситуация такая: установка проходит нормально, исключений не возникает, но при добавлении/изменении контакта ничего не происходит, так как в логах ничего нет, но сама функция логирования работает 100% (проверял прямым вызовом). Подскажите, мои ошибки и почему может не работать

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Редакция DevOps Ответ

В Битриксе событие модуля может “не срабатывать” по нескольким причинам: модуль не установлен как модуль, обработчик не зарегистрирован, событие зарегистрировано не на тот модуль/класс, автозагрузка не видит класс обработчика или вы ловите не то событие CRM. Для контактов CRM важно использовать события модуля crm, а не только main.

Проверьте, что в install реально регистрируется обработчик:

EventManager::getInstance()-&gt;registerEventHandler(
    'crm',
    'OnBeforeCrmContactAdd',
    $this-&gt;MODULE_ID,
    'DuplicatesControlContactHandler',
    'onBeforeContactAdd'
);

EventManager::getInstance()-&gt;registerEventHandler( 'crm', 'OnBeforeCrmContactAdd', $this-&gt;MODULE_ID, 'DuplicatesControlContactHandler', 'onBeforeContactAdd' );

И при удалении модуля он снимается:

EventManager::getInstance()-&gt;unRegisterEventHandler(
    'crm',
    'OnBeforeCrmContactAdd',
    $this-&gt;MODULE_ID,
    'DuplicatesControlContactHandler',
    'onBeforeContactAdd'
);

EventManager::getInstance()-&gt;unRegisterEventHandler( 'crm', 'OnBeforeCrmContactAdd', $this-&gt;MODULE_ID, 'DuplicatesControlContactHandler', 'onBeforeContactAdd' );

Дальше проверьте, что класс реально загружается. В include.php модуля зарегистрируйте автозагрузку:

BitrixMainLoader::registerAutoLoadClasses(
    'duplicates.control.contact',
    [
        'DuplicatesControlContactHandler' =&gt; 'lib/Handler.php',
    ]
);

BitrixMainLoader::registerAutoLoadClasses( 'duplicates.control.contact', [ 'DuplicatesControlContactHandler' =&gt; 'lib/Handler.php', ] );

В обработчике на время диагностики пишите лог:

namespace DuplicatesControlContact;
 
class Handler
{
    public static function onBeforeContactAdd(&amp;$fields)
    {
        file_put_contents(
            $_SERVER['DOCUMENT_ROOT'] . '/local/log-contact.txt',
            print_r($fields, true),
            FILE_APPEND
        );
    }
}

namespace DuplicatesControlContact; class Handler { public static function onBeforeContactAdd(&amp;$fields) { file_put_contents( $_SERVER['DOCUMENT_ROOT'] . '/local/log-contact.txt', print_r($fields, true), FILE_APPEND ); } }

Если файл не создаётся, событие не зарегистрировано или класс не грузится. Если создаётся, но логика дублей не работает, ошибка уже внутри обработчика.

Также проверьте, как именно создаётся контакт. Если контакт добавляется через новый API, REST, импорт или сделку, может сработать другое событие: OnAfterCrmContactAdd, OnBeforeCrmContactUpdate или события фабрик. Начните с логирования нескольких событий, чтобы увидеть фактический путь.

Итог: проверьте регистрацию в таблице событий, автозагрузку класса, точное имя события CRM и простой лог в обработчике. Не ищите ошибку в бизнес-логике, пока не доказано, что обработчик вообще вызывается.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно