К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как отсортировать массив в 1С 8: рабочие способы с примерами

Как отсортировать массив в 1С 8: сортировка через список значений, таблицу значений и запрос. Примеры кода на встроенном языке, ошибки и советы разработчику.

Во встроенном языке 1С 8 у объекта «Массив» нет собственного метода сортировки — это частая неожиданность для тех, кто переходит на платформу из других языков. Разработчику приходится выбирать обходной путь: переносить элементы в список значений, таблицу значений, использовать запрос или писать собственный алгоритм. Каждый вариант имеет свои ограничения по типам данных, производительности и объёму кода.

Выбор способа зависит от трёх условий: какие данные хранятся в массиве (простые значения или ссылки), нужна ли сортировка по нескольким полям и где выполняется код — на клиенте или на сервере. Ниже разобраны все рабочие варианты с готовыми примерами, которые можно переносить в конфигурацию без доработки.

Почему у массива нет метода сортировки

Массив в 1С — это базовая коллекция с минимальным набором методов: Добавить, Вставить, Удалить, Найти, Количество. Платформа сознательно оставляет его «тонким», а задачи упорядочивания перекладывает на специализированные объекты — список значений и таблицу значений, у которых сортировка реализована нативно и работает быстрее ручных алгоритмов.

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

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

Самый короткий путь для массива простых значений — чисел, строк, дат, ссылок. Список значений умеет сортироваться по значению или по представлению, в прямом и обратном порядке.

Функция ОтсортироватьМассив(Массив)

Список = Новый СписокЗначений;

Список.ЗагрузитьЗначения(Массив);

Список.СортироватьПоЗначению(НаправлениеСортировки.Возр);

Возврат Список.ВыгрузитьЗначения();

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

Метод ЗагрузитьЗначения переносит массив в список одной командой, ВыгрузитьЗначения возвращает результат обратно в виде массива. Для сортировки по убыванию передайте НаправлениеСортировки.Убыв.

Ограничение способа: сортировка по представлению работает со строковым представлением элементов, поэтому числа 2 и 10 могут встать в неожиданном порядке, если сортировать по представлению, а не по значению. Для чисел и дат всегда используйте СортироватьПоЗначению.

bsl
Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(Массив);
Список.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
Массив = Список.ВыгрузитьЗначения();

Сортировка через таблицу значений

Если элементы массива — структуры или нужно упорядочить данные по нескольким полям, подходит таблица значений. Она сортируется методом Сортировать с перечислением колонок и направлений через запятую.

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура");

ТЗ.Колонки.Добавить("Цена");

Для Каждого Элемент Из МассивСтруктур Цикл

Строка = ТЗ.Добавить();

ЗаполнитьЗначенияСвойств(Строка, Элемент);

КонецЦикла;

ТЗ.Сортировать("Цена Убыв, Номенклатура Возр");

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

Учтите: создание таблицы значений — более «тяжёлая» операция, чем работа со списком значений. Для одноразовой сортировки пары сотен чисел список значений предпочтительнее.

Сравнение способов

Список значений

Быстрый код для массива простых значений. Не подходит для сортировки по нескольким полям.

Таблица значений

Сортировка по нескольким колонкам, удобна для структур. Требует описания колонок и больше ресурсов.

Запрос

Оптимален для больших объёмов данных из базы. Не работает с произвольным массивом без выгрузки в таблицу.

Свой алгоритм

Полный контроль над логикой сравнения. Медленнее нативных методов и требует тестирования.

Сортировка запросом

Когда массив содержит ссылки на объекты базы данных, а сортировать нужно по реквизитам этих объектов, эффективнее всего запрос. Массив передаётся в запрос параметром, а упорядочивание выполняется на уровне СУБД.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Ссылка В (&МассивСсылок)

|УПОРЯДОЧИТЬ ПО

| Номенклатура.Наименование";

Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);

Результат = Запрос.Выполнить().Выгрузить();

Плюс подхода — сортировка выполняется сервером базы данных с использованием индексов, что заметно быстрее на больших выборках. Минус — результат возвращается таблицей значений, а не массивом, и порядок элементов не гарантированно совпадёт с исходным массивом: запрос переупорядочивает выборку целиком.

Собственный алгоритм сортировки

Ручная реализация нужна, когда порядок определяется нестандартным правилом — например, сначала элементы с признаком «Приоритетный», внутри групп по дате, а пустые значения в конец. В таких случаях логику сравнения проще описать в коде, чем пытаться выразить её штатными средствами.

Для Инд1 = 0 По Массив.Количество() - 2 Цикл

Для Инд2 = Инд1 + 1 По Массив.Количество() - 1 Цикл

Если НужноПоменять(Массив[Инд1], Массив[Инд2]) Тогда

Временный = Массив[Инд1];

Массив[Инд1] = Массив[Инд2];

Массив[Инд2] = Временный;

КонецЕсли;

КонецЦикла;

КонецЦикла;

Функцию НужноПоменять реализуйте под свою задачу: она должна возвращать Истина, если элементы стоят в неправильном порядке. Вынос сравнения в отдельную функцию делает алгоритм универсальным и упрощает тестирование.

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

Сортировка массива структур и объектов

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

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

Порядок действий для массива структур
  1. 1
    Создайте таблицу значений и опишите колонки под поля структуры
  2. 2
    Перенесите элементы циклом с ЗаполнитьЗначенияСвойств
  3. 3
    Вызовите Сортировать() с нужными колонками и направлениями
  4. 4
    При необходимости соберите новый массив структур из отсортированных строк
  5. 5
    Проверьте результат на тестовом наборе с граничными значениями

Типичные ошибки и проверка результата

Чаще всего проблемы возникают не из-за самой сортировки, а из-за данных. Смешанные типы в одном массиве (строки и числа) дают неочевидный порядок: платформа сравнивает значения по внутренним правилам, и результат может отличаться от ожидаемого. Перед сортировкой приводите элементы к одному типу.

Вторая частая ошибка — сортировка строковых чисел. Если массив содержит строки «2», «10», «1», после сортировки по значению списка значений порядок может оказаться лексикографическим. Решение — преобразовать элементы к типу Число до загрузки в список.

Типичные ошибки
01
Сортировка строковых представлений чисел — порядок получается лексикографическим, а не числовым
02
Смешанные типы в массиве — непредсказуемый порядок элементов разных типов
03
Ожидание, что запрос с В (&Массив) сохранит порядок массива — запрос переупорядочивает выборку
04
Сортировка на клиенте больших массивов — зависание интерфейса, операцию нужно выполнять на сервере
05
Забытое направление сортировки — по умолчанию используется возрастание
Контрольные точки

Как проверить результат

Порядок чисел
Норма

10 идёт после 2

Тревожный признак

10 стоит перед 2 — значит, сортировались строки

Порядок дат
Норма

Даты идут хронологически

Тревожный признак

Даты вперемешку — проверьте тип колонки

Количество элементов
Норма

Совпадает с исходным массивом

Тревожный признак

Элементы потеряны — проверьте загрузку/выгрузку списка

Частые вопросы

Можно ли отсортировать массив в 1С одним методом, как в других языках?

Нет, у объекта Массив нет метода сортировки. Ближайший аналог — загрузить значения в СписокЗначений, вызвать СортироватьПоЗначению() и выгрузить обратно. Это занимает три строки кода.

Как отсортировать массив по убыванию?

Передайте направление в метод сортировки: Список.СортироватьПоЗначению(НаправлениеСортировки.Убыв). В таблице значений укажите «Убыв» после имени колонки: ТЗ.Сортировать("Цена Убыв").

Что быстрее — список значений или таблица значений?

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

Как отсортировать массив ссылок по наименованию?

Наиболее эффективно — запросом с конструкцией В (&МассивСсылок) и УПОРЯДОЧИТЬ ПО Наименование. Сортировка выполнится на стороне СУБД без обхода каждого объекта в коде.

Сохранится ли порядок массива после запроса с условием В (&Массив)?

Нет. Запрос возвращает выборку в порядке, заданном конструкцией УПОРЯДОЧИТЬ, а исходный порядок элементов массива-параметра не учитывается. Если порядок массива важен, используйте список значений или таблицу значений.

Как отсортировать массив структур по одному из ключей?

Перенесите структуры в таблицу значений через ЗаполнитьЗначенияСвойств и вызовите Сортировать() по нужной колонке. Либо реализуйте собственный алгоритм с функцией сравнения двух структур по заданному ключу.

Итог

Что важно запомнить

Массив в 1С 8 сортируется через промежуточные объекты: список значений — для простых типов, таблица значений — для сортировки по нескольким полям, запрос — для ссылок и больших объёмов. Следите за типами элементов и направлением сортировки, а тяжёлые операции выполняйте на сервере.