Сортировка значений

From SunFlurry wiki
Jump to: navigation, search

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

Старшинство объектов при сортировке массивов объектов

Основное правило при сортировке объектов: если типы объектов отличаются, старшинство объектов определяется старшинством типа, если типы одинаковые или родственные (целые и вещественные числа), тогда для определения старшинства система проводит сравнение содержимого объектов по указанным правилам. К примеру, если в список поместить числа и даты, после сортировки по неубыванию, весь отсортированный массив чисел будет помещен до отсортированного массива дат (см. пример ниже).

1. Пустой объект
2. Числа
3. Даты
4. Строки
5. Списки, Таблицы и др. сложные объекты
6. Объект базы данных (см. ниже)
  6.1. Справочники
    6.1.1. Вид справочника
      6.1.1.1. Ключ сортировки объекта или код объекта
  6.2. Документы
    6.2.1. Ключ сортировки объекта или код объекта
  6.3. Глобальные переменные
    6.3.1. Вид переменной
      6.3.1.1. Код объекта
  6.4. Перечисления
    6.4.1. Вид перечисления
      6.4.1.1. Код объекта
  6.5. Накопители
    6.5.1. Вид накопителя
      6.5.1.1. Код объекта
  6.6. Журналы (справочников или документов)
    6.6.1. Вид журнала
      6.6.1.1. Код объекта
7. Объект структуры базы данных и др. сложные объекты
8. Вспомогательные объекты, типа функция, интерфейс и пр.

Сравнение содержимого объектов базы данных

В соответствии со списком выше, объекты базы данных сначала сравниваются по типам данных (к примеру, все справочники при сортировке по неубыванию будут предшествовать документам). Если оба сравниваемых объекта имеют одинаковый тип данных (к примеру, являются элементами справочников), будут сравниваться внутренние идентификаторы метаданных этих объектов (обычно объекты, заданные при планировании конфигурации ранее, имеют меньшее значение идентификатора, чтобы узнать идентификатор объекта, можно воспользоваться конструкцией DB("<Описание объекта>").Struct.MetaID). Исключение из этой цепочки сравнения составляют документы, документы не будут сравниваться на разные виды, что позволяет при сортировке перемешивать их, используя только ключи сортировки для сравнения.
Если оба сравниваемых объекта имеют одинаковый вид, либо оба объекта являются документами, будет происходить сравнение объектов по ключам сортировки. Ключ сортировки, это особый реквизит заголовка объекта, указанный при конфигурировании (см. переключатель isSortProp, к примеру в описании справочников), в зависимости от типа реквизита будет производиться сравнение чисел, строк или дат. Реквизиты ключа сортировки не могут иметь сложный тип (т.е., быть ссылкой на другой объект). Если объект не имеет заданного ключа сортировки, либо тип объекта не подразумевает наличие таких ключей (к примеру, перечисления или журналы не могут иметь ключей сортировки), сравнение будет происходить по внутреннему коду объекта. Внутренний код объекта обычно представляет собой строку, состоящую из 20 символов, включающую набор символов из цифр, заглавных латинских букв и некоторых знаков препинания. Каждый объект в базе данных имеет свой внутренний код (включая каждую строку срочной части объектов, записи журналов, каждый элемент перечисления и пр.). Внутренний код имеет свою структуру, что позволяет зная только код, определить тип объекта, которому он принадлежит, вид этого объекта, и найти этот объекта в базе данных. При записи нового объекта код присваивается автоматически, сервер базы данных контролирует уникальность и корректность подобных кодов. При сортировке по неубыванию по таким кодам, объекты, созданные раньше, будут помещены в начало сортированного массива.

Пример сортировки списка, содержащего смешанные объекты

//Создание и заполнение списка значений, содержащего числа, строки и даты.
a:=List.Create(2,4,'12.12.2020','12.12.2020 12:00','01.01.1970',-2.2,7.7,"12",77,"-2");
//Сортировка списка по неубыванию
a.Sort();
//Вывод информации, в лог будет выведено: -2.2, 2, 4, 7.7, 77, '01.01.1970', '12.12.2020', '12.12.2020 12:00' (в логе время отражено не будет), "-2", "12"
For i:=1 To a.Size() Do
  Message(a.Get(i));
EndDo;