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" )
Тем же самым способом можно удалить корневые объекты, если вы их создаете в большом количестве.