Перейти к основному содержимому
Версия: 7.0

Встроенные классы

Встроенные классы - это классы, экземплярами которых являются объекты примитивных типов данных, такие как целые числа, строки, и т.п.

Имя классаОписаниеЛитералы lsFusion
INTEGERЧетырехбайтное целое число5, 23, 1000000000
LONGВосьмибайтное целое число5l, 23L, 10000000000000L
DOUBLEВосьмибайтное число с плавающей точкой5.0d, 2.35D
NUMERIC, NUMERIC[ , ]Число с фиксированной разрядностью и точностью5.0, 2.35
BOOLEANЛогический тип данныхTRUE, NULL
TBOOLEANЛогический тип данных с отдельным значением «ложь»TTRUE, TFALSE, NULL
DATEДата1982_07_13
DATETIME, DATETIME[ ]Дата и время, при необходимости с точностью до долей секунды (от 0 до 6)1982_07_13_18:00, 1982_07_13_18:00:00
ZDATETIME, ZDATETIME[ ]Дата и время с часовым поясом, при необходимости с точностью до долей секунды (от 0 до 6)
TIME, TIME[ ]Время, при необходимости с точностью до долей секунды (от 0 до 6)18:00, 18:00:00
YEARГод
INTERVAL[DATE], INTERVAL[DATETIME], INTERVAL[TIME], INTERVAL[ZDATETIME]Интервал — пара граничных значений (от / до) соответствующего класса даты / времени
STRING, STRING[ ]Строковый тип данных, при необходимости с максимальной длиной, зависимый от регистра'text', 'text with\nbreak'
ISTRING, ISTRING[ ]Строковый тип данных, при необходимости с максимальной длиной, независимый от регистра
BPSTRING, BPSTRING[ ]Строковый тип данных, при необходимости с максимальной длиной, зависимый от регистра, хранящийся в базе данных строкой фиксированной длины
BPISTRING, BPISTRING[ ]Строковый тип данных, при необходимости с максимальной длиной, независимый от регистра, хранящийся в базе данных строкой фиксированной длины
TEXTСтроковый тип данных произвольной длины, независимый от регистра
RICHTEXTСтроковый тип данных произвольной длины с форматированием, независимый от регистра
HTMLTEXTСтроковый тип данных произвольной длины с HTML-разметкой, независимый от регистра
COLORЦвет#00ccff, #AA55CC, RGB(0, 255, 0)
JSONJSON в нормализованном виде (порядок ключей, дубликаты ключей и форматирование не сохраняются)
JSONTEXTJSON, хранящийся в виде текстовой строки как есть
XMLXML
HTMLHTML-разметка, хранящаяся в виде строки
TSVECTORВектор полнотекстового поиска
TSQUERYЗапрос полнотекстового поиска
FILEФайл динамического типа (содержимое файла вместе с его расширением)
NAMEDFILEФайл динамического типа (содержимое файла вместе с его именем и расширением)
RAWFILE, WORDFILE, IMAGEFILE, PDFFILE, VIDEOFILE, DBFFILE, EXCELFILE, CSVFILE, TEXTFILE, HTMLFILE, JSONFILE, XMLFILE, TABLEFILEФайлы конкретного типа (RAWFILE - файл без расширения / с неизвестным расширением)
LINKСсылка на файл (URI)
RAWLINK, WORDLINK, IMAGELINK, PDFLINK, VIDEOLINK, DBFLINK, EXCELLINK, CSVLINK, TEXTLINK, HTMLLINK, JSONLINK, XMLLINK, TABLELINKСсылка на файл конкретного типа (RAWLINK - ссылка на файл без расширения / с неизвестным расширением)

Наследование

Среди всех встроенных классов можно выделить семь семейств классов (будем считать, что каждый из остальных классов образует свое семейство классов)

Семейство классовКлассы
ЧислаINTEGER, LONG, DOUBLE, NUMERIC, NUMERIC[ , ], YEAR
СтрокиSTRING, STRING[ ], ISTRING, ISTRING[ ], BPSTRING, BPSTRING[ ], BPISTRING, BPISTRING[ ], TEXT, RICHTEXT, HTMLTEXT
Дата и времяDATETIME, DATETIME[ ]
ВремяTIME, TIME[ ]
Дата и время с часовым поясомZDATETIME, ZDATETIME[ ]
Файлы конкретного типаRAWFILE, WORDFILE, IMAGEFILE, PDFFILE, VIDEOFILE, DBFFILE, EXCELFILE, CSVFILE, TEXTFILE, HTMLFILE, JSONFILE, XMLFILE, TABLEFILE
Ссылки на файлы конкретного типаRAWLINK, WORDLINK, IMAGELINK, PDFLINK, VIDEOLINK, DBFLINK, EXCELLINK, CSVLINK, TEXTLINK, HTMLLINK, JSONLINK, XMLLINK, TABLELINK

Встроенные классы наследуют друг друга только в рамках одного семейства и не могут наследовать / наследоваться от пользовательских классов. Наследование в рамках одного семейства строится по принципу: более узкий класс наследуется от более широкого. Если классы семейства различаются сразу по нескольким характеристикам (для строк — дополнение пробелами, независимость от регистра и максимальная длина, для чисел — целая часть и точность), класс наследуется от другого только тогда, когда он не шире ни по одной из них; классы, которые шире по одной характеристике и уже по другой, друг от друга не наследуются, и их общим предком является третий класс того же семейства. В семействах DATETIME, TIME и ZDATETIME точность до долей секунды такой характеристикой не является: любой класс такого семейства наследуется от любого другого класса того же семейства.

Класс, образующий собственное семейство, несовместим с классами других семейств и не имеет с ними общего предка. В частности, класс HTML (в отличие от HTMLTEXT, входящего в семейство строк) несовместим со строковыми классами: выбор с ветками классов HTML и STRING не имеет общего предка, поэтому такое свойство не может принимать значений, и сервер при старте выдаёт ошибку property '...' is always NULL. Сложение (+) значения класса HTML со строкой при этом не является ошибкой, но возвращает обычную строку: результат теряет класс HTML, и разметка при отображении будет экранирована.

Общий предок

В соответствии с описанным механизмом наследования, общий предок двух встроенных классов (например для операции выбора) определяется следующим образом. Если классов больше двух, они объединяются попарно, по очереди. В правилах ниже два объединяемых класса записаны в том порядке, в котором их объединяет платформа; этот порядок имеет значение только там, где каждый из двух классов наследуется от другого — в таких случаях результатом является один из двух классов, и определяется он не самой парой классов.

Строки

IF s1 is TEXT, RICHTEXT or HTMLTEXT
result = s1
ELSE IF s2 is TEXT, RICHTEXT or HTMLTEXT
result = s2
ELSE
result = STRING[blankPadded = s1.blankPadded OR s2.blankPadded,
caseInsensitive = s1.caseInsensitive OR s2.caseInsensitive,
length = MAX(s1.length, s2.length)]

где blankPadded, caseInsensitive и length, в свою очередь, определяются как:

Имя классаblankPaddedcaseInsensitivelength
STRING[n]falsefalsen
ISTRING[n]falsetruen
BPSTRING[n]truefalsen
BPISTRING[n]truetruen

Имя класса, записанное без длины, означает неограниченную длину, которая больше любого n; если длина результата неограниченна, результатом является класс, записанный без длины (STRING, ISTRING, BPSTRING, BPISTRING).

Классы TEXT, RICHTEXT и HTMLTEXT не дополняются пробелами, независимы от регистра и имеют неограниченную длину, а дополнение пробелами, зависимость от регистра и максимальная длина второго класса не учитываются: общим предком BPSTRING[10] и TEXT является TEXT, который не дополняется пробелами. Порядок двух классов имеет значение, только если оба они входят в тройку TEXT, RICHTEXT, HTMLTEXT: эти три класса наследуются друг от друга в обе стороны, поэтому результатом является первый из двух, и такого сочетания следует избегать.

Числа

IF p1.integerPart >= p2.integerPart AND p1.precision >= p2.precision
result = p1
ELSE IF p1.integerPart <= p2.integerPart AND p1.precision <= p2.precision
result = p2
ELSE IF p1.integerPart > p2.integerPart
result = NUMERIC[p1.integerPart+p2.precision, p2.precision]
ELSE
result = NUMERIC[p2.integerPart+p1.precision, p1.precision]

где integerPart и precision, в свою очередь, определяются как:

Имя классаintegerPartprecision
INTEGER100
YEAR100
DOUBLE9999999999
LONG200
NUMERIC[l,p]l - pp
NUMERIC9532

У классов INTEGER и YEAR целая часть и точность совпадают, поэтому каждый из них наследуется от другого, и результатом является первый из двух.

В любом классе NUMERIC общая разрядность (integerPart + precision) не может превышать 127, а точность — 32; если формула даёт бо́льшую разрядность, она урезается до 127, что уменьшает целую часть результата.

Файлы конкретного типа

IF p1 = p2
result = p1
ELSE
result = RAWFILE

Ссылки на файлы конкретного типа

IF p1 = p2
result = p1
ELSE
result = RAWLINK

FILE, NAMEDFILE и LINK не входят ни в одно из этих семейств: они не являются более широкими классами для файлов и ссылок конкретного типа и не имеют общего предка ни с ними, ни друг с другом. Два встроенных класса, у которых нет общего предка, не могут быть возможными результатами одного свойства — например, выбора или экстремума; значение одного из них получается из другого только преобразованием типа, которое пишет разработчик или выполняет сама платформа — как при преобразовании файла конкретного типа к FILE или NAMEDFILE, когда он получает расширение.

Значение по умолчанию

В некоторых случаях для встроенного класса необходимо использовать некоторое значение, которое будет заведомо отличаться от NULL. Это значение будем называть значением по умолчанию. Оно используется:

Определяется значение по умолчанию следующим образом:

Имя классаЗначение по умолчанию
Числовые классы0
Строковые классы'' (пустая строка)
HTML, LINK, ссылки на файлы конкретного типа'' (пустая строка)
DATE, TIME, DATETIME, ZDATETIMEТекущие дата, время, дата / время, дата / время с часовым поясом
YEARТекущий год
Интервальные классыИнтервал от текущего момента до текущего момента
BOOLEANTRUE (единственное значение этого класса, отличное от NULL)
TBOOLEANTTRUE
COLORБелый цвет
JSON, JSONTEXT{}
Файлы конкретного типаПустой файл
FILEПустой файл с пустым расширением
NAMEDFILEПустой файл с пустым именем и расширением
XML, TSVECTOR, TSQUERYОтсутствует

Расширения файлов конкретного типа

При преобразовании файлов конкретного типа (JSONFILE, XMLFILE, ...) к файлу динамического типа (FILE, NAMEDFILE), как явном, так и неявном (например при импорте данных без указания формата или при взаимодействии с внешними системами) расширение результирующего файла определяется следующим образом:

Имя классаРасширение
RAWFILEПустая строка
JSONFILEjson
XMLFILExml
CSVFILEcsv
TEXTFILEtxt
WORDFILEdoc
EXCELFILExls
HTMLFILEhtml
PDFFILEpdf
VIDEOFILEmp4
DBFFILEdbf
IMAGEFILEjpg
TABLEFILEtable

Для классов WORDFILE, EXCELFILE и IMAGEFILE расширение дополнительно зависит от содержимого файла:

Имя классаРасширение
WORDFILEdocx, если файл имеет формат Office Open XML
EXCELFILExlsx, если файл имеет формат Office Open XML
IMAGEFILEpng / bmp, если файл имеет формат PNG / BMP

Содержимое учитывается только тогда, когда значение файла передается как есть - показывается пользователю на форме, отправляется во внешнюю систему или добавляется вложением в письмо. Если файл преобразуется к файлу динамического типа свойством, а также если содержимое не соответствует перечисленным форматам, используется расширение из первой таблицы.

К файлу динамического типа могут преобразовываться и значения классов, не являющихся файлами конкретного типа; в этом случае расширение определяется следующим образом:

Имя классаРасширение
HTMLhtml
XMLxml
JSON, JSONTEXTjson
Строковые классы, LINK, ссылки на файлы конкретного типаПустая строка

Результирующие свойства

Для каждого встроенного класса в платформе объявлено результирующее свойство - свойство без параметров, хранящее значение этого класса. Через них действие, вызванное из внешней системы, передаёт свой результат в ответ: если в запросе не указаны возвращаемые свойства и у самого действия нет результата, в ответ попадает значение первого свойства из списка ниже, не равное NULL; список просматривается сверху вниз. Если значения всех этих свойств равны NULL, ответ будет пустым.

Имя классаИмя свойства
FILEexportFile[]
RAWFILEexportRawFile[]
WORDFILEexportWordFile[]
IMAGEFILEexportImageFile[]
PDFFILEexportPdfFile[]
VIDEOFILEexportVideoFile[]
DBFFILEexportDbfFile[]
EXCELFILEexportExcelFile[]
TEXTFILEexportTextFile[]
CSVFILEexportCsvFile[]
HTMLFILEexportHtmlFile[]
JSONFILEexportJsonFile[]
XMLFILEexportXmlFile[]
TABLEFILEexportTableFile[]
NAMEDFILEexportNamedFile[]
TEXTexportText[]
RICHTEXTexportRichText[]
HTMLTEXTexportHTMLText[]
STRINGexportString[]
BPSTRINGexportBpString[]
NUMERICexportNumeric[]
LONGexportLong[]
INTEGERexportInteger[]
DOUBLEexportDouble[]
DATETIMEexportDateTime[]
ZDATETIMEexportZDateTime[]
INTERVAL[DATE]exportIntervalDate[]
INTERVAL[DATETIME]exportIntervalDateTime[]
INTERVAL[TIME]exportIntervalTime[]
INTERVAL[ZDATETIME]exportIntervalZDateTime[]
DATEexportDate[]
TIMEexportTime[]
YEARexportYear[]
LINKexportLink[]
RAWLINKexportRawLink[]
WORDLINKexportWordLink[]
IMAGELINKexportImageLink[]
PDFLINKexportPdfLink[]
VIDEOLINKexportVideoLink[]
DBFLINKexportDbfLink[]
EXCELLINKexportExcelLink[]
TEXTLINKexportTextLink[]
CSVLINKexportCsvLink[]
HTMLLINKexportHtmlLink[]
JSONLINKexportJsonLink[]
XMLLINKexportXmlLink[]
TABLELINKexportTableLink[]
BOOLEANexportBoolean[]
TBOOLEANexportTBoolean[]
COLORexportColor[]
JSONexportJSON[]
JSONTEXTexportJSONText[]
XMLexportXML[]
Пользовательские классыexportObject[]
TSVECTORexportTSVectorLink[]

Язык

Встроенный класс записывается в коде как идентификатор класса - ключевое слово, обозначающее этот класс. Значения встроенных классов записываются в виде литералов, каждый из которых имеет свою форму и ограничения.