Из-за чего не срабатывает событие?
По вводным:, пробую писать свой модуль, который ловит дубликаты контактов при создании/изменении.
По вводным: сделал всё по шаблонам, добавил файлы:
По вводным: 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% (проверял прямым вызовом). Подскажите, мои ошибки и почему может не работать
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В Битриксе событие модуля может “не срабатывать” по нескольким причинам: модуль не установлен как модуль, обработчик не зарегистрирован, событие зарегистрировано не на тот модуль/класс, автозагрузка не видит класс обработчика или вы ловите не то событие CRM. Для контактов CRM важно использовать события модуля
crm, а не толькоmain.Проверьте, что в install реально регистрируется обработчик:
EventManager::getInstance()->registerEventHandler( 'crm', 'OnBeforeCrmContactAdd', $this->MODULE_ID, 'DuplicatesControlContactHandler', 'onBeforeContactAdd' );
И при удалении модуля он снимается:
EventManager::getInstance()->unRegisterEventHandler( 'crm', 'OnBeforeCrmContactAdd', $this->MODULE_ID, 'DuplicatesControlContactHandler', 'onBeforeContactAdd' );
Дальше проверьте, что класс реально загружается. В
include.phpмодуля зарегистрируйте автозагрузку:BitrixMainLoader::registerAutoLoadClasses( 'duplicates.control.contact', [ 'DuplicatesControlContactHandler' => 'lib/Handler.php', ] );
В обработчике на время диагностики пишите лог:
namespace DuplicatesControlContact; class Handler { public static function onBeforeContactAdd(&$fields) { file_put_contents( $_SERVER['DOCUMENT_ROOT'] . '/local/log-contact.txt', print_r($fields, true), FILE_APPEND ); } }
Если файл не создаётся, событие не зарегистрировано или класс не грузится. Если создаётся, но логика дублей не работает, ошибка уже внутри обработчика.
Также проверьте, как именно создаётся контакт. Если контакт добавляется через новый API, REST, импорт или сделку, может сработать другое событие:
OnAfterCrmContactAdd,OnBeforeCrmContactUpdateили события фабрик. Начните с логирования нескольких событий, чтобы увидеть фактический путь.Итог: проверьте регистрацию в таблице событий, автозагрузку класса, точное имя события CRM и простой лог в обработчике. Не ищите ошибку в бизнес-логике, пока не доказано, что обработчик вообще вызывается.