Пользовательское свойство "Строка": указание размера и возможность его изменения

Рейтинг: 5.0047  
На голосовании
Предложил Шкарупа Алексей 08.12.2014 23:58:06

Пользовательское свойство "Строка": указание размера и возможность его изменения

С появлением Highload-блоков и вероятности появления десятков миллионов записей в HL-блоке хочется нормального свойства типа "Строка".

Этому (нормальности) мешает:
1. Невозможность указать допустимый размер свойства "Строка"
Когда вы создаете пользовательское свойство типа "Строка" - отрабатывает класс \CUserTypeString который создает колонку в базе данных по принципу:
switch(strtolower($DB->type))
{
   case "mysql":
      return "text";
 case "oracle":
      return "varchar2(2000 char)";
 case "mssql":
      return "varchar(2000)";
} 
Т.е. даже если вы захотите хранить строку длиной 20 символов - все равно получите в разы больше.

Кроме того типовое свойство "Строка" как вы сами можете увидеть не позволит хранить более 2000 символов в Oracle и MS SQL. А ведь есть соответствующие типы.


2. Это можно было бы исправить если бы было событие OnAfterUpdate в классе CAllUserTypeEntity - но его нет. Так что даже в собственном типе свойства не получается невозможным сделать alt er   table.


Хочется обратить внимание разработчиков 1С-Битрикс на комментарий в файле /bitrix/modules/main/classes/general/usertype.php на строке 563:
* Надо сказать, что для скорейшего завершения разработки было решено пока не реализовывать такую же гибкость как в инфоблоках (обойдемся пока без alter'ов и прочего).


Может пора вернуться и доделать те самые alter-ы и прочее (события)?

Рейтинг: 0  
Pokoev Sergey 09.12.2014 12:50:01
С этими пресловутыми 2000 символами есть другая проблема. В собственном типе пользовательского поля можно указать какой нужен тип. Но проблема в том, что в методе Update в файле /bitrix/modules/main/classes/general/usertype.php в строке 2267 (может меняться от обновления к обновлению) есть строчка:

Т. е. для всех базовых типов и от них созданных собственных, кроме int, file, enum, double, datetime, возвращает только 2000 символов.
Рейтинг: 0  
Шкарупа Алексей 09.12.2014 13:03:29
Это место (где обрезка до 2000 символов при сохранении) хотя бы можно обойти если у себя в свойстве определить метод onbeforesaveall - тогда будет вызван он, а не указанный switch

скриншот