Imports NpoComputer.WebAccess
Imports NpoComputer.WebAccess.Components
Public Class ContractBoundDocuments
Inherits EDocumentBoundDocuments 'Наследуется от стандартной компоненты «Связанные документы»
''' <summary>
''' Получить главный договор для записи справочника "Договоры"
''' </summary>
''' <param name="Rec"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Function GetMainContract(ByVal Rec As API.ReferenceRecord) As API.ReferenceRecord
'Найти первую запись справочника, у которой реквизит «Договор» пустой.
While Not Rec.Requisites("Contract").IsNull
'Получить ведущую запись справочника по ИД
Rec = WebSession.Context.References(Constants.REFERENCE_CONTRACTS).GetRecordByID(Rec.Requisites("Contract").Value)
End While
Return Rec
End Function
''' <summary>
''' Получить все записи справочника "Договоры", связанные с данной.
''' </summary>
''' <param name="Contract">Договор</param>
''' <param name="Result">Список ID результатов</param>
''' <remarks></remarks>
Private Sub GetRecordIDsInContractTree(ByVal Contract As API.ReferenceRecord, ByVal Result As List(Of Integer))
'Добавить ИД договора в результирующую коллекцию
Result.Add(Contract.ID)
'Получить список договоров, которые связаны с данной записью.
Dim Records = WebSession.Context.References(Constants.REFERENCE_CONTRACTS).GetFilteredRecords("Contract=" & Contract.ID)
'Построить иерархию связанных записей
For Each Record In Records
GetRecordIDsInContractTree(Record, Result)
Next
End Sub
''' <summary>
''' Получить список документов, связанных с данным договором или с какими-то другими договорами из иерархии.
''' </summary>
''' <param name="Rec">Запись справочника "Договоры"</param>
''' <returns></returns>
''' <remarks></remarks>
Private Function GetBoundDocuments(ByVal Rec As API.ReferenceRecord) As List(Of API.BaseDataObject)
Dim RecIDList As New List(Of Integer)
'Получить главный договор
Rec = GetMainContract(Rec)
'Получить все связанные записи в виде иерархии
GetRecordIDsInContractTree(Rec, RecIDList)
' Отфильтровать документы по всем договорам.
Dim Filter = String.Join("|", (From ID In RecIDList Select Constants.REQ_CONTRACT & "=" & ID).ToArray)
Dim Res = WebSession.Context.EDocuments.GetFilteredDocuments(Filter)
Return Res.Cast(Of API.BaseDataObject).ToList()
End Function
''' <summary>
''' Список связанных документов.
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Overrides Function GetSubObjects() As System.Collections.Generic.IEnumerable(Of API.BaseDataObject)
IsReadOnly = True
'Получить текущую запись справочника по ИД.
Dim Rec = WebSession.Context.References(Constants.REFERENCE_CONTRACTS).GetRecordByID(ObjectID)
'Найти связанные документы
Return GetBoundDocuments(Rec)
End Function
''' <summary>
''' Построение контроля.
''' </summary>
''' <remarks></remarks>
Protected Overrides Sub CreateChildControls()
MyBase.CreateChildControls()
'Отобразить иерархию связей.
GetList()
End Sub
End Class
Примечание
WebSession – класс для упрощения доступа к текущему контексту пользователя.
© Компания DIRECTUM, 2018 | Сообщество пользователей DIRECTUM |