Интеграция DIRECTUM со сторонними системами

11 8

Данная статья продолжает цикл статей для начинающего разработчика на ISBL.

Предыдущие статьи:

  1. Общие сведения о разработке на IS-Builder
  2. Язык ISBL
  3. Типовые варианты использования функций ISBL
  4. Основы работы с объектной моделью IS-Builder
  5. Разработка на ISBL. Постановка задачи
  6. Разработка справочников в Directum
  7. Работа с наборами данных справочников
  8. Разработка новых типов карточек электронных документов
  9. Поиски EDMS-объектов (документов, задач, заданий, папок, вариантов запуска)
  10. Разработка сценариев
  11. Разработка отчетов
  12. Настройка типовых маршрутов
  13. Настройка типовых маршрутов. Часть 2.

В этой статье вы узнаете о всех интеграционных возможностях системы 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 библиотеки:

  • SBLogon Library. Используется для аутентификации и подключения к DIRECTUM;
  • Sbrte Library. Реализует все объекты DIRECTUM.

Общая схема подключения к DIRECTUM извне выглядит так:

  • Создаем объект SBlogon.LoginPoint.
  • Получаем объект IApplication, вызвав метод GetApplication или GetApplicationEx объекта SBlogon.LoginPoint.

Пример, как из 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 с другими системами.

Возможны следующие виды интеграции:

  • синхронизация справочников. Справочники заполняются в одной системе, затем синхронизируются в другую систему. Варианты реализации могут быть следующие:
    • периодическая синхронизация;
    • синхронизация при сохранении записи (realtime-синхронизация);
  • сохранение отчетов в качестве электронных документов DIRECTUM.
  • связывание записей справочников/учетных документов и электронных документов DIRECTUM для облегчения поиска.
  • отправка записей справочников/учетных документов как вложения в задачи DIRECTUM.

Для реализации этих возможностей можно воспользоваться набором средств интеграции DIRECTUM, который представляет собой инфраструктуру и набор готовых решений для интеграции с определенными системами сторонних производителей, например, с 1С:Предприятие, Dynamics AX и т.д.

Практика

В статье Настройка типовых маршрутов. Часть 2 рассматривали типовой маршрут «Согласование запроса на назначение прав доступа», в котором есть блок - задание администратору на создание пользователей в других системах.

Сейчас администратору при получении задания приходится заходить в необходимую систему, создавать там нового пользователя, заполнять его данные и выдавать права.

Этот процесс можно автоматизировать. Например, создавать пользователя в другой системе и заполнять некоторые данные автоматически.

Рассмотрим пример создания пользователя в системе 1С: Предприятие:

Добавим в карточке справочника «Права доступа работников на ПО» кнопку «Создать пользователя в 1С», при нажатии на которую будет создаваться новый пользователь в системе «1С: Предприятие» и открываться его карточка с заполненными полями «Краткое имя» и «Полное имя».

Тогда, когда администратору приходит задание для создания пользователя в других системах, он открывает из вложения запись справочника «Права доступа работников на ПО» и нажимает кнопку «Создать пользователя в 1С».

Такую кнопку можно сделать для создания пользователя в любой системе.

Итак, чтобы создать кнопку, откроем компоненту «Типы справочников». Найдем тип справочника «Права доступа работников на ПО» и откроем его карточку. В табличной части на закладке «Действия» добавим новую строку. Заполним имя и заголовок:

Теперь нужно задать вычисление этого действия.

Создание пользователя в 1С будет состоять из следующих этапов:

  1. Запрос параметров подключения к базе данных системы 1С.
  2. Подключение к базе данных системы 1С.
  3. Создание нового пользователя и заполнение необходимых реквизитов.
  4. Открытие карточки этого пользователя.

Рассмотрим каждый из этих этапов.

Запрос параметров подключения к базе данных системы 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.

Весьма успешно.

Вот пример:

Login = 'user'     // Имя пользователя
Passw = 'password'     // Пароль пользователя
DataSource = 'scheme'  // Источник данных 
Provider = 'MSDAORA.1'   // имя драйвера провайдера Oracle
ADOConnect = CreateObject('ADODB.Connection')
ADOConnect.ConnectionString = 'Provider='&Provider&' ;Password='&Passw&';User ID='&Login&' ;Data Source='&DataSource&';Persist Security Info=False'
ADOConnect.Open
ADOCom = CreateObject('ADODB.Command')
ADOCom.ActiveConnection = ADOConnect 
Query = "SELECT Field1.Table1, Field2.Table1, Field1.Table2, Field2.Table2 FROM Table1 Table2 WHERE (Field1.Table1 = Field1.Table2)" //обезличенный запрос
ADOCom.CommandText = Query
DataSet = ADOCom.Execute

//пример перебора добытых данных
while not DataSet.EOF
     // Получить значения реквизитов
      First = DataSet.Fields.Item(0).Value  //!с 0 нумерация!
      Second = DataSet.Fields.Item(1).Value
      Third = DataSet.Fields.Item(2).Value
      Fourth = DataSet.Fields.Item(3).Value
DataSet.MoveNext()
ANSWER = ANSWER & CR & First & CR & Second & CR & Third & CR & Fourth & CR & CR
endwhile

//закрытие объекта
ADOConnect.Close
ADOCom = nil
ADOConnect = nil

//вывод результата в форму редактора
EditText(ANSWER)

 

Алексей Пестов
NewUser.Код = Trim(Object.Реквизит) //так как по правому краю :)

 

Алексей Сиднев

УРА!

получилось, спасибо за подсказку - 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

Иван Батырев

Андрей Гец

На какой строке висит? На последней? По 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]'); "Номенклатура")

 

Авторизуйтесь, чтобы написать комментарий