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

Добрый день. Пытаюсь написать модуль, который при создании или изменении контакта будет обнаруживать дубликаты. Сделал всё по шаблону и добавил файл local/modules/duplicates.control.contact/install/index.php со следующим содержимым: <br/> <pre><code class="php">&lt;?php
  • 17 февраля 2026 г. 7:01
Ответы на вопрос 1
Коротко — потому что у вас в файле только "<?php" и никакой регистрации обработчиков там нет. Но давайте по шагам, что обычно нужно сделать в модуле Bitrix, чтобы событие срабатывало, и пример кода.

1) Убедитесь, что модуль установлен
- Модуль должен быть зарегистрирован в системе (Администрирование → Модули) или вызывать RegisterModule в DoInstall.

2) Зарегистрируйте обработчики событий при установке модуля
- В install/index.php нужно реализовать InstallEvents (и UnInstallEvents) и в ней вызвать RegisterModuleDependences (старый API) или \Bitrix\Main\EventManager->addEventHandler (D7).

Пример (старый API, совместимый с большинством версий Bitrix):
```php
<?php
use \Bitrix\Main\Localization\Loc;
Loc::loadMessages(__FILE__);

class duplicates_control_contact extends CModule
{
    var $MODULE_ID = "duplicates.control.contact";
    // ... другие поля

    function InstallEvents()
    {
        RegisterModuleDependences(
            "crm",
            "OnAfterCrmContactAdd",
            $this->MODULE_ID,
            "CDuplicatesContactHandler",
            "OnAfterCrmContactAdd"
        );
        RegisterModuleDependences(
            "crm",
            "OnAfterCrmContactUpdate",
            $this->MODULE_ID,
            "CDuplicatesContactHandler",
            "OnAfterCrmContactUpdate"
        );
    }

    function UnInstallEvents()
    {
        UnRegisterModuleDependences("crm", "OnAfterCrmContactAdd", $this->MODULE_ID, "CDuplicatesContactHandler", "OnAfterCrmContactAdd");
        UnRegisterModuleDependences("crm", "OnAfterCrmContactUpdate", $this->MODULE_ID, "CDuplicatesContactHandler", "OnAfterCrmContactUpdate");
    }

    // DoInstall / DoUninstall и т.д.
}
```

А сам обработчик (например в /local/modules/duplicates.control.contact/lib/handler.php):
```php
<?php
class CDuplicatesContactHandler
{
    public static function OnAfterCrmContactAdd($ID, $arFields)
    {
        // Ваш код проверки дубликатов
        // Для отладки: file_put_contents($_SERVER["DOCUMENT_ROOT"]."/dup.log", "ADD: ".$ID."\n", FILE_APPEND);
    }

    public static function OnAfterCrmContactUpdate($ID, $arFields)
    {
        // ...
    }
}
```

Пример (D7 EventManager):
```php
\EventManager::getInstance()->addEventHandler(
    'crm',
    'OnAfterCrmContactAdd',
    ['\Duplicates\Contact\Handler', 'onAfterAdd']
);
```
и удалить через removeEventHandler / UnregisterModuleDependences при удалении модуля.

3) Проверьте имена событий
- В CRM для контактов обычно используются события OnAfterCrmContactAdd и OnAfterCrmContactUpdate. В зависимости от версии Bitrix имена могут отличаться — проверьте документацию вашей версии или исходники модуля crm (ищите Event::send или addEventHandler('crm', ...)).

4) Отладка
- Убедитесь, что модуль установлен и InstallEvents действительно выполнялась (посмотрите в таблице b_event_site / модуль).
- Логируйте вызов обработчика (file_put_contents, AddMessage2Log), чтобы убедиться, что он не вызывается.
- Очистите кеш (особенно если используете managed cache / autoload).
- Проверьте права на файлы и корректность namespace/автозагрузки, если используете D7-стиль классов.

Если хотите, пришлите:
- Полный код вашего install/index.php,
- Как вы реализовали обработчик (файл),
- Установлен ли модуль в админке,
и я покажу, где именно исправить.
Похожие вопросы