Особенности работы с OLE в версии 6.0 и старше

Перенос объекта под другого родителя

В 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

Синтаксис: 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

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

Файл с изменёным кодом для 6.1

« ПредыдущаяНа уровень вышеСледующая »
 
Driven by DokuWiki