В описанных ранее сортировках таблицы значений формы, надо обязательно указать название табличной части и поля для сортировки. Для всех своих таблиц значения, размещаемых на форме, использую универсальный код, который работает для любой табличной части и любого поля.
Для новой формы остаётся перенести команды сортировки, код подпрограмм и включаю команды в контекстное меню табличной части формы.
И сортировка работает для любого поля.
Все реализовано достаточно просто, см.код.
// Сортировка
&НаКлиенте
Процедура сортировать(Команда)
ТЭ_имя_объект=ТекущийЭлемент.Имя;
ТЭ_поле=ТекущийЭлемент.ТекущийЭлемент.имя;
имяКолонки=СтрЗаменить( ТЭ_поле,ТЭ_имя_объект,"");
если команда.имя="СортировкаУ" тогда
СортироватьНасервере(ТЭ_имя_объект,имяКолонки,"Убыв");
иначе
СортироватьНасервере(ТЭ_имя_объект,имяКолонки,"Возр");
конецесли;
КонецПроцедуры
&НаСервере
Процедура сортироватьНасервере(имяОбъекта,имяКолонки,ВидСортировки)
ЭФ= РеквизитФормыВЗначение("Объект");
ТЗ_объекта=ЭФ[имяОбъекта];
тз= ТЗ_объекта.Выгрузить();
колонкасортировки=тз.Колонки.Найти(имяКолонки);
если колонкасортировки<>Неопределено тогда
ТЗ_объекта.Сортировать(имяКолонки+" "+ВидСортировки);
иначе
//запомним текущую строку
ткэлемент=элементы[имяОбъекта];
позиция_стр=Тз_объекта.НайтиПоИдентификатору(ткэлемент.ТекущаяСтрока);
Идекс_позиции=Тз_объекта.индекс(позиция_стр);
строкаВтаблице=тз.Получить(Идекс_позиции);
пдТ= ТекущийЭлемент.ПутьКДанным;
ПД= ТекущийЭлемент.ТекущийЭлемент.ПутьКДанным;
пд= СтрЗаменить(ПД,пдТ+".","");
// получим основную и дополнительную колонку
основннаяКолонка=лев(пд,найти(пд,".")-1);
допколонка=СтрЗаменить(пд,основннаяКолонка+".","");
тз.Колонки.Добавить( имяКолонки);
//заполним поля для сортировки
для каждого элементаТЗ из тз цикл
тзобъекта= элементаТз[основннаяКолонка] ;
элементаТз[имяКолонки]=вычислить("тзобъекта."+допколонка);
конеццикла;
тз.Сортировать(имяКолонки+" "+ВидСортировки);
индексТЗпослеСортировки=ТЗ.Индекс(строкаВтаблице);
ТЗ_объекта.Загрузить(тз);
//восстановим курсор на нужную строку
позиция_стр= ТЗ_объекта.Получить( индексТЗпослеСортировки);
ткэлемент.ТекущаяСтрока=позиция_стр.ПолучитьИдентификатор();
конецесли;
ЗначениеВРеквизитФормы(Эф,"Объект");
конецпроцедуры
// Сортировка