Веб

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: как вывести кнопку в карточке (коробочная версия)

Коротко: реализуйте вывод в режиме просмотра (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

Основные варианты (коротко):

  1. Для IB‑свойств (OnIBlockPropertyBuildList) — использовать ключи “GetPropertyFieldHtml” (edit) и “GetPublicViewHTML” (view).
  2. Для UF‑полей (OnUserTypeBuildList) — прописать VIEW_CALLBACK / GetPublicViewHTML (зависит от API версии).
  3. Если хотите подключать компонент — делайте это внутри 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
<?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 — иначе карточка будет показывать «Не заполнено».

Пример (упрощённо):

php
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(SERVER[DOCUMENTROOT]./upload/splog.txt,varexport(_SERVER['DOCUMENT_ROOT'].'/upload/sp-log.txt', var_export(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 простой “

TEST
” — если это видно, значит метод вызывается и проблема в компоненте/HTML.


Альтернативы и рекомендации для коробочной версии Bitrix24

Если по архитектурным причинам в карточке смарт‑процесса нельзя корректно подключить GetPublicViewHTML/компонент, есть альтернативы:

  • DOM‑подмена на фронте (JS): после загрузки карточки заменить текст «Не заполнено» на кнопку. Это костыль, но иногда быстрее на внедрение.
  • Поместить кнопку не в поле, а в отдельный кастомный блок карточки (если у вас доступ к шаблону карточки в коробочной версии).
  • Использовать REST/Marketplace решение или custom action (если хотите привязать действие к элементу смарт‑процесса глобально).

Рекомендация: по возможности реализуйте серверный view‑callback — это надёжно и корректно с точки зрения безопасности и кеширования.


Чеклист внедрения

  • [ ] Реализован GetPublicViewHTML / VIEW_CALLBACK для типа поля.
  • [ ] GetPublicViewHTML возвращает непустой HTML кнопки даже при пустом значении.
  • [ ] Если используется компонент — его вывод захвачен через ob_start()/ob_get_clean().
  • [ ] Компонент доступен в /bitrix/components и работает автономно.
  • [ ] Очистили кеш Bitrix (админка).
  • [ ] Проверили отображение под администратором.
  • [ ] Протестировали многозначные значения и структуру $value.
  • [ ] Добавили логирование для проверки вызова метода.

Источники


Заключение

Если кратко: для постоянного отображения кастомной кнопки в карточке смарт‑процесса Bitrix24 (коробочная версия) реализуйте server‑side view‑callback (GetPublicViewHTML или VIEW_CALLBACK для UF) и внутри него верните HTML кнопки или включите компонент через $APPLICATION->IncludeComponent. Параметр ‘RENDER_COMPONENT’ может не сработать в карточке — делайте явный возврат HTML, очищайте кеш и проверяйте права. Это решает ситуацию, когда кнопка видна только в режиме редактирования, а в режиме просмотра отображается «Не заполнено».

Авторы
Проверено модерацией
Модерация