В 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 не поддерживает часть методов на русском языке. Ниже файл, где содержатся примеры из справки, переписанные на новые английские названия.