Двойная сортировка массива
Разработка - Универсальные функции
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Функция возвращает отсортированный массив
- сначала по строковому представлению типа значения, по возрастанию. Например, если массив содержит 2 значения, типы Число и Булево, то после сортировки на первом месте окажется Булево
- потом по значению в рамках одного типа по убыванию (например, если в массиве есть три числа 3, 55, 7, то после сортировки они встанут рядом, в порядке 55, 7, 3
Исходный массив должен остаться неизменным
Реализовано двумя способами
1) с помощью таблицы и метода Сортировать
2) пузырьком
На форме есть возможность заполнения массива. Для наглядности, в таблицу на форме выводится результат
Учебная задачка, может, кому пригодится.
Протестирована на конфигурации Зарплата и управление персоналом, редакция 3.1 (3.1.27.23).
&НаСервере
Функция СортироватьМассивТЗНаСервере(МойМассив)
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ЗначенияМассива"); // Создание колонки для значений массива
ТЗ.Колонки.Добавить("ТипЗначенияМассива"); // Создание колонки для типа значений массива
Для Каждого Стр Из МойМассив Цикл
СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.ЗначенияМассива = Стр;
СтрокаТЗ.ТипЗначенияМассива = Строка(ТипЗнч(Стр));
КонецЦикла;
ТЗ.Сортировать("ТипЗначенияМассива Возр, ЗначенияМассива Убыв");
СортМассив = ТЗ.ВыгрузитьКолонку("ЗначенияМассива");
Возврат СортМассив;
КонецФункции
&НаСервере
Функция СортироватьМассивПузырькомНаСервере(МойМассив)
//загрузим в СортМассив МойМассив
СортМассив = МойМассив;
КолВо = МойМассив.Количество()-1; //количество итераций внутри СортМассив
//сортируем СортМассив по типу
Для i = 0 По КолВо Цикл
Для j = 0 ПО КолВо - i - 1 Цикл
Если Строка(ТипЗнч(СортМассив[j])) > Строка(ТипЗнч(СортМассив[j + 1])) Тогда
Замена = СортМассив[j];
СортМассив[j] = СортМассив[j + 1];
СортМассив[j + 1] = Замена;
КонецЕсли;
КонецЦикла;
КонецЦикла;
t = 0;
Пока t <= КолВо Цикл
//определим границы однотипных элементов
tПервый = t; //первый элемент типа
tПоследний = t; //последний элемент этого же типа
t = tПервый;
Тип = Строка(ТипЗнч(СортМассив[t]));
Пока t <= КолВо Цикл
Если Строка(ТипЗнч(СортМассив[t])) = Тип Тогда
tПоследний = t;
КонецЕсли;
t = t + 1;
КонецЦикла;
tКолВо = tПоследний - tПервый; //количество итераций на промежутке однотипных элементов
//сортируем элементы СортМассив на промежутке однотипных элементов
Для i = 0 По tКолВо Цикл
Для j = tПервый По tПоследний - i - 1 Цикл
Если СортМассив[j] < СортМассив[j + 1] Тогда
Замена = СортМассив[j];
СортМассив[j] = СортМассив[j + 1];
СортМассив[j + 1] = Замена;
КонецЕсли;
КонецЦикла;
КонецЦикла;
t = tПоследний + 1;
КонецЦикла;
Возврат СортМассив;
КонецФункции
Вступайте в нашу телеграмм-группу Инфостарт