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

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

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

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    2572    Abysswalker    7    

41

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

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

14.05.2025    5594    DeerCven    15    

57

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

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

21.05.2024    46811    dimanich70    83    

165

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

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

1 стартмани

18.03.2024    6931    6    John_d    13    

59

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

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

12.02.2024    58093    atdonya    31    

68

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

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

30.11.2023    8699    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. starik-2005 3201 19.11.25 10:41 Сейчас в теме
Ч = Новый ОписаниеТипов("Число");
МЧ = Новый Массив;
Для Каждого С Из СтрРазделить(ИсходнаяСтрока,".") Цикл
   МЧ.Добавить(Формат(Ч.ПривестиЗначение(С), "чтотопролидирующиенули"));
КонецЦикла;

Возврат СтрСоединить(МЧ, ".");
Показать
2. it_box 24 22.11.25 09:45 Сейчас в теме
(1)
Ч = Новый ОписаниеТипов("Число");
МЧ = Новый Массив;
Для Каждого С Из СтрРазделить(ИсходнаяСтрока,".") Цикл
МЧ.Добавить(Формат(Ч.ПривестиЗначение(С), "чтотопролидирующиенули"));
КонецЦикла;

Возврат СтрСоединить(МЧ, ".");


это заменяет лишь часть моего алгоритма "МассивСоставныхНомеровРезультат.Добавить(СтроковыеФункцииКлиентСервер.ДополнитьСтроку(СокрЛП(Часть), ДлинаПорядка));"

количество порядков тоже важно
3. Hitcher 180 26.11.25 16:57 Сейчас в теме
А если код такого вида 01.001.8884?
4. it_box 24 26.11.25 20:58 Сейчас в теме
(3)
01.001.8884

Если по умолчанию, то: 001.001.8884.000.000
если длина порядка 4: 0001.0001.8884.0000.0000
5. Hitcher 180 27.11.25 07:54 Сейчас в теме
Я про то, что каждый порядок имеет свою длину Например 01.001.8884 нужно привести к шаблону
0001.001.08884. То есть шаблон, к которому нужно привести имеет вид 9999.999.99999. Предлагаю вместо
ДлинаПорядка, КоличествоПорядков передавать вид шаблона типа 9999.999.99999 или 4.3.5, где соответственно 4,3, 5 - длина соответствующего порядка. Будет более универсальная функция
6. it_box 24 27.11.25 09:25 Сейчас в теме
(5) механизм нужен для правильной сортировки списков, если в середине, где длина порядка 3 добавится лишние нули в начале, то будет вид 09999.00999.99999. Сортировка будет выполняться также
7. Hitcher 180 27.11.25 10:27 Сейчас в теме
(6) Понял. Речь идет просто о каком-то вспомогательном поле. Если же речь идет о нормализации, то есть приведение к заданному виду , то Ваша реализация не позволяет решить эту задачу .
Другой пример 4401 11 000 1. Это код ТНВЭД. И разделители там не точки, и вы не можете менять его длину, потому что структура кода построена по десятичной системе и включает:

код группы — первые две цифры кода;
код товарной позиции — четыре цифры;
код субпозиции — шесть цифр;
код подсубпозиции — десять цифр.

Если есть желание, то можете доработать свою функцию, сделав ее более универсальной
Для отправки сообщения требуется регистрация/авторизация