В платформе 1С:Предприятие объект Массив не имеет встроенного метода Сортировать(), а в Библиотеке стандартных подсистем (БСП) отсутствует отдельная универсальная функция для этой задачи. Тем не менее, существует несколько простых и эффективных способов упорядочить элементы массива в зависимости от контекста выполнения кода (клиент или сервер) и типа данных.
Разберем подробно основные подходы к сортировке массивов в 1С.
Это наиболее быстрый, лаконичный и универсальный способ упорядочивания примитивных данных и ссылок. Главное преимущество объекта СписокЗначений заключается в том, что он доступен во всех контекстах выполнения: на сервере, в тонком клиенте, веб-клиенте и толстом клиенте. Для сортировки не требуется выполнять серверный вызов.
Рассмотрим пример кода:
// Создаем тестовый массив
ИсходныйМассив = Новый Массив;
ИсходныйМассив.Добавить(10);
ИсходныйМассив.Добавить(3);
ИсходныйМассив.Добавить(25);
// Создаем СписокЗначений, загружаем данные и сортируем
ВременныйСписок = Новый СписокЗначений;
ВременныйСписок.ЗагрузитьЗначения(ИсходныйМассив);
ВременныйСписок.СортироватьПоЗначению(НаправлениеСортировки.Возр);
// Выгружаем отсортированные данные обратно в массив
ОтсортированныйМассив = ВременныйСписок.ВыгрузитьЗначения();
Обратим внимание на возможности сортировки в СписокЗначений:
ЗагрузитьЗначения платформа автоматически формирует строковые представления для элементов.Часто возникает вопрос: не завершится ли сортировка ошибкой, если в массиве одновременно находятся числа, строки, даты и ссылки? Платформа 1С корректно обрабатывает такие ситуации без вызова исключений. При сравнении разнотипных данных используется строгая внутренняя иерархия типов:
NullНеопределеноБулевоЧислоДатаСтрокаПри сортировке по возрастанию элементы сначала разделятся по группам типов в указанном порядке, а внутри каждой группы будут отсортированы по значению.
Если массив содержит ссылки на объекты базы данных (например, элементы справочника Номенклатура или документы РеализацияТоваровУслуг) и их необходимо упорядочить по конкретным реквизитам (по наименованию, коду, дате документа), оптимально применить запрос к базе данных.
Рассмотрим по шагам реализацию на стороне сервера:
Функция ОтсортироватьМассивСсылок(МассивСсылок) Экспорт
Если МассивСсылок.Количество() = 0 Тогда
Возврат Новый Массив;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Спр.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Спр
|ГДЕ
| Спр.Ссылка В(&МассивСсылок)
|
|УПОРЯДОЧИТЬ ПО
| Спр.Наименование ВОЗР";
Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
Возврат ТаблицаРезультата.ВыгрузитьКолонку("Ссылка");
КонецФункции
На стороне сервера для упорядочивания данных можно использовать ТаблицаЗначений. Это удобно, когда массив нужно отсортировать вместе с другими связанными колонками.
Посмотрим на пример реализации:
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Значение");
Таблица.ЗагрузитьКолонку(ИсходныйМассив, "Значение");
Таблица.Сортировать("Значение Возр");
ОтсортированныйМассив = Таблица.ВыгрузитьКолонку("Значение");
Важно: объект ТаблицаЗначений недоступен на тонком и веб-клиенте, поэтому данный способ применим исключительно в серверном контексте или в толстом клиенте.
Если требуется написать собственный алгоритм сортировки (например, «быструю сортировку» QuickSort или сортировку расческой) для структур или нестандартных коллекций, в платформе 1С предусмотрен объект СравнениеЗначений. Его метод Сравнить(Значение1, Значение2) универсально сравнивает любые типы платформы и возвращает:
Пример использования объекта:
Компаратор = Новый СравнениеЗначений;
Результат = Компаратор.Сравнить(ЗначениеА, ЗначениеБ);
Если Результат < 0 Тогда
// ЗначениеА меньше ЗначениеБ
КонецЕсли;
Применение объекта СравнениеЗначений гарантирует, что алгоритм не упадет в ошибку несоответствия типов при сравнении сложных или разнородных структур данных.