<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.userside.eu/index.php?action=history&amp;feed=atom&amp;title=Internal_API_EN</id>
	<title>Internal API EN - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.userside.eu/index.php?action=history&amp;feed=atom&amp;title=Internal_API_EN"/>
	<link rel="alternate" type="text/html" href="https://wiki.userside.eu/index.php?title=Internal_API_EN&amp;action=history"/>
	<updated>2026-05-29T20:21:45Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.userside.eu/index.php?title=Internal_API_EN&amp;diff=21951&amp;oldid=prev</id>
		<title>IronBot: [IronBot] Fix EN localization text</title>
		<link rel="alternate" type="text/html" href="https://wiki.userside.eu/index.php?title=Internal_API_EN&amp;diff=21951&amp;oldid=prev"/>
		<updated>2026-05-23T19:35:06Z</updated>

		<summary type="html">&lt;p&gt;[IronBot] Fix EN localization text&lt;/p&gt;
&lt;a href=&quot;https://wiki.userside.eu/index.php?title=Internal_API_EN&amp;amp;diff=21951&amp;amp;oldid=21909&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>IronBot</name></author>
	</entry>
	<entry>
		<id>https://wiki.userside.eu/index.php?title=Internal_API_EN&amp;diff=21909&amp;oldid=prev</id>
		<title>IronBot: [IronBot] Sync EN/UK localization from RU</title>
		<link rel="alternate" type="text/html" href="https://wiki.userside.eu/index.php?title=Internal_API_EN&amp;diff=21909&amp;oldid=prev"/>
		<updated>2026-05-23T17:44:26Z</updated>

		<summary type="html">&lt;p&gt;[IronBot] Sync EN/UK localization from RU&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;﻿&amp;#039;&amp;#039;&amp;#039;en&amp;#039;&amp;#039;&amp;#039; | [[Internal_API_UK|uk]] | [[Internal_API|ru]]&lt;br /&gt;
&lt;br /&gt;
Custom Events v2 - это локальная система внутренних событий ERP. Она выполняет клиентский PHP-код внутри текущего PHP-процесса ERP без HTTP-запросов, веб-хуков и внешних очередей.&lt;br /&gt;
&lt;br /&gt;
Старый механизм &amp;lt;code&amp;gt;legacy/Config/custom_api.txt&amp;lt;/code&amp;gt; с функцией &amp;lt;code&amp;gt;api_function(...)&amp;lt;/code&amp;gt; остается legacy-контрактом. В v2 старые названия используются только для карты совместимости. Новый клиентский код должен использовать константы &amp;lt;code&amp;gt;CustomEvent::...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Файлы ==&lt;br /&gt;
&lt;br /&gt;
Рабочий клиентский файл один:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;evolution/CustomEvents/v2/handlers.php&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;evolution/CustomEvents/v2/handlers.example.php&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Список всех констант:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;evolution/CustomEvents/Runtime/v2/CustomEvent.php&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Карта старых имен в новые события:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;evolution/CustomEvents/Runtime/v2/CustomEventLegacyEventMap.php&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кеш:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;var/cache/CustomEvents/handlers.v2.cache.php&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Лог:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;var/log/custom-events-v2.log&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Как писать обработчики ==&lt;br /&gt;
&lt;br /&gt;
Используется одна функция регистрации: &amp;lt;code&amp;gt;internal_event(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В одном файле можно зарегистрировать несколько обработчиков подряд:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
internal_event(&lt;br /&gt;
    CustomEvent::TASK_CREATED,&lt;br /&gt;
    static function ($event): bool {&lt;br /&gt;
        $taskId = $event-&amp;gt;get(&amp;#039;task_id&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    },&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
internal_event(&lt;br /&gt;
    CustomEvent::CUSTOMER_STATUS_CHANGE_BEFORE,&lt;br /&gt;
    static function ($event): bool|string {&lt;br /&gt;
        if ((int)$event-&amp;gt;get(&amp;#039;new_status_id&amp;#039;) === 0) {&lt;br /&gt;
            return &amp;#039;Запрещено переводить абонента в этот статус&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    },&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
internal_event(&lt;br /&gt;
    CustomEvent::CUSTOMER_CARD_PRIMARY_CONTENT_RENDER,&lt;br /&gt;
    static function ($event): string {&lt;br /&gt;
        $customerId = (int)$event-&amp;gt;get(&amp;#039;customer_id&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        return &amp;#039;&amp;lt;div&amp;gt;Дополнительная информация по абоненту #&amp;#039; . $customerId . &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
    },&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В обработчик всегда приходит один параметр &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данные читаются без типовых оберток:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$taskId = $event-&amp;gt;get(&amp;#039;task_id&amp;#039;);&lt;br /&gt;
$customerId = $event-&amp;gt;get(&amp;#039;customer_id&amp;#039;);&lt;br /&gt;
$data = $event-&amp;gt;all();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужен конкретный тип, приводите значение в своем коде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$taskId = (int)$event-&amp;gt;get(&amp;#039;task_id&amp;#039;);&lt;br /&gt;
$comment = (string)$event-&amp;gt;get(&amp;#039;comment&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Результат обработчика ==&lt;br /&gt;
&lt;br /&gt;
Обработчик возвращает простое значение:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Возврат&lt;br /&gt;
! Значение&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
| Обработчик выполнен успешно&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
| Для события &amp;lt;code&amp;gt;*.before&amp;lt;/code&amp;gt; запретить штатную операцию&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ничего не менять&lt;br /&gt;
|-&lt;br /&gt;
| строка&lt;br /&gt;
| Для &amp;lt;code&amp;gt;*.before&amp;lt;/code&amp;gt; запретить операцию с текстом причины; для &amp;lt;code&amp;gt;*.render&amp;lt;/code&amp;gt; вывести строку/HTML&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
События &amp;lt;code&amp;gt;*.before&amp;lt;/code&amp;gt; могут отменять штатную операцию. Остальные события не должны отменять уже выполненное действие.&lt;br /&gt;
&lt;br /&gt;
== Пример запрета операции ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
internal_event(&lt;br /&gt;
    CustomEvent::CUSTOMER_STATUS_CHANGE_BEFORE,&lt;br /&gt;
    static function ($event): bool|string {&lt;br /&gt;
        if ((int)$event-&amp;gt;get(&amp;#039;new_status_id&amp;#039;) === 0) {&lt;br /&gt;
            return &amp;#039;Запрещено переводить абонента в этот статус&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    },&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Пример вывода HTML ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
internal_event(&lt;br /&gt;
    CustomEvent::CUSTOMER_CARD_PRIMARY_CONTENT_RENDER,&lt;br /&gt;
    static function ($event): string {&lt;br /&gt;
        $customerId = (int)$event-&amp;gt;get(&amp;#039;customer_id&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        return &amp;#039;&amp;lt;div&amp;gt;Дополнительная информация по абоненту #&amp;#039; . $customerId . &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
    },&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Проверка, кеш и лог ==&lt;br /&gt;
&lt;br /&gt;
При изменении &amp;lt;code&amp;gt;evolution/CustomEvents/v2/handlers.php&amp;lt;/code&amp;gt; ERP проверяет синтаксис через &amp;lt;code&amp;gt;php -l&amp;lt;/code&amp;gt;. Если синтаксис корректный, файл копируется в &amp;lt;code&amp;gt;var/cache/CustomEvents/handlers.v2.cache.php&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Runtime-лог пишется в JSON Lines в &amp;lt;code&amp;gt;var/log/custom-events-v2.log&amp;lt;/code&amp;gt;. Одна строка - один вызов обработчика, ошибка или факт отсутствия обработчиков.&lt;br /&gt;
&lt;br /&gt;
Пример строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&amp;quot;ts&amp;quot;:&amp;quot;2026-05-10T12:01:03+03:00&amp;quot;,&amp;quot;event&amp;quot;:&amp;quot;task.created&amp;quot;,&amp;quot;has_handlers&amp;quot;:true,&amp;quot;handlers&amp;quot;:1,&amp;quot;handler_index&amp;quot;:0,&amp;quot;duration_ms&amp;quot;:2.341,&amp;quot;memory_kb&amp;quot;:18,&amp;quot;result&amp;quot;:&amp;quot;allow&amp;quot;,&amp;quot;message&amp;quot;:null}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Лог ротируется в:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;var/log/custom-events-v2.log.1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ошибки ==&lt;br /&gt;
&lt;br /&gt;
Если в обработчике возникнет ошибка, ERP запишет ее в лог и продолжит работу по правилам конкретного события.&lt;br /&gt;
&lt;br /&gt;
Обработчик выполняется внутри того же PHP-процесса, что и ядро ERP. Через ядро проходят тысячи операций, и медленный или ошибочный клиентский код может остановить или дестабилизировать работу всей системы. Не используйте &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;die&amp;lt;/code&amp;gt;, бесконечные циклы, тяжелые SQL-запросы без ограничений и долгие внешние операции. Держите обработчики короткими и предсказуемыми.&lt;br /&gt;
&lt;br /&gt;
== Рекомендации ==&lt;br /&gt;
&lt;br /&gt;
* Используйте только константы &amp;lt;code&amp;gt;CustomEvent::...&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Не пишите строку события вручную.&lt;br /&gt;
* Делайте обработчики короткими.&lt;br /&gt;
* Не вызывайте HTTP/webhook из высокочастотных событий.&lt;br /&gt;
* Не используйте &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;die&amp;lt;/code&amp;gt;, бесконечные циклы и тяжелые выборки без ограничений.&lt;br /&gt;
* Возвращайте &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; или строку.&lt;br /&gt;
&lt;br /&gt;
== Все события ==&lt;br /&gt;
&lt;br /&gt;
Ниже перечислены все события v2. Полный технический список констант находится в &amp;lt;code&amp;gt;evolution/CustomEvents/Runtime/v2/CustomEvent.php&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Поля &amp;lt;code&amp;gt;event&amp;lt;/code&amp;gt; указаны как текущий контракт данных.&lt;br /&gt;
&lt;br /&gt;
=== Здания ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::BUILDING_CREATED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После создания здания&lt;br /&gt;
| &amp;lt;code&amp;gt;building_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::BUILDING_CHANGED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После редактирования здания&lt;br /&gt;
| &amp;lt;code&amp;gt;building_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Коммутация ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::COMMUTATION_CREATE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед созданием коммутации между объектами&lt;br /&gt;
| &amp;lt;code&amp;gt;source_type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;source_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;target_type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;target_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::COMMUTATION_DELETE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед удалением коммутации между объектами&lt;br /&gt;
| &amp;lt;code&amp;gt;source_type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;source_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;target_type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;target_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Главная страница ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::DASHBOARD_TOP_CONTENT_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе текста в начальной части главной страницы&lt;br /&gt;
| &amp;lt;code&amp;gt;employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Оборудование ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::DEVICE_CHANGED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После редактирования оборудования&lt;br /&gt;
| &amp;lt;code&amp;gt;device_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;device_type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::DEVICE_NOTIFICATION_DOWN&amp;lt;/code&amp;gt;&lt;br /&gt;
| При фиксации недоступности оборудования&lt;br /&gt;
| &amp;lt;code&amp;gt;device_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;device_type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ip&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::DEVICE_NOTIFICATION_UP&amp;lt;/code&amp;gt;&lt;br /&gt;
| При восстановлении доступности оборудования&lt;br /&gt;
| &amp;lt;code&amp;gt;device_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;device_type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ip&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::DEVICE_INTERFACE_PORT_NUMBER_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе номера порта в таблице интерфейсов&lt;br /&gt;
| &amp;lt;code&amp;gt;device_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;interface_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;port_number&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::DEVICE_INTERFACE_ADDITIONAL_DATA_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе дополнительного содержимого в карточке оборудования&lt;br /&gt;
| &amp;lt;code&amp;gt;device_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Абоненты ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_CREATED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После создания абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_CHANGE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед редактированием абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_CHANGED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После редактирования абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_MERGED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После объединения абонентов&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;target_customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_STATUS_CHANGE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед изменением статуса абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;new_status_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;old_status_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_STATUS_CHANGED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После изменения статуса абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;new_status_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;old_status_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_TARIFF_CHANGE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед изменением тарифа абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;billing_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;new_tariff_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;old_tariff_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_TARIFF_CHANGED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После изменения тарифа абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;billing_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;new_tariff_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;old_tariff_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_BALANCE_CHANGED&amp;lt;/code&amp;gt;&lt;br /&gt;
| При изменении баланса абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_FORMER_TRANSFER_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед переводом абонента в бывшие абоненты&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_FORMER_TRANSFERRED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После перевода абонента в бывшие абоненты&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_FORMER_RESTORE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед восстановлением абонента из бывших абонентов&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_FORMER_RESTORED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После восстановления абонента из бывших абонентов&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_DISCONNECT_PLAN_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед постановкой абонента на отключение&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_DISCONNECT_PLANNED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После постановки абонента на отключение&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_DISCONNECT_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед отключением абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_DISCONNECTED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После отключения абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_DISCONNECT_CANCEL_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед отменой отключения абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_DISCONNECT_CANCELLED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После отмены отключения абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_SERVICE_ENABLE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед подключением услуги абоненту&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_SERVICE_ENABLED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После подключения услуги абоненту&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_SERVICE_DISABLE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед отключением услуги абоненту&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_SERVICE_DISABLED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После отключения услуги абоненту&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== IP/MAC абонента ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_IP_ADD_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед добавлением IP/MAC-адреса&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ip&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mac&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;subnet_property&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_IP_ADDED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После добавления IP/MAC-адреса&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ip&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mac&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;subnet_property&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_IP_DELETE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед удалением IP/MAC-адреса&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ip&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mac&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;subnet_property&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_IP_DELETED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После удаления IP/MAC-адреса&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ip&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mac&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;subnet_property&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Метки абонента ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_TAG_ADD_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед добавлением метки абоненту&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tag_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_TAG_ADDED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После добавления метки абоненту&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tag_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_TAG_DELETE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед удалением метки абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tag_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_TAG_DELETED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После удаления метки абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tag_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Личный кабинет абонента ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_PORTAL_REGISTRATION_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед регистрацией абонента в личном кабинете&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_PORTAL_REGISTERED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После регистрации абонента в личном кабинете&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_PORTAL_LOGIN_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед входом абонента в личный кабинет&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_PORTAL_DASHBOARD_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе содержимого на главной странице личного кабинета&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_PORTAL_PAGE_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе содержимого на страницах личного кабинета&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;page_mode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;page_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_PORTAL_HEAD_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе содержимого после &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; в личном кабинете&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Карточка абонента ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_CARD_PRIMARY_CONTENT_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе основного содержимого в карточке абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_CARD_SECONDARY_CONTENT_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе дополнительного содержимого в карточке абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ip_mac&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_CARD_IP_MAC_CONTENT_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе информации возле IP/MAC-адресов абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ip&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mac&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::CUSTOMER_CARD_SMS_CONTENT_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе содержимого отправки SMS в карточке абонента&lt;br /&gt;
| &amp;lt;code&amp;gt;customer_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Сотрудники ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::EMPLOYEE_MESSAGE_CREATED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После создания сообщения сотруднику&lt;br /&gt;
| &amp;lt;code&amp;gt;receiver_employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;message_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::EMPLOYEE_CHANGED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После редактирования сотрудника&lt;br /&gt;
| &amp;lt;code&amp;gt;employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::EMPLOYEE_PERSONAL_SECTION_CONTENT_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе информации в персональном разделе сотрудника&lt;br /&gt;
| &amp;lt;code&amp;gt;employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Табель работ ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::EMPLOYEE_TIMESHEET_PRINT_HEADER_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе шапки печатного табеля&lt;br /&gt;
| &amp;lt;code&amp;gt;employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;period&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::EMPLOYEE_TIMESHEET_PRINT_FOOTER_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе подвала печатного табеля&lt;br /&gt;
| &amp;lt;code&amp;gt;employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;period&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Склад ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::INVENTORY_TRANSFER_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед перемещением ТМЦ&lt;br /&gt;
| &amp;lt;code&amp;gt;inventory_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;operation_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::INVENTORY_TRANSFERRED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После перемещения ТМЦ&lt;br /&gt;
| &amp;lt;code&amp;gt;inventory_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;operation_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Задания ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_CARD_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе содержимого в карточке задания&lt;br /&gt;
| &amp;lt;code&amp;gt;task_type_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_WORK_DATE_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе содержимого возле даты работ&lt;br /&gt;
| &amp;lt;code&amp;gt;task_type_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_CREATE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед созданием задания&lt;br /&gt;
| &amp;lt;code&amp;gt;task_type_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;author_employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_CREATED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После создания задания&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;task_type_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;author_employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_DELETE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед удалением задания&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_CHANGE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед редактированием задания&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_CHANGED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После редактирования задания&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_COMMENT_CREATE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед добавлением комментария к заданию&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_COMMENT_CREATED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После добавления комментария к заданию&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_COMMENT_CHANGED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После редактирования комментария к заданию&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_COMMENT_TEXT_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе текста комментария задания&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;comment&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_DIVISION_ASSIGN_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед добавлением подразделения к заданию&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;division_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_DIVISION_REMOVE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед исключением подразделения из задания&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;division_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_EMPLOYEE_ASSIGN_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед добавлением исполнителя к заданию&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_EMPLOYEE_REMOVE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед исключением исполнителя из задания&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_WATCHER_DIVISION_ASSIGN_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед добавлением подразделения наблюдателем&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;division_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_WATCHER_EMPLOYEE_ASSIGN_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед добавлением сотрудника наблюдателем&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;employee_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_OBJECT_ATTACHED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После добавления объекта к заданию&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;object_type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;object_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_OBJECT_DETACHED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После исключения объекта из задания&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;object_type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;object_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_RETURNED_TO_AUTHOR&amp;lt;/code&amp;gt;&lt;br /&gt;
| После возврата задания автору&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_STATE_CHANGE_BEFORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Перед изменением статуса задания&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;old_state_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;new_state_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::TASK_STATE_CHANGED&amp;lt;/code&amp;gt;&lt;br /&gt;
| После изменения статуса задания&lt;br /&gt;
| &amp;lt;code&amp;gt;task_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;old_state_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;new_state_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Сооружения связи ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа&lt;br /&gt;
! Когда вызывается&lt;br /&gt;
! Данные &amp;lt;code&amp;gt;$event&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::NODE_CARD_ADDITIONAL_DATA_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе дополнительного содержимого в карточке сооружения связи&lt;br /&gt;
| &amp;lt;code&amp;gt;node_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CustomEvent::NODE_CARD_PRIMARY_CONTENT_RENDER&amp;lt;/code&amp;gt;&lt;br /&gt;
| При выводе основного содержимого в карточке сооружения связи&lt;br /&gt;
| &amp;lt;code&amp;gt;node_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>IronBot</name></author>
	</entry>
</feed>