В 6.0 поменялся способ хранения для иерархических справочников, теперь такие справочники хранятся с использованием бинарных связей.
Иерархическая связь может быть одна, поэтому предыдущую связь надо будет удалить, а затем создать новую.
Новую надо создавать с сразу заполненными параметрами ОбъектИз, ОбъектВ, ObjectClassId (либо OLE_ObjectClassID)
Параметры ОбъектИз и ОбъектВ заполняются вашими объектами, причём ObjectFrom(ОбъектИз) - это обычно родитель, а ObjectTo(ОбъектВ) – потомок.
Про обычно – смотрите ниже про направление связи.
Параметр ObjectClassId должен быть заполнен в соответствии с Вашим новым классом связи.
Чтобы увидеть, как настроены бинарные связи для конкретного справочника – надо в объектной модели нажать правой кнопкой на нужный вам справочник и выбрать Настройки справочника:
В полученном окне вам нужен список Классы связей иерархии, те строки, для которых отмечены галочки во втором столбике.
Вы находите нужную Вам запись – например, вы хотите положить должность под должность – это самая первая запись. В этой строке запоминаете тип связи – Иерархия оргструктуры.
Также обратите внимание, что направление написано Из-В. Это выше описанная ситуация, когда обычно Из – это родитель в иерархии. А для Ролей будет наоборот – родитель находится в ОбъектВ, а потомок в ОбъектИз.
Находите этот тип связи в объектной модели:
И справа в свойствах, в группе дополнительно находите ID:
Этот ID Вам нужно будет при создании связи положить в свойство ObjectClassID.
Создавать Бинарную Связь нужно от справочника Бинарные Связи, не от его виртуального подкласса(иерархия оргструктуры)
Код:
Sub ПримерOLE_РаботаСКлассами60()
'Получение объекта приложения
Set oleapp = CreateObject("ByteEnterprise.OleApplication")
'Запустить Business Studio в редакции и базой на сервере, указанными ранее.
'В Диспетчере задач появится Business Studio. В панели задач приложения не будет видно.
Set client_app = oleapp.ЗапуститьКлиентскоеПриложение("ИмяСервера", "ИмяБазы", "РедакцияПрограммы")
'В панели задач появится приложение
oleapp.ПоказатьКлиентскоеПриложение
'Дальше обращение будет с документами(иерархический справочник)
Set Документы = oleapp.ПолучитьКорневуюГруппуКласса("БизнесМодель.Документы")
'Так как OLE не поддерживает создание объектов прямо под ОПУ - создадим под папкой Бумажные Документы:
Set СписокОПУБумажныеДокументы = oleapp.ПолучитьОбъекты("БизнесМодель.Документы", "guid", "fe05017b-6dd8-4316-b424-74f39f2d2e16")
Set ОПУБумажныеДокументы = СписокОПУБумажныеДокументы.ПолучитьЭлемент(0)
'Создадим новую папку
Set НоваяГруппа = oleapp.СоздатьГруппу(ОПУБумажныеДокументы)
НоваяГруппа.Название = "Папка через OLE под папкой"
'Обратимся к параметру, отвечающему за виртуальный класс
ПараметрКласс = НоваяГруппа.Параметры.ПолучитьЭлемент("ObjectClassID")
' В объектной модели можно увидеть, какой нужен ID для какого класса
' Указанный ниже соответствует папке
ПараметрКласс.Значение = "49727049-7d8e-43bc-80a8-01269e63ca8b"
НоваяГруппа.Сохранить
' Теперь перенесём созданную папку под ОПУ
' Ищем старую бинарную связь
Set БинарныеСвязи = oleapp.ПолучитьКорневуюГруппуКласса("AppPlatform.BinaryRelationship")
'Создать фильтр, отбирающий только нужные нам связи
Set ФильтрБинарныеСвязи = БинарныеСвязи.СоздатьФильтр
ФильтрБинарныеСвязи.Условия.Параметры.ObjectFrom.Значение = ОПУБумажныеДокументы
ФильтрБинарныеСвязи.Условия.Параметры.ObjectTo.Значение = НоваяГруппа
' Условие на класс связи нужно для того, чтобы мы не тронули не иерархические связи
ФильтрБинарныеСвязи.Условия.Параметры.ObjectClassID.Значение = "ef61f9d6-e9a4-40b0-a1b8-254b2233b551"
'Выполняем фильтр и удаляем старую связь
Set РезультатФильтрБинарныеСвязи = ФильтрБинарныеСвязи.Выполнить
Связь = РезультатФильтрБинарныеСвязи.ПолучитьЭлемент(0)
Связь.Удалить
'Создаём новую связь
Set НоваяСвязь = oleapp.СоздатьОбъект(БинарныеСвязи)
ПараметрИз = НоваяСвязь.Параметры.ПолучитьЭлемент("ObjectFrom")
ПараметрИз.Значение = Документы
ПараметрВ = НоваяСвязь.Параметры.ПолучитьЭлемент("ObjectTo")
ПараметрВ.Значение = НоваяГруппа
ПараметрКласс = НоваяСвязь.Параметры.ПолучитьЭлемент("ObjectClassID")
ПараметрКласс.Значение = "ef61f9d6-e9a4-40b0-a1b8-254b2233b551"
НоваяСвязь.Сохранить
End Sub
Синтаксис: CreateObjectWithOptions(object <Parent>, string "<GuidClass>", string "<GuidRel>", string "From_To|To_From")
Возвращаемый результат: Система.МетаКласс (см. Класс "Система.МетаКласс").
Parent - объект, под которым будет создаваться новый объект. GuidClass - guid класса для нового объекта. GuidRel - guid класса связи(см. выше подробно как найти guid класса) "From_To|To_From" - направление связи, либо From_To(соответствует Из_В), либо To_From(соответствует В_Из).
Метод CreateObjectWithOptions в отличие от метода СоздатьОбъект(Mетод СоздатьОбъект) позволяет создавать объекты нужного класса и с нужной бинарной связью с родителем.
Ниже пример на основе оргедениц - как создавать оргеденицы разного класса под разными оргеденицами.
Sub ПримерOLE_СозданиеОбъектаСУказаниемКлассаИКлассаСвязи()
'Получение объекта приложения
Set oleapp = CreateObject("ByteEnterprise.OleApplication")
'Запустить Business Studio Enterprise с базой под именем "ИмяБазы" на сервере
'ИмяСервера.
'В Диспетчере задач появится Business Studio. В панели задач приложения не будет видно.
Set client_app = oleapp.ЗапуститьКлиентскоеПриложение(TypeServer, NameSerer, NameDB, ProductType)
'В панели задач появится приложение
oleapp.ПоказатьКлиентскоеПриложение
'Корневая ОПУ
Set ОргединицыОПУ = oleapp.ПолучитьКорневуюГруппуКласса("BizArch.OrgUnit")
'Должность
Set СписокОргедениц = oleapp.ПолучитьОбъекты("BizArch.OrgUnit", "Название", "Юрист")
Set Должность = СписокОргедениц.ПолучитьЭлемент(0)
'Роль
Set СписокОргедениц = oleapp.ПолучитьОбъекты("BizArch.OrgUnit", "Название", "Руководитель подразделения")
Set Роль = СписокОргедениц.ПолучитьЭлемент(0)
'Подразделение
Set СписокОргедениц = oleapp.ПолучитьОбъекты("BizArch.OrgUnit", "Название", "ИнТехПроект")
Set Подразделение = СписокОргедениц.ПолучитьЭлемент(0)
'Группа
Set СписокОргедениц = oleapp.ПолучитьОбъекты("BizArch.OrgUnit", "Название", "Комиссия по закупкам")
Set Группа = СписокОргедениц.ПолучитьЭлемент(0)
'Класс должности
КлассДолжности = "2a57fbb5-5473-4c5a-8056-25cc75e98bc2"
'Класс Роль
КлассРоли = "44c21176-c927-47f6-93d8-730fbf096a00"
'Класс подразделения
КлассПодразделения = "0c796156-d66c-42ba-a6b7-c36b3d5cba58"
'Класс Группы
КлассГруппы = "c6dd7787-5ce8-429d-9676-944ce978c5ae"
'Класс папки
КлассПапки = "49727049-7d8e-43bc-80a8-01269e63ca8b"
'Класс связи Иерархия оргструктуры(Должность - Долж/Подраз: Из_В)
КлассИерархияОргструктуры = "a21e3c1d-785d-46a2-95dd-05df30ea395a"
'Класс связи Композиция(Група- Группа/Долж/Подраз/Роль: Из_В) (Подразд-Должн/Подр: Из_В)
КлассКомпозиция = "4fd3aad9-3ac8-4333-8b71-e42ccff35195"
'Класс связи Специализация(Роль - Роль: В_Из)
КлассСпециализация = "36d582d1-ac65-4130-9221-b3586961ba4d"
'Класс связи Хранение в справочнике(Корневой - Все: Из_В)(Папка - Все:Из_В)
КлассХранениеВСправочнике = "ef61f9d6-e9a4-40b0-a1b8-254b2233b551"
Set newOrgunit = oleapp.CreateObjectWithOptions(ОргединицыОПУ, КлассПапки, КлассХранениеВСправочнике, "From_To")
newOrgunit.Name = "Папка под корневым объектом"
newOrgunit.Сохранить
Set newOrgunit = oleapp.CreateObjectWithOptions(Должность, КлассПодразделения, КлассИерархияОргструктуры, "From_To")
newOrgunit.Name = "Подразделение под должностью"
newOrgunit.Сохранить
Set newOrgunit = oleapp.CreateObjectWithOptions(Подразделение, КлассДолжности, КлассКомпозиция, "From_To")
newOrgunit.Name = "Должность под подразделением"
newOrgunit.Сохранить
Set newOrgunit = oleapp.CreateObjectWithOptions(Роль, КлассРоли, КлассСпециализация, "To_From")
newOrgunit.Name = "Роль под ролью"
newOrgunit.Сохранить
Set newOrgunit = oleapp.CreateObjectWithOptions(Группа, КлассГруппы, КлассКомпозиция, "From_To")
newOrgunit.Name = "Группа под группой"
newOrgunit.Сохранить
End Sub
Свойство: OLE_ObjectClassID
Тип параметра: Строка.
Это свойство стоит использовать для доступа к классу объекта, если в вашей системе не поддерживается тип Guid.
Пример кода.
Задача: Получить информацию о классе объекта и поменять его.
Sub ТестПользователя()
Set oleapp = CreateObject("Byte.OleApplication")
Set client_app = oleapp.RunClientApplication2(TypeServer, NameServer, NameDB, 0, ProductType)
oleapp.ShowClientApplication
Set f = oleapp.GetRepositoryRootFolder("AppPlatform.Person").CreateFilter()
f.Conditions.Properties.GUID.Value = "ada7f92e-6a49-4b55-973d-2b5a039a7ce6"
Set s = f.Execute()
Set o1 = s.GetItem(0)
MsgBox ("Obj=" + o1.Name)
MsgBox ("ClassID=" + o1.OLE_ObjectClassID)
o1.OLE_ObjectClassID = "49727049-7d8e-43bc-80a8-01269e63ca8b" ' Устанавливаем новый класс - папку
o1.Save
End Sub
Начиная с версии 6.1 OLE не поддерживает часть методов на русском языке. Ниже файл, где содержатся примеры из справки, переписанные на новые английские названия.