Данная статья продолжает цикл статей для начинающего разработчика на ISBL.
Предыдущие статьи:
В этой статье вы узнаете о всех интеграционных возможностях системы DIRECTUM, каким-образом работать с объектной моделью системы DIRECTUM извне и как из ISBL обращаться к внешним COM-объектам.
Как уже говорилось в статье Язык ISBL большим преимуществом языка ISBL является возможность работы с внешними COM-объектами. Для этого достаточно вызвать функцию CreateObject() и передать ей имя объекта.
Пример:
// Получить объект "1С: Предприятие 8.1" V81Application = CreateObject("V81.Application")
После этого с переменной V81Application можно работать как с объектом приложения «1С: Предприятия», вызывая его методы и свойства:
// Параметры подключения к системе «1С: Предприятие 8.1» ConnectionParams = “File=D:\1c81\DB;Usr=User1;Pwd=12345” // Выполнить подключение к системе «1С: Предприятие 8.1» V81Application.Connect(ConnectionParams)
Если же внешняя система не поддерживает технологию COM, то из DIRECTUM можно обращаться к функциям библиотек dll или вызывать внешнее приложение с указанием параметров командной строки.
Пример запуска командной строки:
// Запустить файл в "блокноте" ExecuteProcess("C:\Windows\notepad.exe C:\Readme.txt")
С объектами IS-Builder тоже можно работать из внешних языков и сред, поддерживающих технологию COM.
Для доступа к DIRECTUM используются 2 библиотеки:
Общая схема подключения к DIRECTUM извне выглядит так:
Пример, как из 1С можно открыть карточку записи справочника DIRECTUM «Программное обеспечение» (данный справочник рассматривался в статье Разработка справочников в DIRECTUM):
// Создать подключение к системе DIRECTUM LoginPoint = GetCOMObject("", "SBLogon.LoginPoint"); DirectumApplication = LoginPoint.GetApplication("SystemCode=DIRECTUM"); // Открыть запись справочника «Программное обеспечение» с ИД = 108729 (это запись "1С: Предприятие 8.1") Software = DirectumApplication.ReferencesFactory.ReferenceFactory("Software").GetObjectByID(108729) Software.Form.ShowNoModal
Если из внешней системы нельзя работать с COM-объектами, то существует возможность вызова компонент системы DIRECTUM (сценарии, отчеты и т.д.) через командную строку.
Весь этот функционал дает возможность интегрироваться системе DIRECTUM с другими системами.
Возможны следующие виды интеграции:
Для реализации этих возможностей можно воспользоваться набором средств интеграции DIRECTUM, который представляет собой инфраструктуру и набор готовых решений для интеграции с определенными системами сторонних производителей, например, с 1С:Предприятие, Dynamics AX и т.д.
В статье Настройка типовых маршрутов. Часть 2 рассматривали типовой маршрут «Согласование запроса на назначение прав доступа», в котором есть блок - задание администратору на создание пользователей в других системах.
Сейчас администратору при получении задания приходится заходить в необходимую систему, создавать там нового пользователя, заполнять его данные и выдавать права.
Этот процесс можно автоматизировать. Например, создавать пользователя в другой системе и заполнять некоторые данные автоматически.
Рассмотрим пример создания пользователя в системе 1С: Предприятие:
Добавим в карточке справочника «Права доступа работников на ПО» кнопку «Создать пользователя в 1С», при нажатии на которую будет создаваться новый пользователь в системе «1С: Предприятие» и открываться его карточка с заполненными полями «Краткое имя» и «Полное имя».
Тогда, когда администратору приходит задание для создания пользователя в других системах, он открывает из вложения запись справочника «Права доступа работников на ПО» и нажимает кнопку «Создать пользователя в 1С».
Такую кнопку можно сделать для создания пользователя в любой системе.
Итак, чтобы создать кнопку, откроем компоненту «Типы справочников». Найдем тип справочника «Права доступа работников на ПО» и откроем его карточку. В табличной части на закладке «Действия» добавим новую строку. Заполним имя и заголовок:
Теперь нужно задать вычисление этого действия.
Создание пользователя в 1С будет состоять из следующих этапов:
Рассмотрим каждый из этих этапов.
Запрос параметров подключения к базе данных системы 1С.
Для запроса параметров подключения используется функция InputDialogEx(), которая позволяет выдать диалог пользователю для ввода необходимых параметров:
BASE_PATH_AUTH_INDEX = 1 WINDOWS_AUTH_INDEX = 2 USER_NAME_INDEX = 3 PASSWORD_INDEX = 4 BUTTON_INDEX = 5 AUTHORIZATION_DELIMITER = "|" // Запросить пользователя 1С CaptionStr = LoadString('DIR6BFA9D8B_292B_4826_BEBE_57F956E92098'; 'COMMON') // Авторизация в системе 1С:Предприятие BasePathStr = "Каталог информационной базы 1С" WindowsAuthenticationStr = LoadString('DIRCCF42975_585F_4367_A20E_1B7764A7BD43'; 'COMMON') // Использовать windows-аутентификацию UserNameStr = LoadString('DIRF9F460C1_F1BC_4ACC_8D6B_9B4A9028EE5F'; 'COMMON') // Имя пользователя PasswordStr = LoadString('DIRC6964660_1084_4E06_AEA9_A380EA12F84A'; 'COMMON') // Пароль OKButtonStr = LoadString('DIRSTR_OK'; 'COMMON') // ОК CancelButtonStr = LoadString('DIRSTR_CANCEL_1'; 'COMMON') // Отмена // Запрос имени пользователя и пароля Buttons = Format("%s|%s"; ArrayOf(OKButtonStr; CancelButtonStr)) Labels = Format("*%s|%s|%s|%s"; ArrayOf(BasePathStr; WindowsAuthenticationStr; UserNameStr; PasswordStr)) Types = "Строка:100|Признак:Да,Нет:Ч|Строка:35|Строка:35" DefaultValues = Format("|%s||"; IfThen(Application.Connection.OSAuthentification; YES_VALUE; NO_VALUE)) AuthorizationResult = InputDialogEx(Labels; DefaultValues; Types; CaptionStr; ; ; ; Buttons; OKButtonStr; CancelButtonStr) BasePath = SubString(AuthorizationResult; AUTHORIZATION_DELIMITER; BASE_PATH_AUTH_INDEX) WindowsAuth = SubString(AuthorizationResult; AUTHORIZATION_DELIMITER; WINDOWS_AUTH_INDEX) UserName = SubString(AuthorizationResult; AUTHORIZATION_DELIMITER; USER_NAME_INDEX) Password = SubString(AuthorizationResult; AUTHORIZATION_DELIMITER; PASSWORD_INDEX) ButtonResult = SubString(AuthorizationResult; AUTHORIZATION_DELIMITER; BUTTON_INDEX)
Диалог будет выглядеть следующим образом:
Подключение к базе данных системы 1С.
Для подключения к 1С создается соответствующий COM-объект:
CONNECTION_PARAMS_DELIMITER = ";" ConnectionParams = Format("File=%s"; BasePath) if WindowsAuth == NO_VALUE ConnectionParams = AddSubString(Format("Usr=%s;Pwd=%s"; ArrayOf(UserName; Password)); ConnectionParams; CONNECTION_PARAMS_DELIMITER) endif // Подключиться к системе 1С: Предприятие V81App = CreateObject("V81.Application") V81App.Connect(ConnectionParams)
Создание нового пользователя и заполнение необходимых реквизитов.
// Создать нового пользователя UsersRef = V81App.Catalogs.Пользователи NewUser = UsersRef.CreateItem() // Заполнить поле "Краткое имя" значением поля "Логин" записи справочника Права доступа работников на ПО NewUser.Код = Object.Реквизит // Заполнить поле "Полное имя" значением поля "Фамилия И.О." работника NewUser.Наименование = GetRequisiteValueAsString("РАБ"; Object.Работник; "Дополнение")
Открытие карточки созданного пользователя.
NewUser.GetForm().DoModal()
После этого добавляем новую кнопку на форму:
Теперь при нажатии на кнопку «Создать пользователя в 1С» будет создаваться пользователь в системе 1С и открываться его карточка, чтобы администратор мог назначить ему необходимые права в системе:
Пакет разработки для Directum версии 4.7 прилагается:Dev.zip (18,49 Кб)
Пакет разработки для Directum версии 5.1: dev.zip (19,16 Кб)
Алексей, если вы не против, внесу небольшую лепту в тему.
В своё время - не без помощи саппорта - я делал обращение в БД Oracle.
Весьма успешно.
Вот пример:
УРА!
получилось, спасибо за подсказку - OLEDB рулит !!!
может кому пригодится пример работы с MS SQL
Provider = 'SQLOLEDB.1'
User = 'user'
Pass = 'password'
DBName = 'KronosNET2' // сторонняя база - относится к совершенно другой системе
Server = 'Directum'
QUERY="select * from ObjectSignal_2014_01_08" // тестовый запрос к таблице
ADOCnn=CreateObject('ADODB.Connection')
ADOCnn.ConnectionString = 'Provider='&Provider&' ;Password='&Pass&';User ID='&User&' ;Initial Catalog='&DBName&' ;Data Source='&Server&';Persist Security Info=False'
ADOCnn.Open
ADOCom = CreateObject('ADODB.Command')
ADOCom.ActiveConnection = ADOCnn
ADOCom.CommandType = 1
ADOCom.CommandText = QUERY
ADOCom.Parameters.Refresh
DataSet = ADOCom.Execute
если есть желание вызвать хранимую процедуру, то
CommandType = 4
CommandText = "testStoredProcedure
жаль что с DataSet дальше нельзя работать как с полноценным recordset, а так прям Visual Basic какой-то :)
Здравствуйте, подскажите пожалуйста где узнать параметр для функции CreateObject("....Application") для 1С?
Добрый день. Прошу помощи со сценарием интеграции с 1С.
Сценарий работает, выполняет свою функцию (создает бригаду), но зависает и приводит к зависанию системы Директум. Что я делаю не так?
V8App = CreateObject("V83.Application")
V8App.Connect("Srvr='server';Ref='base';Usr='Администратор';Pwd='пароль'")
V8App.Visible = False
// Создать новую бригаду
Организация=V8App.Справочники.Организации.НайтиПоКоду("000000001")
Бригада = V8App.Справочники.Бригады.СоздатьЭлемент()
Бригада.Владелец = Организация
Бригада.Наименование = "Тест1"
Бригада.Записать()
V8App = nil
2 Андрей Гец
На какой строке висит? На последней? По Alt+Tab'у есть окошки 1С?
Могу предположить, что висит с вопросом о закрытии приложения.
Как раз эта настройка есть на последнем скриншоте статьи. Называется "Запрашивать подтверждение при закрытии программы", надо её отключить.
А зачем "V8App.Visible = False"? Оно такое по умолчанию.
И тогда уж лучше использовать объект "V83.COMConnector" вместо "V83.Application". Он как раз для невизуальной работы с 1С.
Иван, спасибо за ответ. Не совсем понял, где последний скриншот статьи с настройкой. Да, действительно, дело в вопросе о закрытии программы, хотя окошко такое не выводится.
Сейчас буду спрашивать нашего 1с-разработчика как его не выводить (вариант настроить в программе не подойдет скорее всего, ну только если на крайний случай).
Попробовал использовать COMConnector, в моем случае выдало ошибку "Method 'Справочники' not supported by automation object (наверное, код надо по-другому писать). Ну и ладно, разберемся с Application и в путь!
Андрей, создайте в конфигурации 1С общий модуль, назовите его к примеру DIRECTUM, назначить свойства модулю: внешнее соединение (для подключения извне), сервер, клиент (обычное приложение) / что даст возможность тестировать из 1С.
В этом общем модуле создайте экспортную процедуру или функцию и вызывайте ее через 1С 8 Comconnector? передавая в нее параметры из скрипта Директума. По факту отработки функции в 1С можно вернуть результат ( в виде например строки "ОК" или тест ошибки, если таковая возникнет в модуле 1С при исполнении.
Вот пример функции для регистрации изменений объекта в 1С
&наСервере
Функция ЗарегистрироватьИзмененияНаУзле(Код = "DIR", Ссылка, Справочник) Экспорт
// проверки на всякий случай!
Если Ссылка = Неопределено тогда
возврат "No";
КонецЕсли;
Если Справочник = Неопределено тогда
возврат "No";
КонецЕсли;
Если СокрЛП(Ссылка) = "" или СокрЛП(Ссылка) = "00000000-0000-0000-0000-000000000000" тогда
возврат "No";
КонецЕсли;
Если СокрЛП(Справочник) = "" тогда
возврат "No";
КонецЕсли;
//////////////////////////
Попытка
Узел =ПланыОбмена.DIRECTUM.НайтиПоКоду(Код);
УИД = Новый УникальныйИдентификатор(СОКРЛП(Ссылка));
Данные = Справочники[Справочник].ПолучитьСсылку(УИД);
Если СокрЛП(Данные.Код) = "" тогда
Возврат "False";
Конецесли;
ПланыОбмена.ЗарегистрироватьИзменения(Узел, Данные);
Возврат "Ok";
Исключение
Возврат "Error";
Конецпопытки;
КонецФункции
//***************************
А вот пример вызова функции из скрипта Директум, вызываемого в коннекторе в процедуре обмена даными по справочнику ТМЦ
//#using V8App
// V8App - соединение c 1C на основе V8Comconnector
.....
Ок = V8App.DIRECTUM.ЗарегистрироватьИзмененияНаУзле("DIR"; Trim('[Ref]'); "Номенклатура")
Добрый день. А можно ли как-то указать в DIRECTUM какую платформу 1С запускать? Если у клиента установлены две платформы, то DIRECTUM берет по умолчанию старшую, а необходимо, чтобы он подключался к предыдущей, т.к. на сервере версия платформы еще не обновлена.
Авторизуйтесь, чтобы написать комментарий