I want to share with visitors of the site my approach to transform the values table in the values tree and back.
In general, when developing the branch-wise task, it was necessary almost for all the documents to output information as a tree and store it in the table parts of document, as well as in the interactive data processor as a tree.
Hence, there was a small module to extend the capabilities of work with the values tree, although with some reservations.
The main idea is to use two key attributes/columns RowKey and CommunicationKey.
In my opinion, the code is quite compact and universal.
The purpose of publication - to share with novices the experience.
Function GetNewKeyForRowTree(Tree, ListKeys = Undefined) Export If ListKeys = Undefined Then ListKeys = New ValueList; ListKeys.Add(0); EndIf; For Each StringTree In Tree.Rows Do ListKeys.Add(StringTree.RowKey); GetNewKeyForRowTree(StringTree, ListKeys); ListKeys.SortByValue(SortDirection.Desc); MaxKey = ListKeys[0].Value + 1; EndDo; Return MaxKey; EndFunction Procedure UpdateKeysLinksInValueTree(Tree) Export For Each StringTree In Tree.Rows Do Try StringTree.CommunicationKey = StringTree.Parent.RowKey; Except StringTree.CommunicationKey = 0; EndTry; UpdateKeysLinksInValueTree(StringTree); EndDo; EndProcedure Procedure UpdateRowKeysInValueTree(Tree, RowKey = 1) Export For Each StringTree In Tree.Rows Do StringTree.RowKey = RowKey; RowKey = RowKey + 1; UpdateRowKeysInValueTree(StringTree, RowKey); EndDo; EndProcedure Function UnloadTreeValuesInTableValues(Tree, Table = Undefined) Export If Table = Undefined Then Table = New ValueTable; For Each Column In Tree.Columns Do Table.Columns.Add(Column.Name, Column.ValueType); EndDo; EndIf; For Each StringTree In Tree.Rows Do FillPropertyValues(Table.Add(), StringTree); UnloadTreeValuesInTableValues(StringTree, Table); EndDo; Return Table; EndFunction Function UnloadTableValuesInValueTree(Table, RowKey = "RowKey", CommunicationKey = "CommunicationKey") Export Tree = New ValueTree; For Each Column In Table.Columns Do Tree.Columns.Add(Column.Name, Column.ValueType); EndDo; For Each TableRow In Table Do StringGrouping = Tree.Rows.Find(TableRow[CommunicationKey], RowKey,True); If StringGrouping = Undefined Then FillPropertyValues(Tree.Rows.Add(), TableRow); Else FillPropertyValues(StringGrouping.Rows.Add(), TableRow); EndIf; EndDo; Return Tree; EndFunction Procedure SetValueColumnTree(Tree, Column, Value) Export For Each StringTree In Tree.Rows Do StringTree[Column] = Value; SetValueColumnTree(StringTree, Column, Value); EndDo; EndProcedure Procedure CopySubordinateLine(LineReceiver, SourceString) For Each Row In SourceString.Rows Do NewRow = LineReceiver.Rows.Add(); NewRow.CommunicationKey = LineReceiver.RowKey; FillPropertyValues(NewRow, Row); CopySubordinateLine(NewRow, Row); EndDo; EndProcedure Procedure MoveStringValueTree(LineReceiver, SelectedRows) Export If Not LineReceiver = Undefined Then ArrayStrings = New Array; For Each LineTransfer In SelectedRows Do ArrayStrings.Add(LineTransfer); NewRow = LineReceiver.Rows.Add(); CopySubordinateLine(NewRow, LineTransfer); FillPropertyValues(NewRow, LineTransfer); NewRow.CommunicationKey = LineReceiver.RowKey; EndDo; For Each StringTree In ArrayStrings Do If StringTree.Parent = Undefined Then StringTree.Rows.Delete(StringTree); Else StringTree.Parent.Rows.Delete(StringTree); EndIf; EndDo; EndIf; EndProcedure
You can download an example of data processor here: TreeToTable.zip.
Click to rate this post!
[Total: 0 Average: 0]