Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
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)} |