Программная сортировка дерева значений по текущей колонке на управляемой форме

1. frkbvfnjh 787 19.09.18 13:52 Сейчас в теме
Доброго времени суток! Столкнулся с проблемой: в управляемую добавил реквизит с типом ДеревоЗначений. Нужно программно отсортировать это дерево по текущей колонке. В обработчике команды сортировки пишу:
ТабличноеПоле = Элементы.ДеревоДанных;

Если ТабличноеПоле.ТекущийЭлемент = Неопределено Тогда
	Сообщить("Не выбрана колонка!", СтатусСообщения.Важное);
	Возврат;
КонецЕсли;

ДеревоДанных.Сортировать(ТабличноеПоле.ТекущийЭлемент.Имя);

Но дело в том, что в метод Сортировать нужно передать имя колонки, а в переменной ТабличноеПоле.ТекущийЭлемент.Имя содержится совсем не имя колонки. У текущего элемента есть свойство ПутьКДанным, но через отладку говорит, что свойство не доступно. Так вот как через текущий элемент получить типа путь к данным этого элемента или как поступают в данном случае?
По теме из базы знаний
Найденные решения
8. SlavaKron 19.09.18 17:07 Сейчас в теме
(5) Можно создать переменную модуля на клиенте типа Соответствие, в которой хранить связь ИмяЭлемента - ПутьКДанным.
&НаКлиенте
Перем ПутиКДанным;

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ПутиКДанным = ПолучитьПутиКДанным();
КонецПроцедуры

&НаСервере
Функция ПолучитьПутиКДанным()
	Результат = Новый Соответствие;
	Для Каждого Элемент Из Элементы Цикл
		Если ТипЗнч(Элемент) = Тип("ПолеФормы") И Элемент.ПутьКДанным <> "" Тогда
			Результат.Вставить(Элемент.Имя, Элемент.ПутьКДанным); 
		КонецЕсли;
	КонецЦикла;
	Возврат Результат
КонецФункции
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Alexey_ 27 19.09.18 13:58 Сейчас в теме
(1) ПолеФормы (FormField)
ПутьКДанным (DataPath)

Описание:
Тип: Строка.
Содержит путь к реквизиту, с которым связан объект.

Доступность:
Сервер, мобильное приложение(сервер).
3. frkbvfnjh 787 19.09.18 14:28 Сейчас в теме
(2) А как текущий элемент передать на Сервер? Напрямую никак, говорит не допустимый тип для передачи с клиента на сервер.
7. spacecraft 19.09.18 16:59 Сейчас в теме
(1) для этого используется отдельный реквизит формы (список значений или таблица значений) с именами колонок. Из него и брать нужное имя.
4. frkbvfnjh 787 19.09.18 14:29 Сейчас в теме
Может кто нибудь готовый код написать как программно отсортировать дерево значений по текущей колонке в управляемой форме?
5. frkbvfnjh 787 19.09.18 15:01 Сейчас в теме
Корче пришлось полностью "гонять" форму на сервер, тогда получилось, т.е. на стороне сервера выполнять код по получению текущего элемента и там уже доступен путь к данным. Но это чертовски не оптимально! 1000 чертей, целый 1 (один) серверный вызов получается. Думал что можно как то на стороне клиента все сделать, получить реальное имя колонки (путь к данным) без "ходки" на сервер, т.к. сортировать позволяет и на клиенте.
8. SlavaKron 19.09.18 17:07 Сейчас в теме
(5) Можно создать переменную модуля на клиенте типа Соответствие, в которой хранить связь ИмяЭлемента - ПутьКДанным.
&НаКлиенте
Перем ПутиКДанным;

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ПутиКДанным = ПолучитьПутиКДанным();
КонецПроцедуры

&НаСервере
Функция ПолучитьПутиКДанным()
	Результат = Новый Соответствие;
	Для Каждого Элемент Из Элементы Цикл
		Если ТипЗнч(Элемент) = Тип("ПолеФормы") И Элемент.ПутьКДанным <> "" Тогда
			Результат.Вставить(Элемент.Имя, Элемент.ПутьКДанным); 
		КонецЕсли;
	КонецЦикла;
	Возврат Результат
КонецФункции
Показать
11. frkbvfnjh 787 20.09.18 06:09 Сейчас в теме
(8) Спасибо, думаю Ваш метод самый подходящий. Сегодня затестирую.
6. coollerinc 186 19.09.18 16:55 Сейчас в теме
Я делал так

&НаКлиенте
Процедура СотрировкаНоменклатураСписок(Убыв = Ложь)
	
	Если Убыв Тогда
		КартинкаШапки = БиблиотекаКартинок.СтрелкаВверх;
		Порядок = "Убыв";
	Иначе
		КартинкаШапки = БиблиотекаКартинок.СтрелкаВниз;
		Порядок = "Возр";
	КонецЕсли; 
	
	ТекущийЭлементНоменклатураСписок = Элементы.НоменклатураСписок.ТекущийЭлемент;
	
	Элементы.НоменклатураСписокЦветПоставщика.КартинкаШапки = Новый Картинка();
	Элементы.НоменклатураСписокЦвет.КартинкаШапки = Новый Картинка();
	Элементы.НоменклатураСписокШтрихКод.КартинкаШапки = Новый Картинка();
	Элементы.НоменклатураСписокРазмер.КартинкаШапки = Новый Картинка();
	
	Если ТекущийЭлементНоменклатураСписок = Элементы.НоменклатураСписокЦветПоставщика Тогда
		НоменклатураСписок.Сортировать("ЦветПоставщика " + Порядок);
	ИначеЕсли ТекущийЭлементНоменклатураСписок = Элементы.НоменклатураСписокЦвет Тогда 
		НоменклатураСписок.Сортировать("Цвет " + Порядок);
	ИначеЕсли ТекущийЭлементНоменклатураСписок = Элементы.НоменклатураСписокШтрихКод Тогда 
		НоменклатураСписок.Сортировать("ШтрихКод " + Порядок);
	ИначеЕсли ТекущийЭлементНоменклатураСписок = Элементы.НоменклатураСписокРазмер Тогда 
		НоменклатураСписок.Сортировать("Размер " + Порядок);
	КонецЕсли;

	ТекущийЭлементНоменклатураСписок.КартинкаШапки = КартинкаШапки;
	
КонецПроцедуры
Показать
12. frkbvfnjh 787 20.09.18 06:12 Сейчас в теме
(6) Интересный способ, но как я понял, при добавлении новых колонок нужно и код дописывать. Хотя если состав колонок не изменен, Ваш способ весьма хорош, большое спасибо!
9. user596430_gleb21 3 19.09.18 23:19 Сейчас в теме
А что, у "ДанныеФормыДерево" есть метод "сортировать"?
10. frkbvfnjh 787 20.09.18 06:07 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот