1с дерево значений сортировать программно

Сортируем ДанныеФормыДерево на клиенте

У ДанныеФормыКоллекция для сортировки есть специальный метод Сортировать ( ) . Он доступен на клиенте и, хоть и делает вызов сервера, но, по понятным причинам, срабатывает крайне быстро. А вот ДанныеФормыДерево платформа обделила такой возможностью. Вместо этого программисты обычно переходят «на сервер», преобразуют ДанныеФормыДерево в полноценное ДеревоЗначений, сортируют и преобразуют обратно.

ДеревоЗначений = ДанныеФормыВЗначение(ДанныеФормыДерево, Тип("ДеревоЗначений"));  ДеревоЗначений.Строки.Сортировать("КолонкиСортировки", Истина);  ЗначениеВДанныеФормы(ДанныеФормыДерево, ДеревоЗначений);

А ведь существуют ситуации, когда перебрасывать данные всей формы «на сервер» значительно затратнее, чем, оставаясь «на клиенте», отсортировать десяток строчек. Для реализации Менеджер открытых форм опробовал разные алгоритмы сортировки ДанныеФормыДерево, доступные на клиенте. В результате, остановился на этом, что помогло ускорить открытие формы обработки в 2,5 раза. Выкладываю процедуру. Она поможет в тех случаях, когда вам явно по одной колонке отсортировать коллекцию. Если будет ясно, что метод нуждается в расширении возможностей, то процедура со временем доработается и статья обновится. P.S.: Есть альтернативные варианты процедуры? Выкладывайте в комментариях. Если наберётся достаточное количество интересных методов, то после можем провести нагрузочное тестирование, выложить результаты сравнения и выбрать процедуру-победитель.

&НаКлиентеНаСервереБезКонтекста Процедура СортироватьДанныеФормыДерево(КоллекцияСортировки, КолонкаСортировки, ВключатьПодчиненные = Ложь) КоллекцияСтрок = КоллекцияСортировки.ПолучитьЭлементы(); СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки); Если ВключатьПодчиненные Тогда Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл СортироватьДанныеФормыДерево(ТекущаяСтрока, КолонкаСортировки, ВключатьПодчиненные); КонецЦикла; КонецЕсли; КонецПроцедуры &НаКлиентеНаСервереБезКонтекста Процедура СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки) ПараметрыЗначений = Новый Соответствие; СортированныеЗначения = Новый СписокЗначений; Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл ТекущееЗначение = ТекущаяСтрока[КолонкаСортировки]; ПараметрыЗначения = ПараметрыЗначений.Получить(ТекущееЗначение); Если ПараметрыЗначения = Неопределено Тогда ПараметрыЗначения = Новый Массив; ПараметрыЗначений.Вставить(ТекущееЗначение, ПараметрыЗначения); СортированныеЗначения.Добавить(ТекущееЗначение); КонецЕсли; ПараметрыЗначения.Добавить(ТекущаяСтрока); КонецЦикла; СортированныеЗначения.СортироватьПоЗначению(НаправлениеСортировки.Возр); НовыйИндекс = 0; Для Каждого ТекущееЗначение Из СортированныеЗначения Цикл МассивСтрок = ПараметрыЗначений.Получить(ТекущееЗначение.Значение); Для Каждого ТекущаяСтрока Из МассивСтрок Цикл ТекущийИндекс = КоллекцияСтрок.Индекс(ТекущаяСтрока); ШагСдвига = НовыйИндекс - ТекущийИндекс; Если НЕ ШагСдвига = 0 Тогда КоллекцияСтрок.Сдвинуть(ТекущийИндекс, ШагСдвига); КонецЕсли; НовыйИндекс = НовыйИндекс + 1; КонецЦикла; КонецЦикла; КонецПроцедуры

Источник

Читайте также:  Закрепитель для дерева бдо

1С 8.3 Сортировка Дерева Значений — Программист 1С Минск. Автоматизация бизнеса.

//Добавляем колонки ДЗ
ДЗ . Колонки . Добавить ( «Результат» );
ДЗ . Колонки . Добавить ( «ТипЗначения» );

//Заполняем результатом строки ДЗ
СтрокаДЗ = ДЗ . Строки . Добавить ();
СтрокаДЗ . Результат = «Б» ;
СтрокаДЗ . ТипЗначения = ТипЗнч ( СтрокаДЗ . Результат );

СтрокаДЗ = ДЗ . Строки . Добавить ();
СтрокаДЗ . Результат = «А» ;
СтрокаДЗ . ТипЗначения = ТипЗнч ( СтрокаДЗ . Результат );

СтрокаДЗ = ДЗ . Строки . Добавить ();
СтрокаДЗ . Результат = 4.5 ;
СтрокаДЗ . ТипЗначения = ТипЗнч ( СтрокаДЗ . Результат );

СтрокаДЗ = ДЗ . Строки . Добавить ();
СтрокаДЗ . Результат = 2 ;
СтрокаДЗ . ТипЗначения = ТипЗнч ( СтрокаДЗ . Результат );

СтрокаДЗ = ДЗ . Строки . Добавить ();
СтрокаДЗ . Результат = 1 ;
СтрокаДЗ . ТипЗначения = ТипЗнч ( СтрокаДЗ . Результат );

//Сортируем строки
ДЗ . Строки . Сортировать ( «Результат» , , Новый СравнениеЗначений );
// 1 вариант) Параметр ОбъектСравнения (СравнениеЗначений) не задан,
// значения простых типов сравниваются по значению,
// а значения остальных типов — по строковому представлению.

// 2 вариант) параметр ОбъектСравнения (СравнениеЗначений) задан,
// значения простых типов также сравниваются по значению,
// а значения остальных типов — по правилам:
//// 2.1 Объекты сравниваются по идентификатору
//// 2.2 Моменты времени сравниваются по дате и идентификатору объекта
//// 2.3 Остальные значения сравниваются по строковому представлению

// Получаем результат
Для Каждого Строка_ДЗ Из ДЗ . Строки Цикл
Сообщить ( Строка_ДЗ . Результат ); // 1; 2; 4,5; А; Б;
КонецЦикла;

Источник

ДеревоЗначений.Строки
Метод Сортировать()

Метод Сортировать() сортирует строки в коллекции строк дерева значений по указанным правилам. Порядок указания имен колонок дерева значений определяет порядок сортировки. Это означает, что сначала строки сортируются по колонке, указанной первой. Затем группы строк с одинаковым значением в первой колонке сортируются по второй колонке, и так далее.

Если параметр ОбъектСравнения не задан, значения простых типов сравниваются по значению, а значения остальных типов — по строковому представлению.

Читайте также:  Протокол диагностики дом дерево человек

Если параметр ОбъектСравнения задан, значения простых типов также сравниваются по значению, а значения остальных типов — по правилам:

  • объекты сравниваются по идентификатору
  • моменты времени сравниваются по дате и идентификатору объекта
  • остальные значения сравниваются по строковому представлению

Доступность

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).

Пример использования

Пример кода с использованием метода Сортировать() :

//создание нового дерева значений ДеревоЗначений = Новый ДеревоЗначений; //добавим колонки ДеревоЗначений.Колонки.Добавить("Значение"); ДеревоЗначений.Колонки.Добавить("ТипЗначения"); НоваяСтрока = ДеревоЗначений.Строки.Добавить(); НоваяСтрока.Значение = 1; НоваяСтрока.ТипЗначения = ТипЗнч(НоваяСтрока.Значение); НоваяСтрока = ДеревоЗначений.Строки.Добавить(); НоваяСтрока.Значение = "1"; НоваяСтрока.ТипЗначения = ТипЗнч(НоваяСтрока.Значение); НоваяСтрока = ДеревоЗначений.Строки.Добавить(); НоваяСтрока.Значение = 1.1; НоваяСтрока.ТипЗначения = ТипЗнч(НоваяСтрока.Значение); //сортировка с использованием объекта сравнения значений ДеревоЗначений.Строки.Сортировать("Значение", , Новый СравнениеЗначений); //Результат: // 1, 1.1, "1" 

Читайте также:

Источник

Оцените статью