Как упорядочить массив в 1С по возрастанию или убыванию?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В платформе 1С:Предприятие объект Массив не имеет встроенного метода Сортировать(), а в Библиотеке стандартных подсистем (БСП) отсутствует отдельная универсальная функция для этой задачи. Тем не менее, существует несколько простых и эффективных способов упорядочить элементы массива в зависимости от контекста выполнения кода (клиент или сервер) и типа данных.

Разберем подробно основные подходы к сортировке массивов в 1С.

Способ 1. Сортировка через объект «СписокЗначений» (Клиент и Сервер)

Это наиболее быстрый, лаконичный и универсальный способ упорядочивания примитивных данных и ссылок. Главное преимущество объекта СписокЗначений заключается в том, что он доступен во всех контекстах выполнения: на сервере, в тонком клиенте, веб-клиенте и толстом клиенте. Для сортировки не требуется выполнять серверный вызов.

Рассмотрим пример кода:


// Создаем тестовый массив
ИсходныйМассив = Новый Массив;
ИсходныйМассив.Добавить(10);
ИсходныйМассив.Добавить(3);
ИсходныйМассив.Добавить(25);

// Создаем СписокЗначений, загружаем данные и сортируем
ВременныйСписок = Новый СписокЗначений;
ВременныйСписок.ЗагрузитьЗначения(ИсходныйМассив);
ВременныйСписок.СортироватьПоЗначению(НаправлениеСортировки.Возр);

// Выгружаем отсортированные данные обратно в массив
ОтсортированныйМассив = ВременныйСписок.ВыгрузитьЗначения();

Обратим внимание на возможности сортировки в СписокЗначений:

  1. СортироватьПоЗначению — метод упорядочивает элементы по их реальным значениям. Подходит для чисел, дат, строк, а также ссылок.
  2. СортироватьПоПредставлению — метод упорядочивает элементы по их строковому представлению. При вызове ЗагрузитьЗначения платформа автоматически формирует строковые представления для элементов.

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

Часто возникает вопрос: не завершится ли сортировка ошибкой, если в массиве одновременно находятся числа, строки, даты и ссылки? Платформа 1С корректно обрабатывает такие ситуации без вызова исключений. При сравнении разнотипных данных используется строгая внутренняя иерархия типов:

  1. Null
  2. Неопределено
  3. Булево
  4. Число
  5. Дата
  6. Строка
  7. Ссылочные типы (группируются по видам метаданных и внутренним идентификаторам)

При сортировке по возрастанию элементы сначала разделятся по группам типов в указанном порядке, а внутри каждой группы будут отсортированы по значению.

Способ 2. Сортировка ссылочных данных через запрос (Сервер)

Если массив содержит ссылки на объекты базы данных (например, элементы справочника Номенклатура или документы РеализацияТоваровУслуг) и их необходимо упорядочить по конкретным реквизитам (по наименованию, коду, дате документа), оптимально применить запрос к базе данных.

Рассмотрим по шагам реализацию на стороне сервера:


Функция ОтсортироватьМассивСсылок(МассивСсылок) Экспорт

    Если МассивСсылок.Количество() = 0 Тогда
        Возврат Новый Массив;
    КонецЕсли;

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Спр.Ссылка КАК Ссылка
        |ИЗ
        |	Справочник.Номенклатура КАК Спр
        |ГДЕ
        |	Спр.Ссылка В(&МассивСсылок)
        |
        |УПОРЯДОЧИТЬ ПО
        |	Спр.Наименование ВОЗР";

    Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
    ТаблицаРезультата = Запрос.Выполнить().Выгрузить();

    Возврат ТаблицаРезультата.ВыгрузитьКолонку("Ссылка");

КонецФункции

Способ 3. Сортировка через объект «ТаблицаЗначений» (Сервер)

На стороне сервера для упорядочивания данных можно использовать ТаблицаЗначений. Это удобно, когда массив нужно отсортировать вместе с другими связанными колонками.

Посмотрим на пример реализации:


Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Значение");
Таблица.ЗагрузитьКолонку(ИсходныйМассив, "Значение");

Таблица.Сортировать("Значение Возр");

ОтсортированныйМассив = Таблица.ВыгрузитьКолонку("Значение");

Важно: объект ТаблицаЗначений недоступен на тонком и веб-клиенте, поэтому данный способ применим исключительно в серверном контексте или в толстом клиенте.

Способ 4. Собственный алгоритм с использованием объекта «СравнениеЗначений»

Если требуется написать собственный алгоритм сортировки (например, «быструю сортировку» QuickSort или сортировку расческой) для структур или нестандартных коллекций, в платформе 1С предусмотрен объект СравнениеЗначений. Его метод Сравнить(Значение1, Значение2) универсально сравнивает любые типы платформы и возвращает:

  1. -1 — если первое значение меньше второго;
  2. 0 — если значения равны;
  3. 1 — если первое значение больше второго.

Пример использования объекта:


Компаратор = Новый СравнениеЗначений;
Результат = Компаратор.Сравнить(ЗначениеА, ЗначениеБ);

Если Результат < 0 Тогда
    // ЗначениеА меньше ЗначениеБ
КонецЕсли;

Применение объекта СравнениеЗначений гарантирует, что алгоритм не упадет в ошибку несоответствия типов при сравнении сложных или разнородных структур данных.

← На главную