Программный поиск классов и объектов

Материал из ODANT Wiki
Перейти к: навигация, поиск

Расположение Класса и объекта определяется по его адресу. Адрес класса/объекта в Оде имеет следующий формат: oda://H:1CBC6EA9A45760D/D:1CBC9D49EB34444/C:1CBC61175299D0D (для объекта oda://H:1CBC6EA9A45760D/D:1CBCD22EF56E73F/C:1CB9AC3D30E28E3/O:1CBD0250A97E00B), где
H:1CBC6EA9A45760D - идентификатор хоста, в котором находится класс,
D:1CBC9D49EB34444 - идентификатор домена,
C:1CBC61175299D0D - непосредственно идентификатор самого класса.
O:1CBD0250A97E00B - идентификатор объекта.
Идентификаторы являются уникальными для своей среды, за исключением дочерних классов - у них такой же идентификатор что и у родительского.
Адрес oda://H:1CBC6EA9A45760D/D:1CBC9D49EB34444/C:1CBC61175299D0D является абсолютным, следовательно, если перенести класс в другой хост или домен, то функция поиска, вызванная в модуле класса возвратит null, так как по указанному адресу класс найден не будет. Поэтому для обеспечения переносимости следует использовать относительные адреса. Вот пример относительного адреса:
oda://H:*/D:*/C:396965150315953, символ "*" означает "искать везде", то есть поиск будет происходить по всем хостам и доменам до нахождения (или не нахождения в последнем домене последнего хоста) класса с указанным идентификатором.
Поиск происходит по иерархии хостов/доменов, а в равнозначных хостах/доменах - по их именах в алфавитном порядке. Из этого следует, что поиск по такому адресу будет происходить довольно долго и самое главное неточно, так как класс с таким же идентификатором (наследник или родительский по отношению к искомому) может располагаться в хосте/домене с большим приоритетом или с именем начинающемся на букву, следующую ранее по алфавиту. Для избегания таких ошибок можно более точно выходить к нужному классу используя модификатор "this", который означает "искать в текущем домене/хосте". Например: oda://H:this/D:this/C:396965150315953, и поиск будет происходить в том домене и хосте, откуда запущен метод. Также для увеличения точности можно сочетать данные методы:
oda://H:this/D:*/C:396965150315953, или oda://H:1CBC6EA9A45760D/D:*/C:396965150315953 и т.д.
Итак, с адресами разобрались, теперь коротко о функциях, позволяющих найти класс или объект.
Запустить поиск можно от любой переменной типа Item или его наследников, таких как Class или Object. В классе Init есть объекты этих классов, которые представляют класс и/или объект, запустивший модуль. Для поиска классов и объектов от Object можно запустить методы FindClass, FindObject. В качестве параметра эти методы принимают путь к тому или иному классу/объекту (в данной статье рассмотрен и освещен только поиск по адресу, чтобы узнать остальные перегруженные версии этих методов воспользуйтесь справкой программиста на сайте oda.su), например:

[csharp,N]Class optionsClass = Object.FindObject.FindClass ("oda://H:this/D:*/C:396965150315953");

Если искомый класс/объект является дочерним для ищущего, то кидать целый адрес необязательно, хватит и одного идентификатора класса:

[csharp,N]Class optionsClass = Object.FindObject.FindClass("C:396965150315953");

Аналогично происходит поиск объектов, только естественно используется метод FindObject.
Также объект можно найти по его имени, для этого существует метод Сlass.FindObjectByName("Имя объекта").
Если нужно получить объект, который прикреплен к другому объекту по ссылке, то можно воспользоваться следующим способом:
FindObject(xmlElement root, string fieldName);
fieldName - имя поля-ссылки.
Пример: [csharp,N]MyObject.FindObject(MyObject.Root, "Клиент");
--92.249.73.98 17:15, 7 March 2011 (UTC)