Различия

Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.

Ссылка на это сравнение

ru:technical_manual:work_via_ole:script_work_via_ole [2019/09/12 15:56]
ru:technical_manual:work_via_ole:script_work_via_ole [2023/03/16 12:20] (текущий)
Строка 1: Строка 1:
 +====== Сценарии работы с Business Studio через OLE ======
  
 +В приведенных ниже примерах:
 +  * <Имя_сервера_БД> - имя сервера базы данных, 
 +  * <Имя_базы> - название базы данных, 
 +  * <Редакция_продукта> - Ultimate, Enterprise, Professional или Cockpit. Редакция продукта должна соответствовать имеющейся лицензии, иначе запуск приложения не удастся.
 +
 +===== Пример синхронизации справочника сотрудников с внешним хранилищем =====
 +
 +Список сотрудников будет находиться в файле MS Excel (Таблица 1). Пример приведен на языке программирования VBA.
 +
 +<startTableBox>
 +^  Фамилия  ^  Имя  ^  Отчество  ^  Дата рождения  ^  р.тел  ^  e-mail  ^
 +| Иванов | Иван | Иванович | 29.09.1969 | 202-19-00 | name@firma.ru |
 +| Петров | Петр | Петрович | 04.05.1978 | 202-19-01 | name2@firma.ru |
 +<endTableBox|Таблица 1. Структура файла Excel со списком сотрудников>
 +
 +<code>
 +Sub СинхронизацияФизЛиц()
 +
 +    Set appEx = Application
 +
 +    Dim i As Integer
 +
 +    Dim Фамилия, Имя, Отчество, ДатаРождения, РабочийТелефон As String
 +
 + 
 +
 +    ' Получение объекта приложения
 +
 +    Set oleapp = CreateObject("ByteEnterprise.OleApplication")
 +
 +    ' Инициализации приложения, в качестве параметров передаются имя сервера, название базы,  версия продукта
 +
 +    Set client_app = oleapp.ЗапуститьКлиентскоеПриложение("ИмяСервера", "ИмяБазы", "РедакцияПрограммы")
 +
 +       
 +
 +    ' Получение корневой группы класса Физлиц
 +
 +    Set ОПУ_ФЛ = oleapp.ПолучитьКорневуюГруппуКласса("БизнесМодель.ФизЛица")
 +
 +    ' Получение корневой группы класса Контактов физлиц
 +
 +    Set ОПУ_Контакты = oleapp.ПолучитьКорневуюГруппуКласса("БизнесМодель.КонтактыФизЛиц")
 +
 +   
 +
 +    ' Получение корневой группы класса Типов контактов
 +
 +    Set списокТипов = oleapp.ПолучитьОбъекты("БизнесМодель.ТипыКонтактов", "Название", "Рабочий телефон")
 +
 +    Set типРабочийТелефон = списокТипов.ПолучитьЭлемент(0)
 +
 + 
 +
 +    i = 2
 +
 +    While appEx.Cells(i, 1) <> ""
 +
 +        Фамилия = CStr(appEx.Cells(i, 1))
 +
 +        Имя = CStr(appEx.Cells(i, 2))
 +
 +        Отчество = CStr(appEx.Cells(i, 3))
 +
 +        ДатаРождения = CStr(appEx.Cells(i, 4))
 +
 +        РабочийТелефон = CStr(appEx.Cells(i, 5))
 +
 +        ЭлектроннаяПочта = CStr(appEx.Cells(i, 6))
 +
 +       
 +
 +        ' Создание фильтра по классу Физлиц
 +
 +        Set фильтрФЛ = ОПУ_ФЛ.СоздатьФильтр
 +
 +        ' настраиваем условия фильтра для поиска по Фамилии, Имени, Отчеству, Дате рождения
 +
 +        фильтрФЛ.Условия.Параметры.Фамилия.Значение = Фамилия
 +
 +        фильтрФЛ.Условия.Параметры.Имя.Значение = Имя
 +
 +        фильтрФЛ.Условия.Параметры.Отчество.Значение = Отчество
 +
 +        фильтрФЛ.Условия.Параметры.ДатаРождения.Значение = CDate(ДатаРождения)
 +
 +        ' выполняем фильтр - получаем список физлиц с заданными Фамилией, Именем, Отчеством, Датой рождения
 +
 +        Set списокФЛ = фильтрФЛ.Выполнить
 +
 +        ' получаем элемент Физлицо
 +
 +        If списокФЛ.КоличествоЭлементов = 0 Then
 +
 +            ' если физлицо не найдено - создаем новое
 +
 +            Set фл = oleapp.СоздатьОбъект(ОПУ_ФЛ)
 +
 +            фл.Фамилия = Фамилия
 +
 +            фл.Имя = Имя
 +
 +            фл.Отчество = Отчество
 +
 +            Set пар = фл.НайтиПараметр("ДатаРождения")
 +
 +            пар.Значение = CDate(ДатаРождения)
 +
 +        Else
 +
 +            ' если физлицо найдено - будем обновлять его данные
 +
 +            Set фл = списокФЛ.ПолучитьЭлемент(0)
 +
 +        End If
 +
 +        ' обновляем рабочий телефон физлица - элемент списка контаков
 +
 +        If РабочийТелефон <> "" Then
 +
 +            ' Создание фильтра по классу контактов Физлиц
 +
 +            Set ФильтрКонтакты = ОПУ_Контакты.СоздатьФильтр
 +
 +            ' настраиваем условия фильтра для поиска контакта физлица
 +
 +            ФильтрКонтакты.Условия.Параметры.ТипКонтакта.Значение = типРабочийТелефон
 +
 +            ' настраиваем подфильтр для задания условия по физлицу - владельцу контакта
 +
 +            ФильтрКонтакты.Условия.Параметры.Владелец.ТипФильтрации = 3 ' подфильтр
 +
 +            ФильтрКонтакты.Условия.Параметры.Владелец.Подфильтр = фильтрФЛ
 +
 +            ' выполняем фильтр - получаем список контактов с заданным условием
 +
 +            Set списокКонтактов = ФильтрКонтакты.Выполнить
 +
 +            If списокКонтактов.КоличествоЭлементов = 0 Then
 +
 +                ' если контакт не найден - создаем новый элемент в списке контактов физлица
 +
 +                Set конт = фл.Контакты.Добавить
 +
 +                конт.ТипКонтакта = типРабочийТелефон
 +
 +            Else
 +
 +                ' если контакт найден - будем обновлять его данные
 +
 +                Set конт = списокКонтактов.ПолучитьЭлемент(0)
 +
 +            End If
 +
 +            ' обновляем данные контакта
 +
 +            конт.Контакт = РабочийТелефон
 +
 +        End If
 +
 +        ' сохраняем изменения физлица
 +
 +        фл.Сохранить
 +
 +        i = i + 1
 +
 +    Wend
 +
 +End Sub
 +</code>
 +
 +===== Пример создания оргединицы и работа с ней =====
 +
 +<code>
 +Sub ДругиеПримеры()
 +
 +    Set oleapp = CreateObject("ByteEnterprise.OleApplication")
 +
 +    'Инициализации клиентского приложения, в качестве параметров передаются имя сервера, название базы, версия продукта
 +
 +    Set Client_app = oleapp.ЗапуститьКлиентскоеПриложение("ИмяСервера", "ИмяБазы", "РедакцияПрограммы")
 +
 + 
 +
 +    'Пример создания Оргединицы и работы с ней
 +
 +   Set СубъектКорень = oleapp.ПолучитьКорневуюГруппуКласса("БизнесМодель.Субъекты")
 +
 +   Set ВыбранныйСубъект = oleapp.ВыбратьОбъект(СубъектКорень)
 +
 +   Set НовыйСубъект = oleapp.СоздатьОбъект(ВыбранныйСубъект)
 +
 +    'Параметры "Название" и "ТипСубъекта" являются обязательными для субъектов
 +
 +   НовыйСубъект.Название = "НазваниеНовогоСубъекта"
 +
 +   НовыйСубъект.ТипСубъекта = 1    '1 - Подразделение; 2 - Должность (см. Объектную модель)
 +
 +   НовыйСубъект.Сохранить
 +
 + 
 +
 +  ‘Если названия субъектов повторяются - используем для идентификации guid
 +
 +    а = НовыйСубъект.GUID
 +
 +    Set ФильтрСубъектПоGUID = СубъектКорень.СоздатьФильтр
 +
 +    ФильтрСубъектПоGUID.Условия.Параметры.GUID.Значение = а
 +
 +    ФильтрСубъектПоGUID.ВключатьПодгруппы = True
 +
 +    Set РезультатФильтра = ФильтрСубъектПоGUID.Выполнить
 +
 +    If (РезультатФильтра.КоличествоЭлементов > 0) Then
 +
 +        Set СубъектПоGUID = РезультатФильтра.ПолучитьЭлемент(0)
 +
 +    Else
 +
 +     MsgBox "Субъект с guid='" + a + "' не найден."
 +
 +    End If
 +
 + 
 +
 +'Пример получения константы
 +
 +   Set конст = oleapp.ПолучитьКорневуюГруппуКласса("БизнесМодель.Константы")
 +
 +   Руководитель = конст.РуководительОрганизации
 +
 + 
 +
 +'Добавить Оргединицу в группу; для этого создать группу и связь
 +
 +    Set ГруппаПУ = oleapp.ПолучитьКорневуюГруппуКласса ("БизнесМодель.Группы")
 +
 +    Set Группа = oleapp.СоздатьОбъект(ГруппаПУ)
 +
 +    Группа.Название = "Группа_1"
 +
 +    Группа.Сохранить
 +
 +   Set СвязиГруппыАнализаПУ = oleapp.ПолучитьКорневуюГруппуКласса("БизнесМодель.СвязиГруппАнализа")
 +
 +    Set ОбъектСвязь = oleapp.СоздатьОбъект(СвязиГруппыАнализаПУ)
 +
 +    ОбъектСвязь.ГруппаАнализа = Группа
 +
 +    ОбъектСвязь.Справочник = ВыбранныйСубъект
 +
 +    ОбъектСвязь.Сохранить
 +
 + 
 +
 +'Обращение к пользовательскому параметру. Допустим пользовательский справочник "БизнесМодель.usr_Класс" содержит несколько записей.
 +
 +    Set Объект = oleapp.ПолучитьКорневуюГруппуКласса("БизнесМодель.usr_Класс")
 +
 +    Set Фильтр = Объект.СоздатьФильтр 
 +
 +    Set Объекты = Фильтр.Выполнить   ' Получаю весь справочник
 +
 +    col = Объекты.Count   ' - количество элементов в этом справочнике
 +
 +    Set Элемент = Объекты.Item(0) 'Или так: Set Элемент = Объекты.ПолучитьЭлемент(0)
 +
 +   'Класс содержит стандартный параметр "Название"
 +
 +    'Парам1 = Элемент.Название - так можно только для системых параметров
 +
 +    Парам1 = Элемент.Параметры.Item("Название").Значение
 +
 +    'Или так: Парам1 = Элемент.Параметры.ПолучитьЭлемент("Название").Значение
 +
 +   'Класс содержит пользовательский параметр "usr_полеКласса" простого типа (вещественный)
 +
 +    Парам2 = Элемент.Параметры.Item("usr_полеКласса").Значение
 +
 +    'Или так: Парам2 = Элемент.Параметры.ПолучитьЭлемент("usr_полеКласса").Значение
 +
 +   'Класс содержит параметр - список "usr_полеСпск" - для списка используем Set
 +
 +    Set Парам3 = Элемент.Параметры.Item("usr_полеСпск").Значение
 +
 +    'Или так: Set Парам3 = Элемент.Параметры.ПолучитьЭлемент("usr_полеСпск").Значение
 +
 +   'Элементы списка объектного типа, чтобы получить элемент используем Set
 +
 +    Set ЭлСписка = Парам3.Item(0)
 +
 +   'Элемент списка содержит параметр "usr_поле1" простого типа (строка)
 +
 +    ПЭС1 = ЭлСписка.Параметры.Item("usr_поле1").Значение
 +
 + 
 +
 +'Перебрать все параметры:
 +
 +    Параметры = "Параметры: "
 +
 +     For Each парам In Объект.Параметры
 +
 +        Параметры = Параметры + парам.Наименование + ", "
 +
 +     Next
 +
 + 
 +
 +'Назначить физическое лицо оргединице:
 +
 +    Set ФизЛица = oleapp.ПолучитьКорневуюГруппуКласса("БизнесМодель.ФизЛица")
 +
 +    Set ФизЛицаФильтр = ФизЛица.СоздатьФильтр
 +
 +    ФизЛицаФильтр.Условия.Параметры.Фамилия.Значение = "Гаврилова"
 +
 +    ФизЛицаФильтр.Условия.Параметры.Имя.Значение = "Анна"
 +
 +    ФизЛицаФильтр.Условия.Параметры.Отчество.Значение = "Петровна"
 +
 +    Set СписокФЛ = ФизЛицаФильтр.Выполнить
 +
 +   If (СписокФЛ.КоличествоЭлементов > 0) Then
 +
 +      Set ФЛ = СписокФЛ.ПолучитьЭлемент(0)
 +
 +      Set ФизлицаСубъектов = _
 +
 +      oleapp.ПолучитьКорневуюГруппуКласса("БизнесМодель.Физлица_Субъектов")
 +
 +      Set ФизЛицоСубъекта = oleapp.СоздатьОбъект(ФизлицаСубъектов)
 +
 +      ФизЛицоСубъекта.Субъект = ВыбранныйСубъект
 +
 +      ФизЛицоСубъекта.Физлицо = ФЛ
 +
 +      ФизЛицоСубъекта.Сохранить
 +
 +   Else
 +
 +     MsgBox "Запрашиваемое лицо не найдено"
 +
 +   End If
 +
 + 
 +
 +'Удалить физлицо из оргединицы:
 +
 +    Set ФильтрФизлицСубъектов = ФизлицаСубъектов.СоздатьФильтр
 +
 +    ФильтрФизлицСубъектов.Условия.Параметры.Физлицо.Значение = ФЛ
 +
 +    ФильтрФизлицСубъектов.Условия.Параметры.Субъект.Значение = ВыбранныйСубъект
 +
 +    Set СписокФизлицСубъектов = ФильтрФизлицСубъектов.Выполнить
 +
 +     For Each ФизЛицоСубъекта In СписокФизлицСубъектов
 +
 +         ФизЛицоСубъекта.Удалить
 +
 +     Next
 +
 + 
 +
 +'Получить правильное название класса, воспользовавшись окном выбора:
 +
 +    ИмяКласса = oleapp.ВыбратьКласс
 +
 + 
 +
 +End Sub
 +</code>
 +
 +===== Пример вывода сообщением всех потомков папок с первого уровня справочника Направления Деятельности =====
 +
 +<code>
 +
 +Sub ВыводПотомковПапок()
 +
 +    'Получение объекта приложения
 +    
 +    Set oleapp = CreateObject("ByteEnterprise.OleApplication")
 +
 +    'Инициализации приложения, в качестве параметров передаются имя сервера, название базы, версия продукта
 +    
 +    Set client_app = oleapp.ЗапуститьКлиентскоеПриложение("ИмяСервера", "ИмяБазы", "РедакцияПрограммы")
 +
 +    'Получаем только папки в корне
 +    
 +    Set Корень = oleapp.ПолучитьКорневуюГруппуКласса("БизнесМодель.НаправленияДеятельности")
 +    
 +    Set Фильтр = Корень.СоздатьФильтр
 +    
 +    Фильтр.ВключатьПодгруппы = False
 +    
 +    Фильтр.РезультатВключает = 9
 +    
 +    Set Папки = Фильтр.Выполнить
 +
 +    'Для каждой папки строим свой подфильтр
 +    
 +    For Счётчик = 1to Папки.КоличествоЭлементов
 +    
 +      Set Папка = Потомки.ПолучитьЭлемент(Счётчик)
 +      
 +      Set Фильтр2 = Папка.СоздатьФильтр
 +      
 +      Фильтр2.ВключатьПодгруппы = False
 +      
 +      Set Потомки = Фильтр2.Выполнить
 +      
 +      For Счётчик2 = 1 to Потомки
 +      
 +    'И выводим на экран
 +    
 +                Set Потомок = Потомки.ПолучитьЭлемент(Счётчик)
 +                
 +               MsgBox Потомок
 +               
 +     Next Счётчик2
 +     
 +Next Счётчик
 +
 +End Sub
 +
 +</code>
 +
 +====== Возможные сообщения об ошибках ======
 +
 +===== Невозможность соединения с удаленным сервером =====
 +
 +Одна из возможных причин, по которой может появиться сообщение вида "//Ошибка при обращении к службе брокера: Невозможно соединиться с удаленным сервером//", это отсутствие запущенной службы BS_PingHost на локальной машине (см. [[ru/technical_manual/work_via_ole]], а также [[ru/technical_manual/server_install/license_access]]).
 +
 +
 +
 +
 +
 +[<contextnavigator>]
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +{(rater>id=ru_technical_manual_work_via_ole_script_work_via_ole|name=Сценарии работы с Business Studio через OLE|type=vote|trace=ip|headline=off)}
Driven by DokuWiki