Bitrix24: кнопка в карточке смарт-процесса (коробка)
Как в коробочной версии Bitrix24 вывести кастомную кнопку вместо значения пользовательского поля в карточке смарт-процесса. Реализация GetPublicViewHTML, примеры кода, отладка кеша и прав доступа для постоянного отображения.
Как в Bitrix24 (коробочная версия) вывести кастомную кнопку вместо значения пользовательского свойства в карточке сущности смарт-процесса?
У меня есть модуль, в котором через установку компонента добавляется кнопка в карточку смарт-процесса via пользовательское поле. Кнопка отображается только в режиме редактирования поля (иначе показывает «Не заполнено»). Пробовал разные шаблоны компонента для отображения и указывал параметр ‘RENDER_COMPONENT’ => self::RENDER_COMPONENT, но кнопка не выводится постоянно.
Как настроить постоянное отображение кнопки без зависимости от режима редактирования?
Чтобы кнопка показывалась в карточке сущности смарт‑процесса Bitrix24 (коробочная версия) постоянно, нужно реализовать вывод для режима просмотра — т.е. реализовать callback для view (GetPublicViewHTML или VIEW_CALLBACK / GetPublicView для UF‑полей) и в нём возвращать HTML кнопки (или включать компонент через $APPLICATION->IncludeComponent). Параметр ‘RENDER_COMPONENT’ сам по себе часто не срабатывает в карточке смарт‑процесса — лучше вернуть HTML из метода просмотра и не полагаться только на edit‑callback (GetPropertyFieldHtml). Очистите кеш и проверьте права после внесения изменений.
Содержание
- Решение для смарт‑процесса Bitrix24: как вывести кнопку в карточке (коробочная версия)
- Почему кнопка видна только в режиме редактирования и что система ожидает
- Как правильно реализовать отображение: GetPublicViewHTML, VIEW_CALLBACK и RENDER_COMPONENT
- Пример кода для пользовательских полей Bitrix24: GetPropertyFieldHtml + GetPublicViewHTML
- Если поле — UF (пользовательское поле) смарт‑процесса Bitrix24
- Отладка, кеширование и типичные ошибки
- Альтернативы и рекомендации для коробочной версии Bitrix24
- Чеклист внедрения
- Источники
- Заключение
Решение для смарт‑процесса Bitrix24: как вывести кнопку в карточке (коробочная версия)
Коротко: реализуйте вывод в режиме просмотра (view) вашего пользовательского поля и возвращайте непустой HTML кнопки. Конкретно — добавьте/реализуйте метод GetPublicViewHTML (для IB‑свойств) или задайте VIEW_CALLBACK / GetPublicViewHTML (для пользовательских полей UF), и в нём включите компонент через $APPLICATION->IncludeComponent или верните статический HTML. Если метод просмотра возвращает пустую строку — Bitrix покажет «Не заполнено».
Порядок действий:
- Зарегистрировать/убедиться, что у типа поля есть callback для просмотра.
- В callback для просмотра (GetPublicViewHTML / VIEW_CALLBACK) вернуть HTML кнопки даже при пустом значении.
- Если используете компонент — обернуть IncludeComponent в ob_start()/ob_get_clean().
- Очистить кеш Bitrix и проверить под админом.
Почему кнопка видна только в режиме редактирования и что система ожидает
Bitrix использует разные точки входа для edit‑ и view‑режимов поля:
- GetPropertyFieldHtml (или аналог для UF) — вызывается для отображения поля в режиме редактирования (форма редактирования карточки). Здесь всё, что вы выводите, видно в edit‑режиме.
- GetPublicViewHTML / VIEW_CALLBACK (или соответствующий метод для UF) — вызывается при отображении поля в режиме просмотра карточки. Если этот метод не реализован или возвращает пустую строку, UI покажет «Не заполнено».
Поэтому типичная причина, почему ваша кнопка видна только в режиме редактирования: вы реализовали только edit‑рендер (GetPropertyFieldHtml), но не реализовали view‑рендер. Параметр ‘RENDER_COMPONENT’ при регистрации типа поля иногда используется, но он не гарантирует вызов компонента в карточке смарт‑процесса Bitrix24 — особенно внутри специфичных UI (см. различия модулей). Лучше явно реализовать GetPublicViewHTML/VIEW_CALLBACK. Для примера реализации см. практический разбор создания пользовательского типа в блоге: https://foostack.ru/bitrix-custom-user-prop/ и официальную документацию по смарт‑процессам: https://dev.1c-bitrix.ru/api_d7/bitrix/crm/dynamic/index.php.
Как правильно реализовать отображение: GetPublicViewHTML, VIEW_CALLBACK и RENDER_COMPONENT
Основные варианты (коротко):
- Для IB‑свойств (OnIBlockPropertyBuildList) — использовать ключи “GetPropertyFieldHtml” (edit) и “GetPublicViewHTML” (view).
- Для UF‑полей (OnUserTypeBuildList) — прописать VIEW_CALLBACK / GetPublicViewHTML (зависит от API версии).
- Если хотите подключать компонент — делайте это внутри GetPublicViewHTML через $APPLICATION->IncludeComponent и собирайте вывод через буферизацию.
Почему IncludeComponent внутри GetPublicViewHTML:
- Компонент может содержать сложную логику и шаблон.
- Bitrix не всегда сам вызовет IncludeComponent по параметру ‘RENDER_COMPONENT’ в карточках смарт‑процессов.
Пример использования IncludeComponent в view‑callback (упрощённо):
- Start buffer
- $APPLICATION->IncludeComponent(‘vendor:my.button’, ‘’, [ … ], null, [‘HIDE_ICONS’ => ‘Y’])
- Получить HTML из ob_get_clean()
- Вернуть HTML (если пусто — вернуть минимальную кнопку)
Совет: всегда возвращайте непустую строку (даже если значение поля пусто), чтобы не показывалось «Не заполнено».
Пример кода для пользовательских полей Bitrix24: GetPropertyFieldHtml + GetPublicViewHTML
Ниже — минимальный пример регистрации типа свойства (для инфоблоков/аналогичного механизма). Подгоните сигнатуры под вашу версию Bitrix/Bitrix24.
<?php
AddEventHandler("iblock", "OnIBlockPropertyBuildList", ["CIBlockPropertyMyButton", "GetUserTypeDescription"]);
class CIBlockPropertyMyButton
{
public static function GetUserTypeDescription()
{
return [
"PROPERTY_TYPE" => "S", // строка
"USER_TYPE" => "my_button",
"DESCRIPTION" => "Кнопка для смарт-процесса",
"GetPropertyFieldHtml" => [__CLASS__, "GetPropertyFieldHtml"], // edit
"GetPublicViewHTML" => [__CLASS__, "GetPublicViewHTML"], // view
];
}
// Рендер в режиме редактирования (форма)
public static function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
{
$val = isset($value['VALUE']) ? htmlspecialcharsbx($value['VALUE']) : '';
$html = '<input type="hidden" name="'.$strHTMLControlName['VALUE'].'" value="'.$val.'">';
$html .= '<button class="my-sp-button">Выполнить (edit)</button>';
return $html;
}
// Рендер в режиме просмотра — обязан возвращать HTML кнопки
public static function GetPublicViewHTML($arProperty, $value, $strHTMLControlName)
{
global $APPLICATION;
// Подготовить параметры для компонента / HTML
$fieldValue = is_array($value) && isset($value['VALUE']) ? $value['VALUE'] : $value;
// Вариант 1: подключаем компонент и возвращаем его вывод
ob_start();
$APPLICATION->IncludeComponent(
"vendor:my.button",
"",
[
"VALUE" => $fieldValue,
"PROPERTY" => $arProperty
],
null,
["HIDE_ICONS" => "Y"]
);
$cmpHtml = ob_get_clean();
// Вариант 2: если компонент не возвращил вывод, вернуть простую кнопку
if(trim($cmpHtml) !== "") {
return $cmpHtml;
}
// fallback — простая кнопка
return '<button class="my-sp-button" data-prop="'.htmlspecialcharsbx($arProperty['ID']).'">Выполнить</button>';
}
}
Обратите внимание:
- Если используете компонент, он должен быть доступен в коробочной версии на сервере (/bitrix/components/…).
- Для многозначных свойств логика обработки $value должна учитывать массив значений.
- Пример на практике разъясняется в статье‑руководстве: https://foostack.ru/bitrix-custom-user-prop/
Реализация для UF‑полей смарт‑процесса Bitrix24 (если поле — user field)
В смарт‑процессах Bitrix24 пользовательские поля чаще — UF‑поля. Для них вы регистрируете тип через событие OnUserTypeBuildList (модуль main). В описании типа можно указать VIEW_CALLBACK или GetPublicViewHTML (в зависимости от API). Убедитесь, что вы прописали соответствующий callback — иначе карточка будет показывать «Не заполнено».
Пример (упрощённо):
AddEventHandler("main", "OnUserTypeBuildList", ["CUserTypeMyButton", "GetUserTypeDescription"]);
class CUserTypeMyButton
{
public static function GetUserTypeDescription()
{
return [
"USER_TYPE_ID" => "my_button",
"CLASS_NAME" => "CUserTypeMyButton",
"DESCRIPTION" => "Кнопка в карточке",
"BASE_TYPE" => "string",
"GetEditFormHTML" => [__CLASS__, "GetEditFormHTML"],
"GetPublicViewHTML" => [__CLASS__, "GetPublicViewHTML"], // обязательно
];
}
public static function GetEditFormHTML($arUserField, $arHtmlControl) { /* ... */ }
public static function GetPublicViewHTML($arUserField, $arHtmlControl)
{
global $APPLICATION;
ob_start();
$APPLICATION->IncludeComponent("vendor:my.button", "", ["USER_FIELD"=>$arUserField], null, ["HIDE_ICONS"=>"Y"]);
return ob_get_clean();
}
}
Официальная часть по смарт‑процессам (API/UDT) — см. документацию: https://dev.1c-bitrix.ru/api_d7/bitrix/crm/dynamic/index.php и справку по пользовательским полям в смарт‑процессах: https://helpdesk.bitrix24.ru/open/22088566/.
Отладка, кеширование и типичные ошибки
Что проверить, если после реализации кнопка всё ещё не показывается:
- Вызывается ли GetPublicViewHTML?
- Вставьте лог: file_put_contents(value, true).“\n”, FILE_APPEND);
- Или AddMessage2Log($value, ‘MY_MODULE’);
- Что содержится в $value в режиме просмотра? Иногда это массив с ключом ‘VALUE’ — адаптируйте код.
- Возвращает ли метод непустую строку? Если нет — Bitrix выведет «Не заполнено».
- Очистите кеш: /bitrix/admin/cache.php, удалите кеш шаблонов и managed_cache.
- Проверьте права доступа — тестируйте как администратор.
- Убедитесь, что компонент доступен на сервере и корректно отрабатывает вне поля (включите его в простую страницу).
- Если используете RENDER_COMPONENT: этот флаг не универсален — лучше явно рендерить компонент в GetPublicViewHTML.
- Если поле многозначное — обрабатывайте массивы.
- Проверьте настройки смарт‑процесса — поле должно быть видно в карточке (правила отображения в настройках карточки/шаблона). См. справку по настройке смарт‑процессов: https://helpdesk.bitrix24.ru/open/18913888/.
Небольшой лайфхак: временно возвращайте в GetPublicViewHTML простой “
Альтернативы и рекомендации для коробочной версии Bitrix24
Если по архитектурным причинам в карточке смарт‑процесса нельзя корректно подключить GetPublicViewHTML/компонент, есть альтернативы:
- DOM‑подмена на фронте (JS): после загрузки карточки заменить текст «Не заполнено» на кнопку. Это костыль, но иногда быстрее на внедрение.
- Поместить кнопку не в поле, а в отдельный кастомный блок карточки (если у вас доступ к шаблону карточки в коробочной версии).
- Использовать REST/Marketplace решение или custom action (если хотите привязать действие к элементу смарт‑процесса глобально).
Рекомендация: по возможности реализуйте серверный view‑callback — это надёжно и корректно с точки зрения безопасности и кеширования.
Чеклист внедрения
- [ ] Реализован GetPublicViewHTML / VIEW_CALLBACK для типа поля.
- [ ] GetPublicViewHTML возвращает непустой HTML кнопки даже при пустом значении.
- [ ] Если используется компонент — его вывод захвачен через ob_start()/ob_get_clean().
- [ ] Компонент доступен в /bitrix/components и работает автономно.
- [ ] Очистили кеш Bitrix (админка).
- [ ] Проверили отображение под администратором.
- [ ] Протестировали многозначные значения и структуру $value.
- [ ] Добавили логирование для проверки вызова метода.
Источники
- Практический пример создания пользовательского типа свойства: https://foostack.ru/bitrix-custom-user-prop/
- Документация по смарт‑процессам (официально): https://dev.1c-bitrix.ru/api_d7/bitrix/crm/dynamic/index.php
- Справка по пользовательским полям в смарт‑процессах: https://helpdesk.bitrix24.ru/open/22088566/
- Документация по встройкам и типам полей: https://helpdesk.bitrix24.ru/open/20339088/
- Руководство по настройке смарт‑процессов: https://helpdesk.bitrix24.ru/open/18913888/
- Bitrix24 REST / UDT API (overview): https://apidocs.bitrix24.ru/api-reference/crm/universal/user-defined-object-types/index
- Обучающий курс и примеры по пользовательским полям: https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=48&LESSON_ID=6309
- Обсуждения и практические решения сообщества: https://ru.stackoverflow.com/questions/627979/Создание-собственной-кнопки-bitrix
- Доп. материалы интеграторов (пример): https://integrator.digital/obuchenie/interfeys/polzovatelskie-polya-v-bitriks24/
- Примеры статей от интеграторов: https://intervolga.ru/blog/bitrix24/smart-protsessy-v-bitriks24-pochemu-eto-proryv/
Заключение
Если кратко: для постоянного отображения кастомной кнопки в карточке смарт‑процесса Bitrix24 (коробочная версия) реализуйте server‑side view‑callback (GetPublicViewHTML или VIEW_CALLBACK для UF) и внутри него верните HTML кнопки или включите компонент через $APPLICATION->IncludeComponent. Параметр ‘RENDER_COMPONENT’ может не сработать в карточке — делайте явный возврат HTML, очищайте кеш и проверяйте права. Это решает ситуацию, когда кнопка видна только в режиме редактирования, а в режиме просмотра отображается «Не заполнено».