Добавление произвольного типа свойства в Битрикс

/bitrix/php_interface/init.php

AddEventHandler("iblock", "OnIBlockPropertyBuildList", array("CIBlockNewProperty", "GetUserTypeDescription"));

class CIBlockNewProperty
{
  public function GetUserTypeDescription()
  {
    return array(
      "PROPERTY_TYPE"        => "S", #-----один из стандартных типов
      "USER_TYPE"            => "MYIDCODE", #-----идентификатор типа свойства
      "DESCRIPTION"          => "Название свойства",
      "GetPropertyFieldHtml" => array("CIBlockNewProperty", "GetPropertyFieldHtml"),
    );
  }

  /*--------- вывод поля свойства на странице редактирования ---------*/
  public function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
  {
    return '<input type="text" name="'.$strHTMLControlName["VALUE"].'" value="'.$value['VALUE'].'"> <input type="text" name="'.$strHTMLControlName["DESCRIPTION"].'" value="'.$value['DESCRIPTION'].'">';
  }
}

public function GetUserTypeDescription()
{
  return array(
    "PROPERTY_TYPE"        => "S", #-----один из стандартных типов
    "USER_TYPE"            => "MYIDCODE", #-----идентификатор типа свойства
    "DESCRIPTION"          => "Название свойства",
    "GetPropertyFieldHtml" => array("CIBlockNewProperty", "GetPropertyFieldHtml"),
    "ConvertToDB" => array(__CLASS__, "ConvertToDB"), #-----функция конвертирования данных перед сохранением в базу данных
    "ConvertFromDB" => array(__CLASS__, "ConvertFromDB"), #-----функция конвертации после извлечения значения из базы данных и перед показом в форме редактирования элемента инфоблока
  );
}

Как логично вытекает эти функции надо добавить в наш класс. Если брать пример с календарем, то можно так:

public static function ConvertToDB($arProperty, $arValue)
{
  if (strlen($arValue['VALUE'])) {
    $time = new \Bitrix\Main\Type\DateTime($arValue['VALUE']);
    $arValue['VALUE'] = $time->getTimestamp();
  }
  return $arValue;
}

public static function ConvertFromDB($arProperty, $arValue)
{
  if ($arValue['VALUE'] && defined('ADMIN_SECTION') && ADMIN_SECTION===true) {//мы так же проверяем, чтобы форматировалось только в админке
    $time = Bitrix\Main\Type\DateTime::createFromTimestamp($arValue['VALUE']);
    $arValue['VALUE'] = $time;
  }
  return $arValue;
}

И последнее, это вывод поля с календарем на странице редактирования. Берем стандартный Битриксовский:

public function GetPropertyHtml($arProperty, $value, $strHTMLControlName)
  {
    $ret = '<div class="adm-input-wrap adm-input-wrap-calendar"><input class="adm-input adm-input-calendar" type="text" name="'.$strHTMLControlName["VALUE"].'" size="23" value="'.$value['VALUE'].'">';
    $ret .= '<span class="adm-calendar-icon" title="Нажмите для выбора даты" onclick="BX.calendar({node:this, field:\''.$strHTMLControlName["VALUE"].'\', form: \'\', bTime: true, bHideTime: false});"></span>';
    $ret .= '</div>';
    return $ret;
  }