Мельница данных- Принятый стандарт структур для обмена данными  (раздел целиком)  (12.12.2025)
Принятый стандарт структур для обмена данными


1. Стандартные структуры для передачи запроса

Для выполнения запроса к данным и получения ответа необходимо передавать информацию о том, к какому объекту (классу, представлению) должен быть выполнен запрос, об условиях отбора сортировки, группировки данных в ответе. Для передачи этой информации платформой "Мельница данных" используются следующие форматы структур данных:


1.1. Структура XML-документа

Для передачи информации о запросе в формате XML необходимо сформировать XML-документ, отвечающий следующим требованиям:

  1. Документ должен иметь один корневой элемент. Имя такого элемента может быть любым, оно не анализируется. В примере ниже такой элемент имеет имя query.
  2. Корневой элемент должен иметь следующие атрибуты:
    • class (обязательный): имя класса или представления, к которому должен быть выполнен запрос;
    • fetchall (необязательный, допустимые значения "0" или "1", по умолчанию "0"): атрибут, позволяющий управлять режимом получения возвращаемого ответа на запрос в случае наличия ограничений на допустимый размер возвращаемого ответа; использование этого атрибута подробнее описано в разделе Использование возвращаемого ответа.
  3. Корневой элемент должен иметь набор дочерних элементов, описывающих условия отбора, сортировки, группировки возвращаемых данных. Эти элементы могут иметь любое имя, в примере ниже они имеют имя item. Каждый элемент второго уровня соответствует одной из частей (кляуз) sql-запроса: what, where, order by, group by и т.д.
  4. Элементы второго уровня должны иметь ряд атрибутов, из которых обязательным является только атрибут part. Обязательность других атрибутов может быть взаимно обусловлена их значениями.
    • part (обязательный): указывает на часть (кляузу) запроса, которой соответствует элемент второго уровня;
    • name: в простом случае (без использования атрибута special) - имя свойства класса (или поля представления), которое будет использовано в запросе; при использовании special может быть как именем свойства класса, так и другой строкой (подробнее: в разделах Допустимые значения part, Допустимые значения special); 
    • value - значение, которое, в зависимости от значений атрибутов part и special, будет использовано для сравнений или для других целей; в простом случае (если part = "where", special отсутствует) будет использовано для сравнения в условии отбора при выполнении запроса (подробнее: в разделах Допустимые значения part, Допустимые значения special);
    • special - вводит дополнительные возможности формирования запроса (подробнее: в разделе Допустимые значения special); от использованного значения special может зависеть обязательность и трактовка значений других атрибутов.
    • subQuery
    • joinKey
    • joinLink
    • joinSource  
  5. Элементы второго уровня могут иметь дочерние элементы третьего уровня parameters или context (имя этих элементов может быть любым, оно не анализируется), которые, в свою очередь, могут иметь дочерние элементы. Элементы третьего уровня с набором своих дочерних элементов интерпретируется тем или иным образом в зависимости от значения атрибута special; например, если special имеет значение "function" (22), то набор дочерних узлов элемента parameters будет интерпретироваться как набор параметров функции с их значениями (подробнее: в разделе Допустимые значения special). 

Пример
Пример XML-документа стандартной структуры:
01<query class="TWorker" fetchall="1">
02  <item part="what" name="LastName" />
03  <item part="what" name="FirstName"/>
04  <item part="what" name="BirthDate"/>
05  <item part="what" name="AcademicDegree"/>
06  <item part="what" name="ContactList" value="TPerson.GetContactList" special="function">
07    <parameters>
08      <ContactType>63474</ContactType>
09    </parameters>
10  </item>
11  <item part="where" name="LastName" value="A*"/>
12  <item part="order" name="LastName"/>
13  <item part="order" name="FirstName"/>
14</query>


1.2. Структура объекта JSON

Для передачи информации о запросе в виде объекта JSON, такой объект должен отвечать следующим требованиям:

  1. Объект JSON должен иметь поля:
    • class (обязательно): имя класса или представления, к которому должен быть выполнен запрос;
    • fetchall (необязательно, допустимые значения "0" или "1", по умолчанию "0"): поле, позволяющее управлять режимом получения возвращаемого ответа на запрос в случае наличия ограничений на размер возвращаемого ответа; использование этого поля подробнее описано в разделе Использование возвращаемого ответа.
    • items (необязательно): массив объектов, описывающих условия отбора, сортировки, группировки возвращаемых данных; каждый из этих объектов соответствует одной из частей (кляуз) sql-запроса: what, where, order by, group by и т.д.
  2. Объекты массива items могут иметь ряд полей, из которых обязательным является только поле part. Обязательность других полей может быть взаимно обусловлена их значениями. Поля объектов массива items:
    • part (обязательно): указывает на часть (кляузу) запроса, которой соответствует данный объект массива;
    • name: в простом случае (без использования поля special) - имя свойства класса (или поля представления), которое будет использовано в запросе; при использовании special может быть как именем свойства класса, так и другой строкой (подробнее: в разделах Допустимые значения part, Допустимые значения special); 
    • value - значение, которое, в зависимости от значений полей part и special, будет использовано для сравнений или для других целей; в простом случае (если part = "where", special отсутствует) будет использовано для сравнения в условии отбора при выполнении запроса (подробнее: в разделах Допустимые значения part, Допустимые значения special);
    • special - вводит дополнительные возможности формирования запроса (подробнее: в разделе Допустимые значения special); от использованного значения special может зависеть обязательность и трактовка значений других полей.
    • subQuery
    • joinKey
    • joinLink
    • joinSource 
    • context - массив объектов, который интерпретируется тем или иным образом в зависимости от значения поля special; например, если special имеет значение "function" (22), то этот массив будет интерпретироваться как набор параметров функции и их значений (подробнее: в разделе Допустимые значения special).

Пример
Пример объекта JSON стандартной структуры:
01{
02  "class": "TWorker",
03  "fetchall": 1,
04  "items":
05    [
06      {
07        "part": "what",
08        "name": "LastName"
09      },
10      {
11        "part": "what",
12        "name": "FirstName"
13      },
14      {
15        "part": "what",
16        "name": "BirthDate"
17      },
18      {
19        "part": "what",
20        "name": "AcademicDgree"
21      },
22      {
23        "part": "what",
24        "name": "ContactList",
25        "value": "TPerson.GetContactList",
26        "special": "function",
27        "context": [
28          {
29            "ContactType": "63474"
30          }
31        ]
32      },
33      {
34        "part": "where",
35        "name": "LastName",
36        "value": "А*"
37      },
38      {
39        "part": "order",
40        "name": "LastName"
41      },
42      {
43        "part": "order",
44        "name": "FirstName"
45      }
46    ]
47}


1.3. Допустимые значения part

Описанные ниже допустимые значения part используются для формирования структур для выполнения запросов. Их смысл и назначение являются общими для формирования запросов в формате XML, в формате JSON, а также средствами Интерфейса IContextDataSet.

Для форматов XML и JSON можно использовать и строковые, и числовые значения part. В запросах, формируемых средствами Интерфейса IContextDataSet допустимо присваивать числовые значения или идентификаторы из Перечисления TQueryPart.

Строковое
значение
Числовое
значение
ИдентификаторНазначение и принципы использования
what 0 qtWhat

Значение what используется для формирования what-кляузы запроса.

При part = "what" использование атрибута/поля name является обязательным.

Каждый элемент запроса со значением what атрибута/свойства part  добавляет одно поле (столбец), с именем, заданным значением name, к результирующему набору данных. Атрибут/свойство  value в этом случае игнорируется.

Подробности и примеры для разных форматов
where 1 qtWhere

Значение  where  используется для формирования where-кляузы запроса.

При part = "where" использование атрибутов/полей name и value является обязательным. В простом случае (без использования "special") name задает имя поля, на которое будет наложено условие отбора, значение value задает само условие, которое будет наложено. При использовании "special" значения name и value могут трактоваться иначе, подробнее в разделе Допустимые значения special.

Каждый следующий where-элемент/объект добавляет к запросу одно условие "и".

Для условий допустимо использовать "маску" (*, ?), условия ">", "<", ">=", "<=".
Использование значений через ";" будет трактовано как условие "или", использование символа "&" будет трактовано как условие "и".
Для отрицания нужно использовать символ "!", для условия "not null" нужно использовать "*", для условия "is null" нужно использовать "!*".

Подробности и примеры для разных форматов  

order 2 qtOrder Элементы со значением "order" (2) атрибута part используются для управления сортировкой данных в возвращаемом ответе. По умолчанию (без использования атрибута special) будет выполнена сортировка "по возрастанию". Задать сортировку "по убыванию" можно, использовав значение "desc" (7) для атрибута special. Если в запросе использовано несколько элементов "order", то возвращаемый результат будет отсортирован по нескольким полям в том порядке, в котором они указаны в запросе.
Пример
1<item part="order" name="LastName/>
2<item part="order" name="BirthDate" special="desc"/>
Отсортировать результат запроса по значению свойства "LastName" по возрастанию, затем по значению свойства "BirthDate" по убыванию.
group 3 qtGroup Элементы со значением "group" (3) атрибута part используются для управления группировкой данных в возвращаемом ответе. Если в запросе использовано несколько элементов "group", то возвращаемый результат будет сгруппирован по нескольким полям в том порядке, в котором они указаны в запросе. Для свойств, не входящих в условия группировки, можно получать значения агрегатов (количество, наименьшее/наибольшее/среднее и т.п.), используя атрибут special.
Пример
1<item part="what" name="Region"/>
2<item part="what" name="ID" special="count"/>
3<item part="what" name="BirthDate" special="min"/>
4<item part="group" name="Region"/>
Сгруппировать результат запроса по значению свойства "Region", для каждой группы вернуть значение свойства "Region", количество записей в группе и минимальное значение свойства "BirthDate" в этой группе.
having 4 qtHaving Элементы со значением "having" (4) атрибута part позволяют накладывать условия отбора на группы в запросе с группировкой.
Пример
1<item part="what" name="Region"/>
2<item part="what" name="ID" special="count"/>
3<item part="what" name="BirthDate" special="min"/>
4<item part="group" name="Region"/>
5<item part="having" name="ID" value=">3" special="count"/>
Сгруппировать результат запроса по значению свойства "Region", для каждой группы вернуть значение свойства "Region", количество записей в группе и минимальное значение свойства "BirthDate" в этой группе, отобрав при этом только такие группы, количество объектов в которых больше 3-х.
innerJoin 5 qtInnerJoin
outerJoin 6 qtOuterJoin

1.3.1. значение what (0)
Формат XML: Значение what  атрибута  part используется для формирования what-кляузы запроса. В полученном ответе каждому такому элементу будет соответствовать один XML-элемент (объект JSON в случае вызова с расширением .js/.json) с именем, переданным значением атрибута  name.
Пример
1...
2  <item part="what" name="LastName"/>
3  <item part="what" name="FirstName"/>
4...

Формат JSON: Значение what поля  part используется для формирования what-кляузы запроса. В полученном ответе каждому такому полю будет соответствовать одно поле JSON-объекта (один XML-элемент в случае вызова с расширением .xml) с именем, переданным значением атрибута  name.

Пример
01[
02  ...
03  {
04    "part": "what",
05    "name": "LastName"
06  },
07  {
08    "part": "what",
09    "name": "FirstName"
10  },
11  ...
12]

Интерфейс IContextDataSet: Значение what параметра  part функции AddQueryItem используется для формирования what-кляузы запроса. После первого обращения к объекту, реализующему интерфейс IContextDataSet будет выполнен запрос, и в полученном наборе данных будет поле с именем, переданным параметром name.  

Пример
1...
2LDataSet.AddQueryItem 0, "LastName"
3LDataSet.AddQueryItem 0, "FirstName"
4...


1.3.2. значение where (1)

XML: Элементы со значением "where" (1) атрибута part используются для формирования условия отбора объектов (where-кляузы запроса). 

Пример
1...
2<item part="where" name="LastName" value="A*"/>
3<item part="where" name="FirstName" value="John"/>
4<item part="where" name="AcademicDegree" value="!*"/>
5...
Отобрать объекты класса со значением свойства "LastName", начинающимся с символа "A", и значениями "FirstName", равным "John" и с пустым значением свойства "AcademicDegree".

JSON:  Объекты со значением "where" (1) поля part используются для формирования условия отбора объектов (where-кляузы запроса).
Пример
01[
02  ...
03  {
04    "part": "where",
05    "name": "LastName",
06    "value": "A*"
07  },
08  {
09    "part": "where",
10    "name": "FirstName",
11    "value": "John"
12  },
13  {
14    "part": "where",
15    "name": "AcademicDegree",
16    "value": "!*" },
17  ...
18]
Отобрать объекты класса со значением свойства "LastName", начинающимся с символа "A", и значениями "FirstName", равным "John" и с пустым значением свойства "AcademicDegree".


1.4. Допустимые значения special

Допустимые значения атрибута (поля) special (можно использовать как строковые, так и числовые значения):

Строковое
значение
Числовое
значение
Части запросаНазначение и пример использования
ID 1 what
where
Позволяет запрашивать идентификатор объекта или накладывать условия по идентификатору.
Пример
1<query class="TWorker">
2  <item part="what" special="ID"/>
3  <item part="what" name="LastName"/>
4  <item part="what" name="FirstName"/>
5  <item part="where" value="5500921" special="ID"/>
6</query>
Получить идентификатор объекта, значения свойств LastName, FirstName объекта с идентификатором, равным 5500921. Ответ на запрос будет содержать элемент с именем ID.
parent 2 what
where
Позволяет использовать в запросах идентификатор "родителя" объекта.
Пример
1<query class="TCountry">
2  <item part="what" special="ID"/>
3  <item part="what" special="parent"/>
4  <item part="what" name="Name"/>
5  <item part="what" name="Description"/>
6</query>
Получить идентификатор объекта, идентификатор родительского объекта, значения свойств Name, Description всех объектов класса TCountry. Ответ на запрос будет содержать элемент с именем Parent.
haschildren 3 what
where
Признак наличия дочерних объектов в иерархии. Ответ на запрос будет содержать элемент с именем HasChildren и значением "1" в случае наличия дочерних объектов и значением "0" в случае их отсутствия.
Пример
1<query class="TCountry">
2  <item part="what" name="Name"/>
3  <item part="what" name="Description"/>
4  <item part="what" special="haschildren"/>
5</query>
Получить значения свойств Name, Description, а также признак наличия дочерних объектов всех объектов класса TCountry.
filter 4 where Позволяет использовать для отбора условия, заданные доменами, использованными в решении на платформе. Имя или идентификатор домена указывается в атрибуте name. Условие отбора этого домена будет интерпретировано с учетом значений, переданных в дочернем элементе context. Для каждого из этих значений должны быть указаны его имя, домен и значение.
Пример
1<query class="TCountry">
2  <item part="what" name="Name"/>
3  <item part="what" name="Description"/>
4  <item part="where" name = "TRegion of UnivCountry domain" special="filter>
5      <context>
6        <UnivCountry domain="4565848">67991</UnivCountry>
7      </context>
8  </item>
9</query>
Получить значения свойств Name, Description объектов класса TCountry, подходящих под условие отбора домена "TRegion of UnivCountry domain", используя значение "67991" вместо идентификатора UnivCountry.
Условие отбора домена "TRegion of UnivCountry domain":
((Self.Parent = UnivCountry) or (Self = UnivCountry))
uplink 5 what
where
Используется для отбора данных в контексте выбранных родительских объектов. Связь отбираемых объектов с выборкой связанных родительских объектов будет установлена по свойству, переданному атрибутом name. В атрибуте value может быть передан идентификатор одного объекта, список идентификаторов объектов через ";" или идентификатор буфера, в который предварительного сохранен список объектов.
Пример
1<query class="TCountry">
2  <item part="where" name="Parent" value="14750" special="uplink"/>
3  <item part="what" name="Name"/>
4  <item part="what" name="Description"/>
5</query>
Получить значения свойств Name, Description объектов класса TCountry, у которых значение свойства Parent равно "14750" (или входит в состав объектов, сохраненных в буфере с идентификатором "14750").
root 6 where Будут отобраны только объекты, не имеющие родителя, после наложения других условий отбора.
Пример
1<query class="TCountry">
2  <item part="what" name="Name"/>
3  <item part="what" name="Description"/>
4  <item part="where" special="root"/>
5</query>
Получить значения свойств Name, Description "корневых" (не имеющих родителя) объектов класса TCountry.
desc 7 order Используется для сортировки "по убыванию" для элементов с атрибутом part ="order". Без указания атрибута special будет выполнена сортировка "по возрастанию".
Пример
1<item part="order" name="LastName"/>
2<item part="order" name="BirthDate" special="desc"/>
Отсортировать результат запроса по значению свойства "LastName" по возрастанию, затем по значению свойства "BirthDate" по убыванию.
count 8 what
having
Используется для запросов с группировкой, в элементах, у которых part = "what" или "having" для получения количества объектов в группе.
Пример
1<item part="what" name="Region"/>
2<item part="what" name="ID" special="count"/>
3<item part="group" name="Region"/>
4<item part="having" name="ID" value=">3" special="count"/>
Сгруппировать результат запроса по значению свойства "Region", для каждой группы вернуть значение свойства "Region" и количество записей в группе, отобрав при этом только такие группы, количество объектов в которых больше 3-х.
sum 9 what
having
Используется для запросов с группировкой, в элементах, у которых part = "what" или "having" для получения суммы значений свойства, имя которого передано атрибутом name.
Пример
1<item part="what" name="Region"/>
2<item part="what" name="PayedSum" special="sum"/>
3<item part="group" name="Region"/>
Сгруппировать результат запроса по значению свойства "Region", для каждой группы вернуть значение свойства "Region" и сумму значений свойства "PayedSum" для всех объектов группы.
min 10 what
having
Используется для запросов с группировкой, в элементах, у которых part = "what" или "having" для получения минимального значения свойства, имя которого передано атрибутом name.
Пример
1<item part="what" name="Region"/>
2<item part="what" name="BirthDate" special="min"/>
3<item part="group" name="Region"/>
Сгруппировать результат запроса по значению свойства "Region", для каждой группы вернуть значение свойства "Region" и минимальное значение свойства "BirthDate" среди всех объектов группы.
max 11 what
having
Используется для запросов с группировкой, в элементах, у которых part = "what" или "having" для получения максимального значения свойства, имя которого передано атрибутом name.
Пример
1<item part="what" name="Region"/>
2<item part="what" name="BirthDate" special="max"/>
3<item part="group" name="Region"/>
Сгруппировать результат запроса по значению свойства "Region", для каждой группы вернуть значение свойства "Region" и максимальное значение свойства "BirthDate" среди всех объектов группы.
avg 12 what
having
Используется для запросов с группировкой, в элементах, у которых part = "what" или "having" для получения среднего значения свойства, имя которого передано атрибутом name.
Пример
1<item part="what" name="Region"
2<item part="what" name="PayedSum" special="avg"/>
3<item part="group" name="Region"/>
Сгруппировать результат запроса по значению свойства "Region", для каждой группы вернуть значение свойства "Region" и среднее значение свойства "PayedSum" среди всех объектов группы.
masterLink 13 where Позволят наложить отбор на объекты класса ("подчиненный" класс) в контексте выбранных объектов класса-мастера или класса, связанного с исходным по другому свойству ("главный" класс). В атрибуте name в этом случае передаются имена свойства "главного" класса и свойства "подчиненного" класса, по которым эти классы связаны. Имена свойств указываются следующим образом:
  • Если одним из этих свойств является идентификатор (ID), то имя этого свойства не указывается (это свойство используется по умолчанию)
  • Если оба свойства отличаются от ID, то их имена указываются через разделитель ";", например, "Master;Person"
  • Если только свойство "подчиненного" класса отличается от ID, то указывается только имя этого свойства, например, "Person"
  • Если только свойство "главного" отличается от ID, то вместо свойства-подчиненного указывается *, например, "Master;*"
В свойстве value передается идентификатор буфера, содержащего список выбранных объектов "главного" класса.
Пример
1<query class="TContact">
2  <item part="what" name="ContactInfo"/>
3  <item part="what" name="ContactType" special="name"/>
4  <item part="where" name="Person" value="246889" special="masterLink"/>
5</query>
Получить значения свойств ContactInfo, ContactType (Имя) объектов класса TContact, для объектов, список которых сохранен в буфере с идентификатором "246889", связанным с классом TContact по свойству Person.
selectedOnly 14 where Позволят наложить отбор по списку идентификаторов объектов класса, ранее сохраненных в буфере.
Пример
1<query class="TPerson">
2  <item part="what" name="LastName"/>
3  <item part="what" name="FirstName"/>
4  <item part="where" value="246889" special="selectedOnly"/>
5</query>
Получить значения свойств LastName, FirstName объектов класса TPerson, список которых сохранен в буфере с идентификатором "246889".
distinct 15 what Позволяет получить все уникальные значения определенного свойства или сочетания значений свойств класса.
Пример
1<query class="TPerson">
2  <item part="what" name="FirstName"/>
3  <item part="what" special="distinct"/>
4</query>
Получить набор уникальных значений свойства FirstName класса TPerson.
1<query class="TPerson">
2  <item part="what" name="FirstName"/>
3  <item part="what" name="MiddleName"/>
4  <item part="what" special="distinct"/>
5</query>
Получить набор уникальных сочетаний значений свойств FirstName и MiddleName класса TPerson.
view 16 where Позволяет при выполнении запроса наложить отбор, используемый для определенного представления. Имя (или идентификатор) представления указывается в атрибуте name.
Пример
1<query class="TPerson">
2  <item part="where" name="Persons older 25" special="view"/>
3  <item part="what" name="FirstName"/>
4  <item part="what" name="LastName"/>
5</query>
Получить значения свойств FirstName, LastName объектов класса TPerson, соответствующих условиям отбора представления Persons older 25.
caseInsensitive 17 where Позволяет наложить отбор на значение свойства строкового типа без учета регистра. Без использования special поиск ведется с учетом регистра.
Пример
1<query class="TPerson">
2  <item part="what" name="FirstName"/>
3  <item part="what" name="LastName"/>
4  <item part="where" name="FirstName" value="АНДРЕЙ" special="caseInsensitive"/>
5</query>
Получить значения свойств FirstName, LastName объектов класса TPerson, с отбором по значению свойства FirstName без учета регистра символов. TPerson.
string 18 where Позволят явно приводить к строковому типу значения свойства, переданного атрибутом name.
Пример
1<query class="TCountry">
2  <item part="what" name="Name"/>
3  <item part="what" name="Description"/>
4  <item part="where" name="Code" value="00002" special="string"/>
5</query>
Получить значения свойств Name, Description объектов класса TCountry, со значением свойства Code, равным "00002".
listed 19 where Позволяет выполнять отбор по списку объектов, входящих в список, сохраненный в системе как объект класса TObjectList ("Списки"), идентификатор которого нужно передать в качестве значения атрибута value.
Пример
1<query class="TCountry">
2  <item part="what" name="Name"/>
3  <item part="what" name="Description"/>
4  <item part="where" name="ID" value="5245654" special="listed"/>
5</query>
Получить значения свойств Name, Description объектов класса TCountry, входящих в список, сохраненный как объект класса TObjectList с идентификатором "5245654".
name 20 what
where
Для свойств-ссылок на объекты позволяет получить Имя объекта, переданного атрибутом name. В полученном ответе соответствующий элемент будет иметь имя ИмяСвойства-N.
Пример
1<query class="TCountry">
2  <item part="what" name="Name"/>
3  <item part="what" name="Description"/>
4  <item part="what" name="Parent"/>
5  <item part="what" name="Parent" special="name"/>
6</query>
Для всех объектов класса TCountry получить значения свойств Name, Description, Parent, а также Имя объекта Parent.
description 21 what
where
Для свойств-ссылок на объекты позволяет получить Наименование объекта, переданного атрибутом name. В полученном ответе соответствующий элемент будет иметь имя ИмяСвойства-D.
Пример
1<query class="TCountry">
2  <item part="what" name="Name"/>
3  <item part="what" name="Description"/>
4  <item part="what" name="Parent"/>
5  <item part="what" name="Parent" special="description"/>
6</query>
Для всех объектов класса TCountry получить значения свойств Name, Description, Parent, а также Наименование объекта Parent.
function 22 what
where
Позволяет использовать значения, полученные в результате вызова функций, как в элементах с атрибутом part ="what", так и в элементах с атрибутом part ="where". Имя функции должно быть передано в атрибуте value в формате Имя класса.Имя функции. Если функция имеет параметры, то для их передачи необходимо добавить дочерний элемент context, со своими дочерними элементами для каждого из параметров в формате <ИмяПараметра>Значение параметра</ИмяПараметра>. Если функция является "методом объекта", параметр "ID" добавлять не нужно, он будет использован автоматически. В элементах с атрибутом part ="what" значение атрибута name может быть любым, оно не будет использовано при выполнении запроса, но станет именем элемента данных в получаемом ответе.
Пример
01<item part="what" name="InitAndLast" value="TPerson.GetInitAndLast" special="22"/>
02<item part="what" name="ContactList" value="TPerson.GetContactList" special="22">
03  <context>
04    <ContactType>63474</ContactType>
05  </context>
06</item>
07<item part="where" name="TWorker.IsSuperior" value="1" special = "function">
08  <context>
09    <OtherWorker>625186</OtherWorker>
10    <Department></Department>
11  </context>
12</item>
Получить результат выполнения функции GetInitAndLast класса TPerson (функция не имеет параметров), получить результат выполнения функции GetContactList класса TPerson с параметром ContactType = 625186. Отобрать только те объекты, для которых результат выполнения функции IsSuperior класса TWorker равен "1". Функция IsSuperior вызывается со значением 625186 параметра OtherWorker и пустым значением параметра Department.
countdistinct 23 what
having
Позволяет получить количество уникальных значений свойства.
Пример
1<query class="TPerson">
2  <item part="what" name="FirstName" special="countdistinct"/>
3</query>
Получить количество уникальных значений свойства FirstName класса TPerson.
boolean 24 what
where
Позволят приводить к "логическому" типу значения свойства, переданного атрибутом name. Приведение выполняется по следующему принципу:
  • значение Null преобразуется в пустое значение в ответе
  • значение "0" остается значением "0" в ответе
  • любое непустое значение преобразуется в значение "1" в ответе
Такая возможность позволяет, например, более эффективно (без получения самих значений) определять пустоту/непустоту значений типа "большой объект".
Пример
1<query class="TCountry">
2  <item part="what" name="Name"/>
3  <item part="what" name="Description"/>
4  <item part="what" name="Code" special="boolean"/>
5</query>
Получить значения свойств Name, Description, а также значение свойства Code, преобразованное к "логическому" всех объектов класса TCountry.
exact 25 where При использовании значения "exact" (25) атрибута special значение, переданное в атрибуте value, будет использовано "как есть" - без преобразования типов, без трактовки символов "*", "?" как маски и т.п.
Пример
1<query class="TCountry">
2  <item part="what" name="Name"/>
3  <item part="what" name="Description"/>
4  <item part="where" name="Code" value = "002*25?" special="exact"/>
5</query>
Получить значения свойств Name, Description объектов класса TCountry со значением свойства Code, равным "002*25?".
searchindex 26 where Позволяет использовать индексы полнотекстового поиска при отборах. Поиск по выполняться по всем полям класса, значение атрибута name будет проигнорировано.
Пример
1<query class="TMailMessage">
2  <item part="what" name="Theme"/>
3  <item part="what" name="Body"/>
4  <item part="what" name="Created"/>
5  <item part="where" value="приглашаем *на семинар *Современные" special="searchindex">
6</query>
Получить значения свойств Theme, Body, Created объектов класса TMailMessage, среди значений свойств которых будет найдена указанная строка, с использованием индекса полнотекстового поиска.
optimization 27 where Позволяет использовать имеющиеся подсказки оптимизатору при выполнении запроса.
Пример
1<query class="TPerson">
2  <item part="what" name="FirstName"/>
3  <item part="what" name="LastName"/>
4  <item part="what" value="ORARefreshOnFetch=true;APPRefreshOnFetch=true" special="optimization">
5</query>
Получить значения свойств FirstName, LastName объектов класса TPerson, используя при выполнении запроса подсказки оптимизатору.

2. Стандартные структуры передачи данных

Информация, которую можно получить средствами платформы, может представлять собой структуры данных или объекты.

Для передачи данных и объектов предусмотрены следующие форматы:


2.1. Стандартная структура передачи данных в формате XML-документа

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

Пример

 Пример структуры данных в формате XML-документа:

01<data handle="{FDF9EE70-9948-4A99-8233-349C3ADD3CE8}" eof="1">
02  <row num="2">
03    <ID type="int64">6524</ID>
04    <LastName>Abrams</LastName>
05    <FirstName>Steaven</FirstName>
06    <BirthDate type="date">10.06.1982</BirthDate>
07    <Country>526547</Country>
08    <Country-N>USA</Country-N>
09    <Country-D>United States of America</Country-D>
10    <AcademicDegree>PhD</AcademicDegree>
11    <ContactList>856 45 12 46;756 12 45 41</ContactList>
12    <Photo type="file">#00000000001506D00BD85C3C</Photo>
13  </row>
14  <row num="1">
15    <ID type="int64">6525</ID>
16    <LastName>Adkisson</LastName>
17    <FirstName>Amalia</FirstName>
18    <BirthDate type="date">24.08.1979</BirthDate>
19    <Country>526537</Country>
20    <Country-N>France</Country-N>
21    <Country-D>Republic of France</Country-D>
22    <AcademicDegree>Doctor of Arts</AcademicDegree>
23    <ContactList/>
24    <Photo/>
25  </row>
26  <row num="3">
27    <ID type="int64">6526</ID>
28    <LastName>Adkisson</LastName>
29    <FirstName>Maria</FirstName>
30    <BirthDate type="date">05.09.1980</BirthDate>
31    <Country>526854</Country>
32    <Country-N>Spain</Country-N>
33    <Country-D>Kingdom of Spain</Country-D>
34    <AcademicDegree/>
35    <ContactList>656 545 12 54</ContactList>
36    <Photo/>
37  </row>
38</data>

Корневой элемент документа может иметь имя "data" или любое другое имя (значение имени корневого элемента не анализируется). Этот элемент имеет следующие атрибуты:

  • handle (необязательный): Строковый идентификатор структуры данных, который позволяет дальнейшие обращения к ней;
  • eof (необязательный): Атрибут, который может принимать значения "1" или "0". Значение "1" или отсутствие этого атрибута означает, что набор данных является полным (получен полностью в ответ на запрос), значение "0" означает, что данные получены не полностью; в этом случае можно запрашивать дополнительные данные, используя только значение handle до тех пор, пока в ответе не будет получено значения eof="1". Подробнее: Использование возвращаемого ответа.

Корневому элементу подчинены элементы "row". Эти элементы также могут иметь любое имя (значение имен элементов второго уровня не анализируется). Каждый элемент второго уровня соответствует одной записи структуры данных. Элементы второго уровня могут иметь атрибут:

  • num (необязательный): порядковый номер записи.

Каждому элементу второго уровня подчинены элементы, соответствующие полям структуры данных их значениям. Имя элемента соответствует имени поля, значение элемента - значению этого поля. Эти элементы могут иметь атрибут:

  • type (необязательный): позволяет указать тип данных поля для более эффективного разбора XML-документа, корректного использования и контроля значений. Данный атрибут может принимать одно из следующих значений:
    • int - указывает, что значение имеет тип целого числа размером до 32 бит;
    • int64 - указывает, что значение имеет тип целого числа размером до 64 бит;
    • dbl - указывает, что значение имеет тип числа с плавающей точкой;
    • bin - указывает на то, что значение поля может быть сжато и представлено в кодировке Base64;
    • date - указывает, что значение имеет тип даты или даты со временем;
    • file - указывает, что значение представляет собой ссылку на имя файла;
    • clob - указывает, что значение имеет тип "большого строкового значения";
    • ascii - указывает, что значение является строкой в ascii - кодировке.

2.2. Стандартная структура передачи объектов в формате XML-документа

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

К структуре XML-документа предъявляются следующие требования:

1. Документ должен иметь один корневой элемент. Имя этого элемента может быть любым, оно не анализируется (в примере ниже - элемент root). Корневой элемент не имеет атрибутов.

2. Корневому элементу должны быть подчинены элементы, соответствующие каждому из объектов, включаемых в документ. Это должен быть сам объект, который должен быть передан, объекты, на которые этот объект ссылается, а также подчиненные объекты (связанные с основным объектом по свойству Master). Элементы второго уровня могут иметь любые имена, эти имена не анализируются (в примере ниже - элементы object).

3. Информация об объектах может быть представлена в краткой форме или в полной форме. За это отвечает атрибут элемента второго уровня с именем Brief,  который может принимать значения "0" или "1". Краткая форма представления объекта (атрибут Brief="1") предполагает передачу только тех свойств объекта, которые отвечают за его идентификацию в системе. Полная форма представления объекта (атрибут Brief="0" или отсутствует) предполагает передачу полного набора свойств объекта.

4. Элементы второго уровня должны иметь следующие атрибуты:

  • ID (обязательный, int64) - идентификатор объекта в системе, из которой он получен;
  • Brief (обязательный для передачи в краткой форме, допустимы значения "0" (по умолчанию) или "1") - указание на то, передается ли объект в краткой или в полной форме; для передачи в краткой форме должен иметь значение "1", для передачи в полной форме должен иметь значение "0" или может отсутствовать;
  • Class (обязательный при передаче объекта в полной форме, int64) - идентификатор Класса объекта;
  • Master (необязательный, int64) - значение свойства Master объекта; указывается для объектов, принадлежащих к классам, имеющим класс-мастер.
  • Parent (необязательный, int64) - значение свойства Parent объекта; указывается для объектов, принадлежащих к иерархическим классам.
  • DBGUID (обязательный, строка в формате GUID) - GUID Базы данных, в которой объект был создан;
  • SourceID (обязательный, int64) - идентификатор объекта, полученный объектом при создании в той Базе данных, в которой объект был создан.

5. При передаче объектов в полной форме элементы второго уровня должны иметь подчиненные элементы, соответствующие свойствам объекта. Каждый такой элемент должен иметь имя, совпадающее с именем свойства. Если свойство имеет простой тип, то значение такого свойства должно быть значением элемента. Если свойство имеет тип ссылки на другой объект, то элемент должен иметь атрибут с именем IDREF типа int64 и значением, равным идентификатору объекта, на который установлена ссылка. Значение самого элемента при этом должно быть пустым. Должно быть соблюдено обязательное условие наличия в этом же XML-документе элемента второго уровня, соответствующего объекту с идентификатором, равным значению атрибута IDREF.

6. Если существуют объекты, для которых идентификатор основного объекта является значением свойства Master, то все такие объекты должны быть добавлены в документ с соблюдением всех требований, описанных в этом и в предыдущих пунктах. 

Пример
Пример XML-документа для передачи объекта:
01<root>
02  <object ID="5682" Brief="1" DBGUID="{998CFB9E-BAB5-4F9F-B65B-D905B0A1C273}" SourceID="6585"/>
03  <object ID="5" Brief="1" DBGUID="{0258FEA5-0DED-4148-8A88-124704A27812}" SourceID="5"/>
04  <object ID="5721" Brief="1" DBGUID="{998CFB9E-BAB5-4F9F-B65B-D905B0A1C273}" SourceID="5721"/>
05  <object ID="5718" Brief="1" DBGUID="{998CFB9E-BAB5-4F9F-B65B-D905B0A1C273}" SourceID="5718"/>
06  <object ID="1766224" Class="5334" DBGUID="{0258FEA5-0DED-4148-8A88-124704A27812}" SourceID="1766224">
07    <Name>Abrams Steaven 1982-06-10</Name>
08    <Description>Abrams Steaven</Description>
09    <LastName>Abrams</LastName>
10    <FirstName>Steaven</FirstName>
11    <BirthDate>1982-06-10</BirthDate>
12    <Gender>0</Gender>
13    <Country IDREF="5682"/>
14    <Creator IDREF="5"/>
15    <Created>2025-02-11 14:52:07</Created>
16  </object>
17  <object ID="1766227" Class="5724" Master="1766224" DBGUID="{0258FEA5-0DED-4148-8A88-124704A27812}" SourceID="1766227">
18    <ContactType IDREF="5721"/>
19    <ContactInfo>gaudi.cheese@mybusines.net</ContactInfo>
20    <Creator IDREF="5"/>
21    <Created>2025-02-11 14:52:07</Created>
22  </object>
23  <object ID="1766228" Class="5724" Master="1766224" DBGUID="{0258FEA5-0DED-4148-8A88-124704A27812}" SourceID="1766228">
24    <ContactType IDREF="5718"/>
25    <ContactInfo>+44 652 652 856</ContactInfo>
26    <Creator IDREF="5"/>
27    <Created>2025-02-13 18:45:15</Created>
28  </object>
29</root>


2.3. Стандартная структура передачи данных в формате объекта JSON

Стандартная структура данных в формате JSON представляет собой один объект JSON. Поле rows этого объекта представляет собой массив, элементы которого являются объектами, соответствующими записям набора данных. Поля этих объектов соответствуют полям структуры данных и их значениям. Также объект JSON может иметь и другие необязательные поля.

Пример
Пример структуры данных в формате документа JSON: 
01{
02  "handle": "{FDF9EE70-9948-4A99-8233-349C3ADD3CE8}",
03  "eof": 1,
04  "rows":
05    [
06      {
07        "ID":6524,
08        "LastName": "Abrams",
09        "FirstName": "Steaven",
10        "BirthDate": {
11          "year": 1982,
12          "month": 6,
13          "day": 10
14        },
15        "AcademicDegree": "PhD",
16        "ContactList: "856 45 12 46;756 12 45 41",
17        "Photo": "#00000000001506D00BD85C3C"
18      },
19      {
20        "ID": 6525,
21        "LastName": "Adkisson",
22        "FirstName": "Amalia",
23        "BirthDate": {
24          "year": 1979,
25          "month": 8,
26          "day": 4
27        },
28        "AcademicDegree": "Doctor of Arts",
29        "ContactList: null,
30        "Photo": null
31      },
32      {
33        "ID": 6526,
34        "LastName": "Adkisson",
35        "FirstName": "Maria",
36        "BirthDate": {
37          "year": 1980,
38          "month": 9,
39          "day": 5
40        },
41        "AcademicDegree": null,
42        "ContactList: "656 545 12 54",
43        "Photo": null
44      }
45    ]
46}

Поля объекта JSON, представляющие структуру данных:

  • handle (необязательно) - строковый идентификатор структуры данных, который позволяет дальнейшие обращения к ней;
  • eof (необязательно) -  поле может принимать значения "1" или "0". Значение "1" или отсутствие этого поля означает, что набор данных является полным (получен полностью в ответ на запрос), значение "0" означает, что данные получены не полностью; в этом случае можно запрашивать дополнительные данные, используя только значение handle до тех пор, пока в ответе не будет получено значения eof="1". Подробнее: Использование возвращаемого ответа;
  • rows (необязательно) - массив объектов, каждый из которых соответствует одной записи структуры данных.

Объекты массива rows имеют набор полей, каждое из которых соответствует полю структуры данных и его значению. Имя поля совпадает с именем поля структуры данных, и значение поля передает значение поля структуры данных.

В случае, если в ответ на запрос не возвращено ни одной записи, объект JSON не будет иметь полей и будет представлять собой пустой объект JSON {}.


2.4. Стандартная структура передачи объектов в двоичном формате

Реплика в двоичном формате предназначена для поставки тяжелых решений на основе платформы. Файлы по традиции имеют расширение .info

Двоичный файл реплики состоит из частей, размещенных в файле последовательно одна за другой. Порядок следования частей важен.

Структура файла реплики

Рассмотрим каждую из частей в подробностях.

  • Заголовок
    8 байт - Сигнатура. Последовательность 0x44 0x41 0x54 0x41 0x4D 0x49 0x4C 0x4C.
    4 байта - количество записей в "таблице свойств".
    8 байт - смещение "таблицы баз данных" от начала файла реплики.
    4 байт - количество записей в "таблице баз данных".
    8 байт - смещение "индекса" от начала файла реплики.
    1 байт - длина идентификатора объекта TClass в реплике.
    38 байт - символы идентификатора объекта TClass в реплике в кодировке UTF8.
    9 байт - зарезервировано, заполнено нулями.
  • Таблица свойств
    Количество записей в таблице определяется полем "заголовка". Каждая запись имеет следующую структуру:
    1 байт - длина имени свойства.
    64 байта - символы имени свойства в кодировке UTF8.
    1 байт - тип свойства. 0 - литеральное значение, 1 - ссылка (идентификатор объекта, присутствующего в этой же реплике), 2 - blob.
    62 байта - зарезервировано, заполнено нулями.
  • Данные объектов
    Объекты записываются в эту секцию последовательно. Информация об объекте начинается с "заголовка объекта" следующей структуры:
    1 байт - длина идентификатора объекта.
    38 байт - символы идентификатора объекта в кодировке UTF8.
    1 байт - длина идентификатора класса объекта.
    38 байт - символы идентификатора класса объекта в кодировке UTF8.
    1 байт - длина идентификатора родителя объекта. Если у объекта нет родителя, значение равно 0.
    38 байт - символы идентификатора родителя объекта в кодировке UTF8. Если у объекта нет родителя, поле заполнено нулями.
    1 байт - длина идентификатора мастера объекта. Если у объекта нет мастера, значение равно 0.
    38 байт - символы идентификатора мастера объекта в кодировке UTF8. Если у объекта нет мастера, поле заполнено нулями.
    1 байт - длина идентификатора базы данных-источника объекта.
    38 байт - символы идентификатора базы данных-источника объекта в кодировке UTF8.
    1 байт - длина идентификатора объекта при создании.
    38 байт - символы идентификатора объекта при создании в кодировке UTF8.
    1 байт - количество значений свойств объекта.
    18 байт - зарезервировано, заполнено нулями 0.

    После заголовка объекта следуют данные его свойств в следующем виде:
    4 байта - номер свойства в "таблице свойств".
    4 байта - длина данных свойства в байтах.
    Данные значения свойства переменного размера.
    Заполнено нулями до размера, кратного 16 байтам.
    Пример

    Таким образом, свойство с индексом 10 и пустым значением (null) будет сохранено как:
    10x0A 0x00 0x00 0x00 //номер свойства
    20x00 0x00 0x00 0x00 //длина значения
    30x00 0x00 0x00 0x00 //заполнено до 16 байт
    40x00 0x00 0x00 0x00

    Значение свойства типа "дата со временем" c индексом 59:
    10x3B 0x00 0x00 0x00 //номер свойства
    20x13 0x00 0x00 0x00 //длина значения - 13 байт
    30x32 0x30 0x30 0x37 //символы "2007"
    40x2D 0x30 0x38 0x2D //символы "-08-"
    50x32 0x33 0x20 0x31 //символы "23 1"
    60x36 0x3A 0x33 0x31 //символы "6:31"
    70x3A 0x35 0x32 0x00 //символы ":52"
    80x00 0x00 0x00 0x00 //заполнено до кратного 16 байт
  • Таблица баз данных
    Количество записей в таблице определяется полем "заголовка". Каждая запись имеет следующую структуру:
    1 байт - длина идентификатора объекта БД.
    38 байт - символы идентификатора объекта БД в кодировке UTF8.
    1 байт - длина GUID БД.
    38 байт - символы GUID БД в кодировке UTF8.
    2 байта - зарезервировано, заполнено нулями 0.
  • Индекс
    Каждая запись имеет следующую структуру:
    1 байт - длина идентификатора объекта.
    38 байт - символы идентификатора объекта в кодировке UTF8.
    8 байт - смещение заголовка объекта относительно начала файла реплики.
    17 байт - зарезервировано, заполнено нулями 0.
    Важно!
    Количество объектов в реплике определяется как
    (размер файла реплики - смещение индекса) / размер записи индекса