&AtClient
Procedure SortBL(Command)
if not CurrentItem.CurrentData=Undefined then
CurrentItem.CurrentRow = SortBLAtServer(CurrentItem.Name,CurrentItem.CurrentItem.Name,
?(StrFind(Command.Name,"DESC")>0,"DESC","ASC"), CurrentItem.CurrentData.LineNumber-1);
endif;
EndProcedure
&AtServer
Function SortBLAtServer(ItemName, ColumnName, DirSorting, CurrRow)
ItemForm = FormAttributeToValue("Object");
TableObject = ItemForm[ItemName];
ColumnFormField = Items[ItemName].ChildItems.Find(ColumnName); // для проверки на случай сортировки по колонкам реквизитов реквизитов, добавленным в конфигураторе
if ColumnFormField=Undefined then // случай сортировки колонки, содержащую реквизит реквизита табличной части и добавленную через изменение формы в предприятии
AttibuteNameArray = StrSplit(StrReplace(ColumnName,ItemName,""),"_"); // здесь разделитель "_" и дополнительно нужно убрать имя табличного поля из начала имени колонки
else
AttibuteNameArray = StrSplit(ColumnFormField.DataPath,".");
if AttibuteNameArray.Count()=3 then // случай сортировки колонки, содержащую реквизит табличной части, их всегда 3: объект, имя табличного поля и имя нужного реквизита
CurrRowID = TableObject[CurrRow]; // запомнили текущую выделенную строку
TableObject.Sort(AttibuteNameArray[2]+" "+DirSorting);
ValueToFormAttribute(ItemForm,"Object");
return TableObject.IndexOf(CurrRowID); // вернем позицию выделенной ранее строке
else // случай сортировки колонки, содержащую реквизит реквизита табличной части и добавленную в конфигураторе
AttibuteNameArray = StrSplit(ColumnFormField.DataPath,".");
AttibuteNameArray.Delete(0); // удаляем элемент "объект"
AttibuteNameArray.Delete(0); // удаляем элемент с именем табличного поля
EndIf;
endif;
VT = TableObject.Unload(); // создаем вспомогательную таблицу
VT.Columns.Add("AdditionFieldForSorting"); // интерактивная сортировка всегда по одной колонке, имя назначим служебное
CurrRowID = VT[CurrRow]; // запомнили текущую выделенную строку. Во вспомогательной таблице, чтобы ИД строки был от сортируемой таблицы
MainValueName = AttibuteNameArray[0]; // имя реквизита табличной части, значения реквизитов которого нужно сортировать
AttibuteNameArray.Delete(0); // удаляем элемент, реквизиты которого получаем
ValuesArray = VT.UnloadColumn(MainValueName); // формируем массив ссылок для получения значений реквизита и формируем соответствие ссылка-значение
Query = New Query("SEL ECT Ref, " + StrConcat(AttibuteNameArray,".") + " AS AttributeName FR OM " + ValuesArray[0].Metadata().FullName() + " AS T WHERE T.Ref IN (&RefArray)");
Query.SetParameter("RefArray", ValuesArray);
Selection = Query.Execute().Select();
MapValues = New Map;
While Selection.Next() Do
MapValues.Insert(Selection.Ref, Selection.AttributeName);
EndDo;
for each str in VT do // заполняем значения для сортировки
str.AdditionFieldForSorting = MapValues[str[MainValueName]];
enddo;
VT.Sort("AdditionFieldForSorting "+DirSorting); // сортировка по служебной колонке
TableObject.Load(VT);
ValueToFormAttribute(ItemForm,"Object");
return VT.IndexOf(CurrRowID); // вернем позицию выделенной ранее строке
EndFunction
|