Расширенные возможности Битрикса: создание кастомных блоков в карточке заказа
Введение
При работе с крупными проектами на платформе 1С-Битрикс нередко возникает необходимость расширять стандартные функциональные возможности системы, адаптируя интерфейс администрирования под специфику бизнеса. Одной из востребованных задач является внедрение собственных информационных блоков в карточку заказа, позволяющих администраторам быстро получать доступ к важным данным покупателя.
В этой статье разберём простой пример реализации такого блока с использованием встроенного механизма обработки событий Битрикса и API работы с пользователями. Вы узнаете, как без модификации ядра добавить вкладку с произвольной информацией о клиенте прямо на страницу просмотра заказа.
Весь код размещается в /local/php_interface/init.php — никаких изменений
в системных модулях не требуется.
Быстрый старт
| Компонент | Значение |
|---|---|
| Событие | onSaleAdminOrderInfoBlockShow (модуль sale) |
| Классы | Bitrix\Main\Event, Bitrix\Main\UserTable |
| Файл | /local/php_interface/init.php |
| Поле пользователя | UF_ABOUTUSER — создаётся в настройках |
| Результат | Новый блок EventResult::SUCCESS с массивом данных |
Постановка задачи
Допустим, нам необходимо вывести дополнительную информацию о клиенте в карточку заказа.
Например, это может быть описание самого клиента, зафиксированное в специальном
пользовательском поле UF_ABOUTUSER. Это поле создаётся вручную в настройках
сайта («Настройки» → «Пользователи» → «Пользовательские поля») и доступно
для каждого зарегистрированного пользователя.
Задача состоит из трёх шагов:
- Получить данные пользователя, создавшего заказ.
- Прочитать значение поля
UF_ABOUTUSERиз его профиля. - Отобразить это значение в отдельном блоке карточки заказа.
UF_ABOUTUSER для профиля пользователя через административную панель.
Тип поля — «Строка» или «Текст», по желанию. Заполните это поле у нескольких
тестовых пользователей, чтобы проверить результат.
Подключение обработчика события
Битрикс предоставляет событие onSaleAdminOrderInfoBlockShow, которое
срабатывает при формировании страницы просмотра заказа в административной панели.
Через него можно добавить произвольный блок с информацией.
Регистрируем обработчик в init.php:
<?php
use Bitrix\Main\EventManager;
// Подключаемся к событию отображения блока сведений о заказе
$eventManager = EventManager::getInstance();
$eventManager->addEventHandler(
'sale',
'onSaleAdminOrderInfoBlockShow',
'onSaleAdminOrderInfoBlockShow'
);Разберём:
- Импорт — подключаем класс
Bitrix\Main\EventManagerдля работы с событиями. - Регистрация —
addEventHandlerпринимает модуль ('sale'), имя события ('onSaleAdminOrderInfoBlockShow') и имя функции-колбэка ('onSaleAdminOrderInfoBlockShow').
Обратите внимание: имя функции может быть любым. Мы назвали её так же, как событие, чтобы было понятнее — но это не обязательное условие.
Функция-обработчик: onSaleAdminOrderInfoBlockShow
В обработчике мы загружаем профиль пользователя, считываем значение кастомного поля и возвращаем массив для формирования дополнительного блока.
use Bitrix\Main\UserTable;
function onSaleAdminOrderInfoBlockShow(\Bitrix\Main\Event $event)
{
global $USER_FIELD_MANAGER;
// Получаем объект заказа
$order = $event->getParameter("ORDER");
// Получаем ID пользователя, оформившего заказ
$userId = $order->getUserId();
if ($userId > 0) {
// Загружаем профиль пользователя
$userFields = UserTable::getList([
'filter' => ['=ID' => $userId],
'select' => ['*']
])->fetch();
// Проверяем наличие пользовательского поля и извлекаем его значение
if (!empty($userFields['UF_ABOUTUSER'])) {
$aboutuser = $userFields['UF_ABOUTUSER'];
}
}
// Создание массива с результатами
$resultArray = [];
if (!empty($aboutuser)) {
$resultArray[] = [
'TITLE' => '<b>О покупателе:</b>',
'VALUE' => '<b>' . htmlspecialchars($aboutuser) . '</b>',
'ID' => 'o_pokupatele',
];
}
return new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::SUCCESS,
$resultArray
);
}Подробности реализации
Разберём код по шагам:
Шаг 1. Обработчик события
Событие onSaleAdminOrderInfoBlockShow срабатывает при открытии страницы
конкретного заказа в административной панели («Магазин» → «Заказы» → «Просмотр заказа»).
Оно передаёт объект заказа через параметр "ORDER". Это стандартный
механизм Битрикса для расширения интерфейса без изменения ядра.
Шаг 2. Получение данных пользователя
Через метод $order->getUserId() получаем ID пользователя,
оформившего заказ. Затем с помощью UserTable::getList() (API модуля
main) загружаем все поля профиля. Нас интересует пользовательское поле
UF_ABOUTUSER — если оно заполнено, сохраняем значение в переменную
$aboutuser.
UF_ABOUTUSER должно быть
предварительно создано в административной панели. Если поле отсутствует или не заполнено
у конкретного пользователя — блок просто не отобразится, ошибки не будет.
Шаг 3. Формирование возвращаемого результата
Собираем массив $resultArray, где каждый элемент — это структура с ключами:
TITLE— заголовок блока (поддерживается HTML);VALUE— содержимое блока;ID— уникальный строковый идентификатор блока.
Передаём массив в конструктор EventResult со статусом
EventResult::SUCCESS. Битрикс сам подставит полученные данные
в интерфейс карточки заказа.
htmlspecialchars(), чтобы избежать XSS-уязвимостей: данные из
пользовательского поля могут содержать HTML или JavaScript, и перед выводом
их обязательно нужно экранировать.
Шаг 4. Проверка наличия значения
Перед добавлением элемента в массив мы проверяем, что переменная $aboutuser
существует и не пуста (!empty($aboutuser)). Это обязательная проверка:
если передать пустое значение, Битрикс может выбросить исключение
ArgumentNullException. Блок появится только тогда, когда поле
действительно заполнено.
Полный код для копирования
Готовый блок, который можно вставить в /local/php_interface/init.php:
<?php
// ============================================================
// Кастомный блок в карточке заказа Битрикс
// Отображает значение пользовательского поля UF_ABOUTUSER
// ============================================================
use Bitrix\Main\EventManager;
use Bitrix\Main\UserTable;
$eventManager = EventManager::getInstance();
$eventManager->addEventHandler(
'sale',
'onSaleAdminOrderInfoBlockShow',
'onSaleAdminOrderInfoBlockShow'
);
function onSaleAdminOrderInfoBlockShow(\Bitrix\Main\Event $event)
{
global $USER_FIELD_MANAGER;
$order = $event->getParameter("ORDER");
$userId = $order->getUserId();
if ($userId > 0) {
$userFields = UserTable::getList([
'filter' => ['=ID' => $userId],
'select' => ['*']
])->fetch();
if (!empty($userFields['UF_ABOUTUSER'])) {
$aboutuser = $userFields['UF_ABOUTUSER'];
}
}
$resultArray = [];
if (!empty($aboutuser)) {
$resultArray[] = [
'TITLE' => '<b>О покупателе:</b>',
'VALUE' => '<b>' . htmlspecialchars($aboutuser) . '</b>',
'ID' => 'o_pokupatele',
];
}
return new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::SUCCESS,
$resultArray
);
}После вставки не забудьте создать пользовательское поле UF_ABOUTUSER
в административной панели и заполнить его у тестовых пользователей.
Заключение
Использование подобной методики позволяет значительно расширить функциональность административной панели, делая работу сотрудников быстрее и удобнее. Такой подход помогает упростить рутинные операции, повысить эффективность бизнес-процессов и улучшить взаимодействие с клиентами.
Применяя описанные техники, вы сможете создавать собственные уникальные расширения для вашей CRM-системы на Битриксе, оптимизировать рабочие процессы и сократить временные затраты на обработку заказов.
Часто задаваемые вопросы
Подпишитесь на событие onSaleAdminOrderInfoBlockShow модуля sale, в обработчике получите объект заказа через $event->getParameter("ORDER") и верните массив с ключами TITLE, VALUE, ID через EventResult::SUCCESS.
onSaleAdminOrderInfoBlockShow — срабатывает при открытии страницы просмотра заказа в админ-панели. Позволяет добавлять произвольные информационные блоки без изменения ядра.
Используйте метод $order->getUserId() — он возвращает числовой идентификатор пользователя, создавшего заказ. Для заказов, оформленных гостем, вернётся 0.
Возможные причины: не создано пользовательское поле UF_ABOUTUSER; поле не заполнено у данного пользователя; не подключён файл init.php; событие зарегистрировано с ошибкой в имени модуля или события.
Да — добавьте несколько элементов в массив $resultArray. Каждый элемент должен иметь уникальный ID. Битрикс отобразит все переданные блоки в порядке их добавления.
Ключевые моменты
- Событие
onSaleAdminOrderInfoBlockShow— срабатывает при просмотре заказа в админке, позволяет добавлять произвольные блоки - Данные Объект заказа получается через
$event->getParameter("ORDER"), ID пользователя — через$order->getUserId() - Поле
UF_ABOUTUSERсоздаётся вручную в настройках пользовательских полей; если не заполнено — блок не отображается - Безопасность Обязательно экранируйте выводимые данные через
htmlspecialchars()для защиты от XSS - Результат Возвращается через
EventResult::SUCCESSс массивом, содержащим ключиTITLE,VALUE,ID
