В работе с иерархическими кодами — вроде 5.15.6, 1.2.10 и т.п. — часто возникает одна проблема: неправильная сортировка.
Обычная строковая сортировка ставит "10" раньше "2", потому что сравнение идёт по символам, а не по числам.
Решение — нормализовать коды, добавив ведущие нули и выравняв длину частей. Так "5.15.6" превращается, например, в "005.015.006.000.000",
и при сортировке всё становится на свои места.
Функция СформироватьКодификаторПорядковый
Эта функция принимает «сырой» кодификатор и приводит его к унифицированному виду с заданной длиной и количеством уровней.
// Функция - Сформировать кодификатор порядковый
//
// Параметры:
// Кодификатор - Строка - Кодификатор объекта вида 5.15.6
// ДлинаПорядка - Число - //ПРИМЕР ДЛЯ ПОНИМАНИЯ: ДлинаПорядка = 1; // 1
//ПРИМЕР ДЛЯ ПОНИМАНИЯ: ДлинаПорядка = 2; // 01
//ДлинаПорядка = 3;
// КоличествоПорядков - Число - //для 15.15.1
//ПРИМЕР ДЛЯ ПОНИМАНИЯ: КоличествоПорядков = 3; // 015.015.100
//ПРИМЕР ДЛЯ ПОНИМАНИЯ: КоличествоПорядков = 4; // 015.015.100.000
//КоличествоПорядков = 5; //015.015.100.000.000
//
// Возвращаемое значение:
// - Строка - Порядок, предназначенный для корректной сортировки объектов
//
Функция СформироватьКодификаторПорядковый(Кодификатор, ДлинаПорядка = 3, КоличествоПорядков = 5) Экспорт
КодификаторПорядковый = "";
МассивСоставныхНомеров = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Кодификатор, ".");
//ПРИМЕР ДЛЯ ПОНИМАНИЯ: ДлинаПорядка = 1; // 1
//ПРИМЕР ДЛЯ ПОНИМАНИЯ: ДлинаПорядка = 2; // 01
//ДлинаПорядка = 3; // 001
//для 15.15.1
//ПРИМЕР ДЛЯ ПОНИМАНИЯ: КоличествоПорядков = 3; // 015.015.100
//ПРИМЕР ДЛЯ ПОНИМАНИЯ: КоличествоПорядков = 4; // 015.015.100.000
//КоличествоПорядков = 5; //015.015.100.000.000
Если МассивСоставныхНомеров.Количество() > 0 Тогда
ВсеСоставныеЧастиЧисла = Истина;
МассивСоставныхНомеровРезультат = новый Массив;
Для каждого Часть Из МассивСоставныхНомеров Цикл
Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(СокрЛП(Лев(Часть, 1))) Тогда
МассивСоставныхНомеровРезультат.Добавить(СтроковыеФункцииКлиентСервер.ДополнитьСтроку(СокрЛП(Часть), ДлинаПорядка));
Иначе
ВсеСоставныеЧастиЧисла = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
МассивСоставныхНомеровРезультатДляСоединения = Новый Массив;
СколькоПорядоковДобавить = КоличествоПорядков - МассивСоставныхНомеровРезультат.Количество();
Для каждого Значение Из МассивСоставныхНомеровРезультат Цикл
МассивСоставныхНомеровРезультатДляСоединения.Добавить(Значение);
КонецЦикла;
Если СколькоПорядоковДобавить > 0 Тогда
Для Индекс = 1 По СколькоПорядоковДобавить Цикл
МассивСоставныхНомеровРезультатДляСоединения.Добавить(СтроковыеФункцииКлиентСервер.ДополнитьСтроку("", ДлинаПорядка));
КонецЦикла;
КонецЕсли;
Если ВсеСоставныеЧастиЧисла Тогда
КодификаторПорядковый = СтрСоединить(МассивСоставныхНомеровРезультатДляСоединения, ".");
КонецЕсли
КонецЕсли;
Возврат КодификаторПорядковый;
КонецФункции // ()
Работает в типовых конфигурациях с встроенной системой БСП.
Вступайте в нашу телеграмм-группу Инфостарт