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

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

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

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

Встроенного метода сортировки у объекта «Массив» в языке 1С нет, поэтому разработчику приходится выбирать один из обходных путей. Самый распространённый — перенести значения в объект «СписокЗначений», вызвать его метод СортироватьПоЗначению() и вернуть результат обратно в массив. Этот способ короткий, надёжный и подходит для чисел, строк и дат.

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

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

Почему у массива нет метода сортировки и что использовать вместо него

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

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

Сортировка массива простых значений через СписокЗначений

Способ работает для массивов чисел, строк, дат и других сравнимых типов. Идея: загрузить элементы массива в список значений, отсортировать его и выгрузить обратно через метод ВыгрузитьЗначения().

Функция СортироватьМассивПоВозрастанию(ИсходныйМассив)

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

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

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

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

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

Функция возвращает новый массив, исходный не изменяется. Если нужно отсортировать по убыванию, передайте НаправлениеСортировки.Убыв. Вызов выглядит так:

Массив = Новый Массив;

Массив.Добавить(42);

Массив.Добавить(7);

Массив.Добавить(15);

Результат = СортироватьМассивПоВозрастанию(Массив);

// Результат: 7, 15, 42

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

Сортировка массива структур по произвольному полю

Если элементы массива — структуры (например, данные о товарах с полями «Наименование» и «Цена»), список значений не поможет: он сравнивает значения целиком. Здесь нужен собственный алгоритм. Самый понятный — сортировка пузырьком:

Процедура СортироватьМассивСтруктур(Массив, ИмяПоля)

Количество = Массив.Количество();

Для И = 0 По Количество - 2 Цикл

Для Ж = И + 1 По Количество - 1 Цикл

Если Массив[Ж][ИмяПоля] < Массив[И][ИмяПоля] Тогда

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

Массив[И] = Массив[Ж];

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

КонецЕсли;

КонецЦикла;

КонецЦикла;

КонецПроцедуры

Процедура меняет исходный массив «на месте» и сортирует по возрастанию значения указанного поля. Для сортировки по убыванию замените знак сравнения < на >. Перед вызовом убедитесь, что поле есть у всех элементов, иначе получите ошибку обращения к несуществующему свойству структуры.

Альтернатива: сортировка через ТаблицуЗначений

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

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

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

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

Для Каждого Элемент Из ИсходныйМассив Цикл

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

Строка.Наименование = Элемент.Наименование;

Строка.Цена = Элемент.Цена;

КонецЦикла;

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

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

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

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

Лучший выбор для массивов чисел, строк и дат. Минимум кода, но не подходит для структур и сортировки по полю.

Свой алгоритм (пузырёк, вставки)

Гибкое сравнение любых данных, но медленно на больших массивах и требует аккуратного кода.

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

Быстрая сортировка средствами платформы по нескольким колонкам. Требует описания колонок и переноса данных.

Проверка результата и контрольные точки

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

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

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

Если Массив[И] > Массив[И + 1] Тогда

Возврат Ложь;

КонецЕсли;

КонецЦикла;

Возврат Истина;

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

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

Контрольные точки

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

Порядок элементов
Норма

Каждый следующий элемент больше или равен предыдущему

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

Есть пара, где следующий элемент меньше предыдущего

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

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

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

Элементов стало меньше — данные потеряны при обмене

Типы значений
Норма

Все элементы одного сравнимого типа

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

Смешаны числа и строки — результат сравнения непредсказуем

Типичные ошибки и ограничения

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

Вторая частая ошибка — выход за границы массива в собственном алгоритме. Индексы массива в 1С начинаются с нуля, поэтому последний элемент имеет индекс Количество() - 1. Цикл По Количество() вместо По Количество() - 1 гарантированно вызовет ошибку «Индекс находится за границами массива».

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

Как выбрать способ

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

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

Можно ли отсортировать массив по убыванию?

Да. Через СписокЗначений передайте в СортироватьПоЗначению() параметр НаправлениеСортировки.Убыв. В собственном алгоритме поменяйте знак сравнения на противоположный.

Изменится ли исходный массив при сортировке через СписокЗначений?

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

Как отсортировать массив строк без учёта регистра?

СписокЗначений сортирует строки с учётом регистра. Если нужен регистронезависимый порядок, приведите строки к одному регистру функцией ВРег() или НРег() при загрузке, либо реализуйте собственное сравнение в своём алгоритме.

Что быстрее: свой алгоритм или ТаблицаЗначений?

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

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

Загрузите ссылки в СписокЗначений и вызовите СортироватьПоЗначению() — ссылки сравниваются по представлению. Если нужен порядок по коду или реквизиту, используйте запрос с предложением УПОРЯДОЧИТЬ ПО и выгрузите результат в массив.

Итог

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

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