четверг, 29 марта 2012 г.

О подключении и работе с DocsVision из VBA приложений

Данный код позволяет подключиться к серверу DocsVision и работать с ним из VBA приложений (Outlook, Word, Excel и т.п.). Чтобы код работал необходимо в редакторе Visual Basic через меню Tools->References подключить следующие библиотеки:
DocsVision 4.5 Card Host
DocsVision 4.5 Navigator
DocsVision 4.5 Object Manager

'Строка подключения к серверу DocsVision. Ее берем из консоли настройки. Лучше, если подключаться будем по named pipe. Тогда в домене нам не потребуется вводить  аутентификационные данные.
Const ConnectString = "\\ServerName\Pipe\DocsVision45\StorageServer"

Dim oSession As UserSession
Dim Manager As New SessionManager
Dim oCard As CardData
Dim Navigator As INavigatorHost2
Dim host As ICardHost


'Подключаемся к серверу
Manager.Connect ConnectString
' Создаем сессию
Set oSession = Manager.CreateSession
' Получаем объект навигатор
Set Navigator = CreateObject("DVNavigator.NavigatorControl")
' Получаем объект CardHost

Set host = Navigator.CreateHost(oSession)


Так как получены основные объекты DocsVision теперь можно с ним работать. Единственное, что недоступно, так это свойства созданной (полученной) карточки документа. То есть нельзя получить и соответственно изменить свойства карточки документа.

понедельник, 26 марта 2012 г.

Получение типа карточки по ИД ее вида

' Функция возвращает тип карточки по ИД вида.
' UserSession - сессия пользователя
' DocsViewID - ИД вида документа
Function GetDocTypeByDocView(UserSession, DocsViewID)
Const ID_TYPESCARD = "{BE14D55D-92B7-4345-AD10-32588981F83D}"
  GetDocTypeByDocView = -1 'Вид документа по-умолчанию. Для возвращаемого значения, если не будет найден вид документа с ИД  DocsViewID
' Получение карточки справочник типов
Set oTypesCard = UserSession.CardManager.DictionaryData(ID_TYPESCARD)
' Получение секции Типы документов справочника типов
Set oSectDocType = oTypesCard.Sections(oTypesCard.Type.AllSections.GetByAlias("DocumentTypes").ID)
' Перебор всех видов документов для поиска необходимого. Можно, наверное, для этого воспользоваться поиском, то есть функцией FindRow.
For Each Row In oSectDocType.AllRows
   If Row.Value("RowID") = DocsViewID Then
      GetDocTypeByDocView = Row.Value("DocumentType")
      Exit Function
   End If
Next
End Function

Добавление в секцию файлы карточки 'Список файлов' файла

'Данная процедура добавляет в секцию файлы карточки 'Список файлов' файл.
'Параметры процедуры:
' UserSession - сессия пользователя
' FileName - полное имя файла.
' ShortFileName - краткое имя файла
'  SectionFilesOfCardFilesList - секция файлы карточки Список файлов
Sub AddFileInSectionFiles(UserSession, FileName, ShortFileName, SectionFilesOfCardFilesList)
On Error Resume Next
Const ID_FILESLISTCARD = "{BFC9D190-BCD6-411A-B9F9-3160D3F68819}" ' ИД схемы карточки список файлов
Const ID_FILECARD = "{2BBD0A41-265E-4FF8-82D6-C6342F34B1AF}" ' ИД схемы карточки файла
Const ID_VFILECARD = "{6E39AD2B-E930-4D20-AAFA-C2ECF812C2B3}" ' ИД схемы карточки файла с версиями

'Загружаем файл
Set File = UserSession.FileManager.CreateFile(ShortFileName)
File.Upload FileName

' Создаем карточку файла
Set oCardFile = UserSession.CardManager.CreateCardData(ID_FILECARD)
' Создаем карточку файла с версиями
Set oCardFileVers = UserSession.CardManager.CreateCardData(ID_VFILECARD)
' Получаем строку основной секции карточки файла
Set RowCardFile = oCardFile.Sections(oCardFile.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
' Получаем строку основной секции карточки файла с версиями
Set RowCardFileVers = oCardFileVers.Sections(oCardFileVers.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
' Получаем секцию Versions карточки файла с версиями
Set SectVersCardFileVers = oCardFileVers.Sections(oCardFileVers.Type.Sections.GetByAlias("Versions").ID)
' Добавляем новую строку в секцию Versions карточки файла с версиями
Set NewRowFileVers = SectVersCardFileVers.Rows.AddNew
' Заполняем поля новой строки cекции Versions значениями
NewRowFileVers.Value("FileID") = File.ID
NewRowFileVers.Value("Version") = 0
NewRowFileVers.Value("VersionNumber") = 1
curuser = GetCurrentUser(UserSession)
If curuser="" Then Exit sub
NewRowFileVers.Value("AuthorID") = curuser

' Заполняем поля строки основной секции карточки файла с версиями значениями
RowCardFileVers.Value("CurrentID") = NewRowFileVers.ID
RowCardFileVers.Value("Name") = ShortFileName
RowCardFileVers.Value("NextVersion") = 1
' Заполняем поле FileID строки основной секции карточки файла ИД карточки файла с версиями
RowCardFile.Value("FileID") = oCardFileVers.ID

' Добавляем новую строку в секцию Ссылки на файлы карточки список файлов
Set NewRow = SectionFilesOfCardFilesList.Rows.AddNew
' Заполняем поле CardFileID новой строки ИД карточки файла
NewRow.Value("CardFileID") = oCardFile.ID
End Sub

'Функция получает текущего пользователя по аккаунту
Function GetCurrentUser(UserSession)  
' ИД схемы справочника сотрудников
   Const DIC_STAFF = "{6710B92A-E148-4363-8A6F-1AA0EB18936C}"
   Dim Groups, oRows, FindUserID
   GetCurrentUser=""

   Set RefStaff = UserSession.CardManager.DictionaryData(DIC_STAFF)
   If RefStaff Is Nothing Then
      msgbox "Ошибка получения справочника сотрудников. За помощью обратитесь к администратору."
      Exit Function
   End If

   Set SectionEmployeesRefStaff = RefStaff.Sections(RefStaff.Type.AllSections.GetByAlias("Employees").ID)
   Set oRows = SectionEmployeesRefStaff.FindRows("<ConditionGroup><Condition><Field>AccountName</Field><Op>STREQ</Op><Value>'" & UserSession.Properties("AccountName") & "'</Value></Condition></ConditionGroup>")

    Set oUser=oRows.Item(0)

    GetCurrentUser = oUser.ID
End Function

О копировании значений полей (свойств) из одной карточки в свойства другой при создании ее из первой

   Нередко встает необходимость создать одну карточку из другой по кнопке и передать значения полей (свойств) из первой в свойства второй карточки  при ее создании. При этом в коде  первой карточки при создании второй не получается получить свойства карточки, которая создается. Если взять коллекцию строк из секции Properties этой карточки и получить количество строк, то увидим 0. Чтобы все-таки сделать так как  нам необходимо, надо в поле ParentCardID второй карточки при ее создании(из первой) прописать ИД первой карточки. А в событии открытия второй карточки получить данные (значения полей и свойств) первой (по ParentCardID) и скопировать их в необходимые нам свойства.

пятница, 16 марта 2012 г.

Добавление в письмо OutLook файлов в виде вложений

'Функция  AddFilesToLetter добавляет в письмо OutLook (применяется объектная модель Outlook) вложенные файлы из карточки в виде вложений

'UserSession - сессия пользователя
'CardData - объект данные карточки
'oMessage - объект типа MailItem из объектной модели Outlook

' Функция добавления в письмо файлов в виде вложений.
 Sub AddFilesToLetter(UserSession, CardData, oMessage)

' Создаем объект Scripting.FileSystemObject для получения временной папки
   Set oDiskSystem = CreateObject("Scripting.FileSystemObject")
' Получаем временную папку
   oTempFolder = oDiskSystem.GetSpecialFolder (2)

'Создаем объект вложения
   Set oMesAttach = oMessage.Attachments

   Set oFileListSection = GetFileListSection(UserSession, CardData)

'Получаем количество строк секции Файлы карточки Список файлов
   filesCount = oFileListSection.Rows.Count

   i = 0
'Заполняем письмо вложениями из карточки документа
   while i < filesCount
      oFileCardID = oFileListSection.Rows(i).Value("CardFileID")
      Set oFileCard = UserSession.CardManager.CardData(oFileCardID)
      oFileVersID = oFileCard.Sections(oFileCard.Type.Sections.GetByAlias("MainInfo").ID).FirstRow.Value("FileID")
      FileName = oFileCard.Sections(oFileCard.Type.Sections.GetByAlias("MainInfo").ID).FirstRow.Value("FileName")

      set oFileVersCard = UserSession.CardManager.CardData(oFileVersID)

      CurrentVersionID = oFileVersCard.Sections(oFileVersCard.Type.Sections.GetByAlias("MainInfo").ID).FirstRow.Value("CurrentID")
      FileID = oFileVersCard.Sections(oFileVersCard.Type.Sections.GetByalias("Versions").ID).GetRow(CurrentVersionID).Value("FileID")

      set oFile = UserSession.FileManager.File(FileID)

      FilePath = oTempFolder & "\" & FileName

      oFile.Download FilePath
      oMesAttach.Add FilePath

      oDiskSystem.DeleteFile FilePath
      i = i+1
   wEnd
End sub


'Функция для получения секции Файлы из карточки Список Файлов текущей карточки
Function GetFileListSection(UserSession, CardData)
' Получаем ID карточки Список Файлов по FilesID основной секции карточки исходящего
   oFilesID = CardData.Sections(CardData.Type.Sections.GetByAlias("MainInfo").ID).FirstRow.Value("FilesID")

' Получаем карточку Список Файлов по oFilesID
   Set oFileList = UserSession.CardManager.CardData(oFilesID)
' Получаем секцию Файлы из карточки Список Файлов
   Set GetFileListSection=oFileList.Sections(ID_SectionRefFiles)
End Function

четверг, 15 марта 2012 г.

Получение значения поля Value свойства карточки в скрипте карточки

Функция GetProp получает значение поля Value свойства Alias карточки CardData. DefautValue  - это значение, которое возвращает функция GetProp, если свойства нет или значение поля свойства есть null. Свойство может быть любым объектом в системе (внутри это строка данных). Тип значения обычно может быть:
- строкой
- целым
- булевым

Параметры функции GetProp:
 CardData - объект данных карточки
Alias - имя получаемого свойства типа строка
FieldsName - Имя поля строки, значение которого нам необходимо
 DefaultValue - значение по умолчанию в случае, если получаемого свойства в карточке нет или значение поля Value свойства равно null.


' Получение значения свойства
Function GetProp(CardData, Alias, FieldsName, DefaultValue)
 Dim Row


 Set oProp = CardData.Sections(CardData.Type.AllSections.GetByAlias("Properties").ID)
 Set Row=oProp.FindRow("@Name='" & Alias & "'")


 If Row Is Nothing Then
  GetProp = DefaultValue
 Else
  GetProp = Row.Value(FieldsName)
  If IsNull(GetProp) Then GetProp = DefaultValue
 End If
End Function


вторник, 13 марта 2012 г.

Получение ИД организации контрагента по ИД сотрудника

Параметры функции  GetOrgIDByEmplID:
EmplID - ID сотрудника организации
RefContrAgent - объект справочник контрагентов
UserSession - Объект сессия пользователя

Function GetOrgIDByEmplID(UserSession, EmplID, RefContrAgent)
   GetOrgIDByEmplID=null
   If RefContrAgent Is Nothing Then
      Exit Function
   End If
   Set SectionEmployees=RefContrAgent.Sections(RefContrAgent.Type.AllSections.GetByAlias("Employees").ID)
   If SectionEmployees.RowExists(EmplID)=False Then
      Exit Function
   End If
   Set RowEmployee = SectionEmployees.GetRow(EmplID)
   If RowEmployee Is Nothing Then
     Exit Function
   End If
   GetOrgIDByEmplID=RowEmployee.Value("ParentRowID")
End Function

EmplID - ID сотрудника организации
RefContrAgent - объект справочник контрагентов 

четверг, 8 марта 2012 г.

Получение строк сотрудников из секции Исполнители карточки задания БП

Функция  Execute пробегает по коллекции oCardsColl (задания БП) и добавляет в коллекцию  PerformersVar (ИД сотрудников (для удаления ярлыков)) идентификаторы сотрудников исполнителей заданий БП



// подключение системных библиотек
using System;
using System.Xml;

// подключение библиотек СУБП
using DocsVision.Workflow.Objects;
using DocsVision.Workflow.Runtime;
using DocsVision.Workflow.Gates;
using DocsVision.Platform.HelperAPI;

namespace DVScriptHost
{
class DVScript
{
// стандартная функция, которая будет вызвана подсистемой СУБП
//
// входные параметры функции:
//
// process - информация о процессе. содержит коллекции
// Gates - коллекция шлюзов процесса
// Variables - коллекция переменных процесса
// passInfo - информация о текущем проходе
//
public void Execute(ProcessInfo process, PassState passInfo)
{
try
{

    ProcessVariable oCardsColl = process.GetVariableByName("Задания процессов");
    ProcessVariable PerformersVar = process.GetVariableByName("ИД сотрудников (для удаления ярлыков)");

   PerformersVar.Values.Clear();
   int iCount = oCardsColl.Values.Count;
   for (int i = 1; i <= iCount; i++)
  {
      DVCard oCard = (DVCard)oCardsColl.Values[i].Value;

      DVCardSection Section_Performers = (DVCardSection)oCard.GetSectionByAlias("Performers");
      DVCardRows Performers = (DVCardRows)Section_Performers.Rows;
      for (int j=0; j< Performers.Count; j++)
      {
         PerformersVar.Values.AddNew(((DVCardRow)Performers[j]).Value["PerformerID"]);
      }
   }
   process.LogMessage ("Значение переменной изменено");
}
catch (Exception ex)
{
// запись в журнал ошибки исполнения
process.LogMessage("Ошибка выполнения скрипта:" + ex.Message);
}
return;
}
}
}

Функция рекурсивного обхода подпапок родительской папки в бизнес-процессе DocsVision

Функция рекурсивного обхода подпапок родительской папки в бизнес-процессе DocsVision:

public void recursfolder(DVFolder dv_folder, ProcessInfo process)
{
   DVFolders dv_folders = dv_folder.Folders;
   DVFolder dv_curfolder;

   for (int i=0; i<dv_folders.Count; i++)
   {
      dv_curfolder = (DVFolder)dv_folders[i];
      if (dv_curfolder.Folders.Count>0)
     {
         process.LogMessage(dv_curfolder.DisplayValue.ToString());  //Что-то делаем с папкой
         recursfolder(dv_curfolder, process);       
     }
     else
        process.LogMessage(dv_curfolder.DisplayValue.ToString());  //Что-то делаем с папкой
   }
}

Эту функцию необходимо вызвать из другой функции с соответствующими параметрами (dv_folder типа DVFolder, process типа ProcessInfo)