Функция возвращает отсортированный массив
- сначала по строковому представлению типа значения, по возрастанию. Например, если массив содержит 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;
КонецЦикла;
Возврат СортМассив;
КонецФункции