Добрый день, пробую писать свой модуль, который ловит дубликаты контактов при создании/изменении.
Сделал всё по шаблонам, добавил файлы:
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% (проверял прямым вызовом). Подскажите мои ошибки и почему может не работать