Функция 1С для корректной сортировки кодификаторов: больше никакого "10" перед "2"

14.11.25

Разработка - Универсальные функции

В публикации рассматривается практическая функция для 1С, которая преобразует иерархические коды вида 5.15.6 в сортируемый формат с выравниванием уровней и добавлением ведущих нулей. Такой подход помогает избежать ошибок при строковой сортировке, упрощает работу с иерархиями и делает структуру данных более предсказуемой. Материал будет полезен разработчикам 1С, работающим со справочниками, древовидными структурами и импортом данных.

В работе с иерархическими кодами — вроде 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 По СколькоПорядоковДобавить Цикл
				МассивСоставныхНомеровРезультатДляСоединения.Добавить(СтроковыеФункцииКлиентСервер.ДополнитьСтроку("", ДлинаПорядка));	
			КонецЦикла;
		КонецЕсли;     	 
		
		Если ВсеСоставныеЧастиЧисла Тогда
			КодификаторПорядковый = СтрСоединить(МассивСоставныхНомеровРезультатДляСоединения, ".");	
		КонецЕсли
		
	КонецЕсли;
	
	Возврат КодификаторПорядковый;
	
КонецФункции // ()
	

Работает в типовых конфигурациях с встроенной системой БСП.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Универсальные функции Работа с интерфейсом Программист 1С v8.3 Бесплатно (free)

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

14.05.2025    4987    DeerCven    14    

57

Универсальные функции Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    45210    dimanich70    83    

161

Универсальные функции Программист 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6694    6    John_d    13    

59

Универсальные функции Программист Стажер 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    55763    atdonya    31    

68

Универсальные функции Программист 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    8436    ke.92@mail.ru    17    

67

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

28.08.2023    22381    YA_418728146    8    

174
Для отправки сообщения требуется регистрация/авторизация