Re: Объекты ТКС

Несколько замечаний об объектах ТКС АПИ.

Корневые объекты получаемые от Application (TCS_Application, OCS_Application) создаются в системе один раз и удалятся только при выгрузке программы.

Это делается для того чтобы при постоянных обращениях к этим объектам они не создавалиcь вновь, а при последующих запусках можно было обратиться к объекту в том состоянии в котором его оставил пользователь.  То есть вот такой код будет работать всегда с одним и тем же объектом ( хотя в программе их создается намного больше)


if TCSApp.Archive.RunModuleForSelect( "Select", True ) Then
 For I=0 To TCSApp.Archive.SelectedRowsCount-1
   If TCSApp.Archive.GotoSelectedRow(I) Then
   End If
 Next
End If

Все остальные объекты  (полученные через Properties, ChildModules ) удалются системой автоматически при отсутcтвии ссылок на них, либо при удалении родительского ообъекта. То есть в коде



Set NMks = TCSApp.Nomenclatures( NMkClassId)
If Not NMks Is Nothing Then 

 Set NmkSpec = NMks.Properties("NmkSpecification").AsIDispatch
  If  Not NmkSpec Is Nothing Then 
    Set SpecPars = NmkSpec.Properties("Parameters").AsIDispatch
    If  Not SpecPars Is Nothing Then 
    End If
    Set SpecPars = Nothing
  End If
  Set NmkSpec = Nothing
  
End If  

Объекты связанны с NmkSpec,  SpecPars  удалятся при присвоении им Nothing ( или автоматически VBScript если вы не пишите эти строки ).
Более того, если вы вызовите сначала
  Set NmkSpec = Nothing
а после попытаетесь обратиться в объекту SpecPars  это вызовет ошибку ( так как при удалении родительского объекта все связанные с ним удаляются ).

Если вам нужна своя личная копия глобального объекта вы можете присвоить ему уникальное имя. И в этом случае он будет доступен только по этому уникальному имени и никак более. Это поясняет такой пример


Function GetMyDocParams

  Set GetMyDocParams = TCSApp.ModuleByUserModuleName( "MyDocParams" )
  If GetMyDocParams Is Nothing Then
     TCSApp.ShowErrorMessage( "Will create" )
     Set GetMyDocParams = TCSApp.DocParams
     GetMyDocParams.UserModuleName = "MyDocParams"  
     Call GetMyDocParams.Filter.ClearFilter
     Call GetMyDocParams.Filter.NewFilterItem( GetMyDocParams.Properties( "TYPE_NOTE" ), fkEQ, "Список" )
     Call GetMyDocParams.Filter.ApplyFilter       
  End If
End Function

Sub FormMacro_Temp

Set D1 = GetMyDocParams
I = D1.ShowModal( "asdasd" )

Set D2 = TCSApp.DocParams
I = D2.ShowModal( "asdasd" )
 
End Sub

В данном случае у вас два объекта DocParams, один их которых доступен только по имени (уникальному) и обратиться к нему не зная этого имени невозможно. Удалить его тоже можно только вызовом


  TCSApp.DeleteModuleByUserModuleName( "MyDocParams" )

Тем же самым способом можно удалить корневые объекты, если вы их создаете в большом количестве.