Задать вопрос
@TheIrishMan

Почему не срабатывает событие?

Добрый день, пробую писать свой модуль, который ловит дубликаты контактов при создании/изменении.
Сделал всё по шаблонам, добавил файлы:
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% (проверял прямым вызовом). Подскажите мои ошибки и почему может не работать
  • Вопрос задан
  • 104 просмотра
Подписаться 2 Простой 5 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    1C-программист: расширенный курс
    18 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик
    9 месяцев
    Далее
  • Skillbox
    Профессия Графический дизайнер PRO
    12 месяцев
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы