Код 1C v 8.х
СписокЗначений = Новый СписокЗначений;
СписокЗначений. ЗагрузитьЗначения( Массив) ;
СписокЗначений. СортироватьПоЗначению( ) ;
Массив = СписокЗначений. ВыгрузитьЗначения( ) ;
В некоторых случаях больше подойдет сортировка не по значению, а по представлению.
Хочу поделиться с посетителями сайта своим подходом к преобразованию таблицы значений в дерево значений и обратно.
Вообще, при разработке отраслевой задачи, была необходимость почти во всех документах, выводить информацию в виде дерева и хранить ее в табличных частях документа, а также в интерактивной обработке данных в виде дерева.
Отсюда появился небольшой модуль для расширения возможности работы с деревом значений, хотя и с некоторыми оговорками.
Основной идеей является использование двух ключевых реквизитов/колонок КлючСтроки и КлючСвязи.
Однако они не всегда необходимы. Код, на мой взгляд достаточно "высушен".
Код 1C v 8.х
Функция ПолучитьНовыйКлючСтрокиДерева(Дерево, СписокКлючей = Неопределено) Экспорт
Если СписокКлючей = Неопределено Тогда
СписокКлючей = Новый СписокЗначений;
СписокКлючей. Добавить( 0 ) ;
КонецЕсли ;
Для Каждого СтрокаДерева Из Дерево. Строки Цикл
СписокКлючей. Добавить( СтрокаДерева. КлючСтроки) ;
ПолучитьНовыйКлючСтрокиДерева( СтрокаДерева, СписокКлючей) ;
СписокКлючей. СортироватьПоЗначению( НаправлениеСортировки. Убыв) ;
МаксКлюч = СписокКлючей[0 ]. Значение + 1 ;
КонецЦикла ;
Возврат МаксКлюч;
КонецФункции
Процедура ОбновитьКлючиСвязиВДеревеЗначений(Дерево) Экспорт
Для Каждого СтрокаДерева Из Дерево. Строки Цикл
Попытка
СтрокаДерева. КлючСвязи = СтрокаДерева. Родитель. КлючСтроки;
Исключение
СтрокаДерева. КлючСвязи = 0 ;
КонецПопытки ;
ОбновитьКлючиСвязиВДеревеЗначений( СтрокаДерева) ;
КонецЦикла ;
КонецПроцедуры
Процедура ОбновитьКлючиСтрокВДеревеЗначений(Дерево, КлючСтроки = 1) Экспорт
Для Каждого СтрокаДерева Из Дерево. Строки Цикл
СтрокаДерева. КлючСтроки = КлючСтроки;
КлючСтроки = КлючСтроки + 1 ;
ОбновитьКлючиСтрокВДеревеЗначений( СтрокаДерева, КлючСтроки) ;
КонецЦикла ;
КонецПроцедуры
Функция ВыгрузитьДеревоЗначенийВТаблицуЗначений(Дерево, Таблица = Неопределено) Экспорт
Если Таблица = Неопределено Тогда
Таблица = Новый ТаблицаЗначений;
Для Каждого Колонка Из Дерево. Колонки Цикл
Таблица. Колонки. Добавить( Колонка. Имя, Колонка. ТипЗначения) ;
КонецЦикла ;
КонецЕсли ;
Для Каждого СтрокаДерева Из Дерево. Строки Цикл
ЗаполнитьЗначенияСвойств( Таблица. Добавить( ) , СтрокаДерева) ;
ВыгрузитьДеревоЗначенийВТаблицуЗначений( СтрокаДерева, Таблица) ;
КонецЦикла ;
Возврат Таблица;
КонецФункции
Функция ВыгрузитьТаблицуЗначенийВДеревоЗначений(Таблица, КлючСтроки = "КлючСтроки" , КлючСвязи = "КлючСвязи" ) Экспорт
Дерево = Новый ДеревоЗначений;
Для Каждого Колонка Из Таблица. Колонки Цикл
Дерево. Колонки. Добавить( Колонка. Имя, Колонка. ТипЗначения) ;
КонецЦикла ;
Для Каждого СтрокаТаблицы Из Таблица Цикл
СтрокаГруппировки = Дерево. Строки. Найти( СтрокаТаблицы[КлючСвязи], КлючСтроки, Истина ) ;
Если СтрокаГруппировки = Неопределено Тогда
ЗаполнитьЗначенияСвойств( Дерево. Строки. Добавить( ) , СтрокаТаблицы) ;
Иначе
ЗаполнитьЗначенияСвойств( СтрокаГруппировки. Строки. Добавить( ) , СтрокаТаблицы) ;
КонецЕсли ;
КонецЦикла ;
Возврат Дерево;
КонецФункции
Процедура УстановитьЗначениеКолонкиДерева(Дерево, Колонка, Значение) Экспорт
Для каждого СтрокаДерева Из Дерево. Строки Цикл
СтрокаДерева[Колонка] = Значение;
УстановитьЗначениеКолонкиДерева( СтрокаДерева, Колонка, Значение) ;
КонецЦикла ;
КонецПроцедуры
Процедура СкопироватьПодчиненныеСтроки(СтрокаПриемник, СтрокаИсточник)
Для каждого Строка Из СтрокаИсточник. Строки Цикл
НоваяСтрока = СтрокаПриемник. Строки. Добавить( ) ;
НоваяСтрока. КлючСвязи = СтрокаПриемник. КлючСтроки;
ЗаполнитьЗначенияСвойств( НоваяСтрока, Строка) ;
СкопироватьПодчиненныеСтроки( НоваяСтрока, Строка) ;
КонецЦикла ;
КонецПроцедуры
Процедура ПеренестиСтрокиДереваЗначений(СтрокаПриемник, ВыделенныеСтроки) Экспорт
Если НЕ СтрокаПриемник = Неопределено Тогда
МассивСтрок = Новый Массив;
Для Каждого СтрокаПереноса Из ВыделенныеСтроки Цикл
МассивСтрок. Добавить( СтрокаПереноса) ;
НоваяСтрока = СтрокаПриемник. Строки. Добавить( ) ;
СкопироватьПодчиненныеСтроки( НоваяСтрока, СтрокаПереноса) ;
ЗаполнитьЗначенияСвойств( НоваяСтрока, СтрокаПереноса) ;
НоваяСтрока. КлючСвязи = СтрокаПриемник. КлючСтроки;
КонецЦикла ;
Для Каждого СтрокаДерева Из МассивСтрок Цикл
Если СтрокаДерева. Родитель = Неопределено Тогда
СтрокаДерева. Строки. Удалить( СтрокаДерева) ;
Иначе
СтрокаДерева. Родитель. Строки. Удалить( СтрокаДерева) ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
Александр Синцов (Sintson)