Свой тип данных Highload блоки

Если хотите создать свой тип данных в HIGHLOAD блоках, это достаточно легко.

Надо лишь указать ID блоков – MY_HL_BLOCK_ID и MY_HL_BLOCK_ID2

use Bitrix\Highloadblock\HighloadBlockTable as HLBT;
const MY_HL_BLOCK_ID = 5;
const MY_HL_BLOCK_ID2 = 6;

AddEventHandler("iblock","OnIBlockPropertyBuildList",array("Property_Service_List_Class","GetUserTypeDescription"));
if(!class_exists("Property_Service_List_Class"))
{
class Property_Service_List_Class
{
function GetUserTypeDescription()
{
return array(
"PROPERTY_TYPE" => "S",
"USER_TYPE" => "EServiceList",
"DESCRIPTION" => "Множественное поле",
"GetPropertyFieldHtml" => array("Property_Service_List_Class","GetPropertyFieldHtml"),
"GetPublicEditHTML" => array("Property_Service_List_Class","GetPropertyFieldHtml"),
"ConvertToDB" => array("Property_Service_List_Class","ConvertToDB"),
"ConvertFromDB" => array("Property_Service_List_Class","ConvertFromDB"),
"GetAdminListViewHTML" => array("Property_Service_List_Class","GetAdminListViewHTML"),
);
}

function GetEntityDataClass($HlBlockId) {
if (empty($HlBlockId) || $HlBlockId < 1)
{
return false;
}
$hlblock = HLBT::getById($HlBlockId)->fetch();
$entity = HLBT::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
return $entity_data_class;
}

function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
{

$arResult = array();

$cache[$IBLOCK_ID] = array();

$html = '';
$html = "<table>";
$html .= "<tr>";
/*
$html .= '<td><input type="text" size="35" placeholder="Наименование" name="'.$strHTMLControlName['VALUE'].'[]" value="'.$value['VALUE'][0].'" /></td>';
*/
$entity_data_class = Property_Service_List_Class::GetEntityDataClass(MY_HL_BLOCK_ID);
$rsData = $entity_data_class::getList(array('select' => array('*')));
$html .='<td><select name="'.$strHTMLControlName['VALUE'].'[]" style="margin-bottom:3px">';
$html .= '<option value="">(не выбрано)</option>';
while($el = $rsData->fetch()){
if ($value['VALUE'][0]==$el["UF_NAME"]) { $clss='selected=""'; } else {$clss='';}
$html .= '<option '.$clss.' value='.$el["UF_NAME"].'>';
if (empty($clss)) { $html .=$el["UF_NAME"]; } else { $html .=$el["UF_NAME"]; }
$html .= '</option>';
}
$html .= '</select></td>';

$html .= '<td><input type="text" size="10" placeholder="Количество" name="'.$strHTMLControlName['VALUE'].'[]" value="'.$value['VALUE'][1].'" /></td>';
$entity_data_class = Property_Service_List_Class::GetEntityDataClass(MY_HL_BLOCK_ID2);
$rsData = $entity_data_class::getList(array('select' => array('*')));
$html .='<td><select name="'.$strHTMLControlName['VALUE'].'[]" style="margin-bottom:3px">';
$html .= '<option value="">(не выбрано)</option>';
while($el = $rsData->fetch()){
if ($value['VALUE'][2]==$el["UF_NAME"]) { $clss='selected=""'; } else {$clss='';}
$html .= '<option '.$clss.' value='.$el["UF_NAME"].'>';
if (empty($clss)) { $html .=$el["UF_NAME"]; } else { $html .=$el["UF_NAME"]; }
$html .= '</option>';
}
$html .= '</select></td>';
$html .= '</tr>';
$html .= "</table>";
return $html;
}

function ConvertToDB($arProperty, $value)
{
if($value['VALUE'][0]!='') {
$value['VALUE'] = serialize($value['VALUE']);
} else {
$value['VALUE'] = null;
}
return $value;
}

function ConvertFromDB($arProperty, $value){
if(strlen($value["VALUE"])>0) {
$tmpArr = unserialize($value["VALUE"]);
if(is_array($tmpArr) && count($tmpArr))
$value["VALUE"] = $tmpArr;
} else {
$value["VALUE"] = null;
}
return $value;
}

function GetAdminListViewHTML($arProperty, $value, $strHTMLControlName) {
if(is_array($value["VALUE"]) && count($value["VALUE"])) {
$tmpArr = array();
$tmpArr[] = "[".$value['VALUE'][0]."] - ".$value['VALUE'][1];

return implode(" /\n",$tmpArr);
}
else
{
return htmlspecialcharsex($value["VALUE"]);
}
}

}
}