Как вывести ошибку с HTML-разметкой при обновлении сделки в Битрикс24

    При работе со сделками в Битрикс24 иногда возникает необходимость прервать операцию обновления и показать пользователю кастомное сообщение об ошибке. Стандартный механизм валидации позволяет выводить простой текст, но что делать, если в сообщении требуется разместить ссылку или другую HTML-разметку?

    Стандартный подход и его ограничения

    Обычно для проверки условий при обновлении элемента используется обработчик события, подключенный в init.php. Например, чтобы запретить изменение сделок с ID больше 100, можно использовать следующий код:

    public static function handleElementChange(&$arFields): bool
    {
        if ($arFields['ID'] > 100) {
            global $APPLICATION;
            $APPLICATION->ThrowException('Текст ошибки!');
            return false;
        }
        return true;
    }

    Основное ограничение этого метода - невозможность вывода форматированного сообщения. Метод ThrowException принимает только строку, которая будет отображена как обычный текст. HTML-теги экранируются и не интерпретируются.

    Решение: вывод ошибки с HTML-вёрсткой

    Чтобы обойти это ограничение и вывести сообщение со ссылкой или другим форматированием, можно использовать следующий алгоритм:

    1. Отключить стандартное отображение ошибки. Не вызывайте $APPLICATION->ThrowException() для основного сообщения.
    2. Записать HTML-сообщение в отдельное поле результата. Используйте поле RESULT_MESSAGE массива $arFields, чтобы передать готовую HTML-разметку.
    3. Инициировать ошибку пустым исключением. Вызовите ThrowException() с пустой строкой, чтобы триггернуть статус ошибки, но не перезаписать ваше форматированное сообщение.

    Пример реализации

    Вот как будет выглядеть модифицированный обработчик для вывода ошибки с кликабельной ссылкой:

    public static function handleElementChange(&$arFields): bool
    {
        if ($arFields['ID'] > 100) {
            global $APPLICATION;
            
            // Формируем HTML-сообщение со ссылкой
            $errorHtml = 'Операция запрещена. <a href="/custom/page.php" target="_blank">Перейти к инструкции</a>';
            
            // Передаём HTML в поле RESULT_MESSAGE
            $arFields['RESULT_MESSAGE'] = $errorHtml;
            
            // Инициируем ошибку (пустое сообщение не перезапишет RESULT_MESSAGE)
            $APPLICATION->ThrowException('');
            
            return false;
        }
        return true;
    }

    Ключевые моменты

    • Поле RESULT_MESSAGE имеет приоритет при отображении. Если оно заполнено, система покажет его содержимое вместо строки из ThrowException.
    • Вызов ThrowException('') обязателен для перевода операции в состояние «ошибка».
    • Убедитесь, что ваша HTML-разметка безопасна и корректно экранирована, чтобы избежать уязвимостей.

    Данный подход позволяет гибко кастомизировать сообщения об ошибках, делая их более информативными и удобными для пользователя.