пятница, 4 сентября 2020 г.

Добавление обработчика MainFileAdded (обработчик на событие после добавления основного файла)

 FilesViewWithPreview filesViewWithPreview = documentCardControl.FilesViewWithPreview;

filesViewWithPreview.MainFileAdded+= new EventHandler<DocsVision.BackOffice.ObjectModel.Services.Entities.DocumentMainFileEventArgs> (AfterMainFileAdded);

Сам обработчик:

private void AfterMainFileAdded(object sender, DocumentMainFileEventArgs e)

{

.......

}

вторник, 14 апреля 2020 г.

Как заполнить поле Сотрудник (Employee) текущим пользователем в javascript

/*
Данная функция получает текущего пользователя и заполняет им поле employee1
Этот скрипт необходимо положить в папку с решением
employee1 - наименование элемента управления в web разметке
Дополнения к УД - наименование решения
*/

var genController = require("@docsvision/webclient/Generated/DocsVision.WebClient.Controllers").GenControllers; //EmployeeController;
var app = require("@docsvision/webclient/Application").Application;
var extensionManager = require("@docsvision/webclient/System/ExtensionManager").extensionManager;

function setCurrentEmployee(sender, args) {
 let layout = sender.layout;
 let employee1 = layout.controls.employee1;
 let emplval = employee1.params.value;

var appobj = new app();
var emplc = new genController.EmployeeController();
var emplobj = emplc.getEmployee(appobj.CurrentEmployeeId);

emplobj.done(function(value) {
employee1.params.value=value;
});

}

// Регистрируем расширение и все его обработчики
extensionManager.registerExtension({
    name: "Дополнения к УД",
    version: "5.5.14",
    globalEventHandlers: [{ setCurrentEmployee: setCurrentEmployee }]
});

Как в Web клиенте заполнить поле пользователь в javascript

//Скрипт записывает пользователя, жестко заданного в скрипте в виде json, в поле employee1

var extensionManager = require("@docsvision/webclient/System/ExtensionManager").extensionManager;

function validateOnStateChanging(sender, args) {
 let layout = sender.layout;
 let employee1 = layout.controls.employee1;

var toempl={id: "64dcbcb8-a503-40ba-a0a5-a9919c759843", isCurrent: false, displayName: "Администратор К. О.", firstName: "Крас", lastName: "Администратор", middleName: "Офис", position: null, fieldPath: null, unitId: "c51f9dd1-5058-4f69-ae3d-9c3fc24e97c6", pathInDirectory: null,
dataType: 64};

let jsonstr = JSON.stringify(toempl)
employee1.params.value=JSON.parse(jsonstr);
    MessageBox.ShowWarning(jsonstr);
}

// Регистрируем расширение и все его обработчики
extensionManager.registerExtension({
    name: "Дополнения к УД",
    version: "5.5.14",
    globalEventHandlers: [{ validateOnStateChanging: validateOnStateChanging }]
});

пятница, 24 января 2020 г.

Ошибки в консоли настройки Docsvision 5.4. Решения

При открытии вкладки Модули расширения\Управление процессами возникает ошибка доступа и вкладка становится неактивной.
Решение: При добавлении пользователя под которым запускается консоль настройки в пользователи SQL сервера ошибка не исчезает, но вкладка остается активной  с доступной кнопкой Настройка почты. При добавлении пользователю SQL сервера роли sysadmin ошибки при открытии вкладки не возникает.
Так же решается ошибка доступа при открытии настройки  базы данных по кнопке Настройка на вкладке Базы данных


вторник, 18 сентября 2018 г.

Функция получения полного регистрационного номера из документа

//Данная функция по объекту типа Document получает из него нолный номер, присвоенный этому документу.

private string getRegNumber(Document doc)
{
BaseCardNumber bsnumber=null;
bsnumber = doc.Numbers.SingleOrDefault<BaseCardNumber>(t => t.GetObjectId()==doc.MainInfo.GetGuid("RegNumber"));
if (bsnumber==null)
return "";
else
return bsnumber.Number;
}

Определение текущего года с помощью javascript в xslt преобразовании для префикса номера в конструкторе правил нумерации Docsvision 5.4

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ms="urn:schemas-microsoft-com:xslt"
  xmlns:my="http://sib-intel.com/my"
  exclude-result-prefixes="ms my">

  <ms:script language="JScript" implements-prefix="my">
  <![CDATA[
  function getCurrDate () {
    var mdate = new Date()
    return mdate.getFullYear().toString().substr(-2);
  }
  ]]>
  </ms:script>

<xsl:template match="/">
<xsl:text>ТТК-К-</xsl:text>
<xsl:value-of select="my:getCurrDate()"/>
<xsl:text>-</xsl:text>
</xsl:template>
</xsl:stylesheet>

суббота, 28 апреля 2018 г.

Удаление бизнес-процессов, приостановившихся по ошибке с определенным именем с помощью SQL скрипта

/*
Данный скрипт был применен в DocsVision версии 5.4
*/
declare @cid uniqueidentifier
declare @UserID uniqueidentifier
declare @SessionID uniqueidentifier

set @UserID =(select top 1 UserID from dbo.dvsys_users where AccountName ='domain\hyper')
set @SessionID = (select top 1 SessionID from  dbo.dvsys_sessions where UserID = @USerID)

if (@UserID is not null) and (@SessionID is not null)
begin
      declare cur cursor for
      select InstanceID from
      dbo.[dvtable_{0EF6BCCA-7A09-4027-A3A2-D2EEECA1BF4D}]
      where State=3 and Name like '%Экземпляр подпроцесса УД Отправка почтовых уведомлений%'
      open cur
      fetch next from cur into @cid
      while @@fetch_status=0
      begin  
EXEC [dbo].[dvsys_card_delete] @UserID,@SessionID, @cid,1
         fetch next from cur into @cid
      end
      close cur
      deallocate cur
end 

вторник, 10 октября 2017 г.

Как в оперативной памяти создать объект XMLDocument

//Создает поток в памяти
MemoryStream ms = new MemoryStream();

//Делаем экспорт в виде XML карточки cdLastReconciliation типа CardData в поток
cdLastReconciliation.SaveXml(ms);
StreamReader reader = new StreamReader(ms);
ms.Position=0;

XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(reader.ReadToEnd());

вторник, 25 октября 2016 г.

DV 5.4.2642 НО6 Ошибки в БП КС Основной процесс (CU6) Не удалось выполнить операцию: Создание новой версии основного файла

В БП на кубике-сценарии 'Согласование завершено' происходила ошибка:
Не удалось выполнить операцию: Создание новой версии основного файла

Оказалось, что это было из-за того, что в конструкторе состояний для состояния На регистрации  и Зарегистрирован не была сделана доступной операция редактирования:
- Создание новой версии основного файла.
И соответственно она не была доступна в конструкторе ролей для системной учетной записи workflow

среда, 6 мая 2015 г.

Создание документа Lotus Notes и открытие его на редактирование в ОС Windows из карточки DocsVision версии 4.5.1988

В коде создается документ и запускается на редактирование. Тестировано в ОС Windows Server 2003. Документ открывается через интернет эксплорер, используя объект WSH. Перед открытием документ сохраняется Это нужно для того, чтобы можно было открыть документ через iexplore.exe.
Для Lotus Notes версии 8.5 при открытом Lotus Notes пароль не запрашивается. При закрытом запрашивается пароль, открывается Lotus Notes, создается документ и открывается на редактирование.
Требование: На компьютере должен быть установлен Lotus Notes (именно установлен,а не скопирован)
и Windows Script Host.

Dim Session
Dim Dir
Dim Doc
Dim Workspace
Dim EditDoc
Dim uidoc


'Creation de la session Notes 
Set Workspace = CreateObject("Notes.NotesUIWorkspace") 
Set Session = CreateObject("Notes.NOTESSESSION")
Set Dir = Session.GETDATABASE("MAIL/ГА.", "reg.nsf") 

If Dir is Nothing then
   msgbox "БД reg.nsf не найдена!"
   exit function
End if

'Создание нового документа
Set Doc = Dir.CREATEDOCUMENT()

If Doc is Nothing Then
   msgbox "Ошибка создания документа. Обратитесь к администратору!"
   Exit Function
End If

Call Doc.replaceItemValue("Form", "firstdoc")
Call Doc.replaceItemValue("subject", "О направлении требований заявок тест")
Call Doc.replaceItemValue("DocType", "2015\Входящая ЗАО ТТК")
Call Doc.replaceItemValue("docregnum", "1000")
Call Doc.replaceItemValue("docregdate", "01.01.2014")
Call Doc.replaceItemValue("delo", "исп.")

'Сохраняем, чтобы можно было получить ссылку на документ для открытия его через iexplore.exe
Call Doc.Save(True, False)

Set WshShell = CreateObject("WScript.Shell")
Call WshShell.Run("iexplore.exe " + "Notes://MAIL/47256E8B00343C37/6F0FC1CAAE60D22147256BF2002C1907/" + Doc.UniversalID)

Set uidoc = Workspace.CurrentDocument
while (uidoc is Nothing)
   WshShell.Popup "Ожидание открытия документа", 1, "Открытие документа", -1
   Set uidoc = Workspace.CurrentDocument
Wend

If uidoc is Nothing then
msgbox "Не удалось получить объект документа. За помощью обратитесь к администратору."
exit function
End If

'Здесь при открытии можно изменить еще какие-либо поля документа
uidoc.EditMode=True
Call uidoc.FieldSetText("authororg", "ЗАО Корона Империи")

вторник, 28 апреля 2015 г.

Создание и открытие карточки DocsVision версии 4.5.1988 на редактирование из Lotus Script и других VB подобных языков

Данный скрипт выполняет следующие действия:
- Вызывает диалог выбора папки в которой будет создаваться карточка;
- Создает карточку с видом, назначенным на папку и открывает ее на редактирование.

Для его выполнения необходимо, чтобы на папку был назначен только один вид для создания документа.

Иначе скрипт не будет знать какого вида создавать карточку. Можно дописать и сделать выбор конкретного вида из списка видов, назначенных на папку. Но в данном случае было сделано так. Запускающим методом является процедура newCard.
Для работоспособности данного кода также необходимо, чтобы на рабочей станции, где будет запускаться скрипт был установлен клиент DocsVision 4.5.1988.
Данный код тестировался в Lotus Script. Скорее всего он будет работать и в других VB подобных языках программирования. Может быть с небольшой корректировкой.

Код:
Sub newCard()
Const ID_DICFOLDERSCARD = "{DA86FABF-4DD7-4A86-B6FF-C58C24D12DE2}" ' ИД карточки папок
Const ID_CARDIN = "{C1FED883-08DE-420F-8FB4-C16CEFFC1630}" ' ИД карточки типа входящий
Const ID_CARDINT = "{425DD1AC-8DF1-49F0-9A06-FA61381C4FEC}" 'ИД карточки типа внутренний
Const ID_CARDOUT = "{FA0C389E-1095-4BC1-BEDC-793463742571}" 'ИД карточки типа исходящий
Const ID_CARDARCH = "{A9E3F102-355B-477D-A9F2-99B02579F34E}" ' ИД карточки типа архивный
Const ID_CARDUNI = "{E724C058-B678-42FE-9C73-441705698CDB}" ' ИД карточки универсальный

' Строка подключения к серверу DocsVision по протоколу named pipe
'можно сделать и протоколу http. Как будет лучше так и сделать
Const ConnectString = "\\srv-dv\Pipe\DocsVision45\StorageServer"

Dim oSession As Variant
Dim Manager
Dim oTypesObject

Dim host As Variant
Dim oCard
Dim Navigator
Dim RowMainInfo


Set Navigator = CreateObject("DVNavigator.NavigatorControl")
Set Manager = CreateObject("DVObjectManager.SessionManager")
Set oTypesObject = CreateObject("TOHelperObjects.TypesObject")

Manager.Connect ConnectString
Set oSession = Manager.CreateSession()
If oSession Is Nothing Then
Msgbox "Невозможно создать сессию к DocsVision! За помощью обратитесь к администратору."
Exit Sub
End If

Set oTypesObject.UserSession = oSession

Set host = Navigator.CreateHost(oSession)

' Получаем карточку папок
Set oFolderCard = oSession.CardManager.Dictionary(ID_DICFOLDERSCARD)

' Выводим форму для выбора папки
FolderID = host.SelectFolder("Выбор папки для создаваемой карточки.")

' Получаем ИД вида документа по папке
DocsViewID = GetDocViewID(oFolderCard, FolderID)
If DocsViewID = "" Then
Msgbox "Для данной папки не удалось получить вид создаваемых документов. За помощью обратитесь к администратору."
Exit Sub
End If

' Получаем тип документа (Входящий = 0, Исходящий = 1, Внутренний = 2, Архивный = 3, Универсальный = 4)
DocType = GetDocTypeByDocView(oSession, DocsViewID)

' В зависимости от типа документа копируем в переменную DocTypeID соответствующий ИД типа документа
If DocType = -1 Then
Msgbox "Ошибка получения типа документа. За помощью обратитесь к администратору."
Exit Sub
End If
If DocType = 0 Then
DocTypeID = ID_CARDIN
End If
If DocType = 1 Then
DocTypeID = ID_CARDOUT
End If
If DocType = 2 Then
DocTypeID = ID_CARDINT
End If
If DocType = 3 Then
DocTypeID = ID_CARDARCH
End If
If DocType = 4 Then
DocTypeID = ID_CARDUNI
End If

' Создаем карточку документа
Set CardData = oSession.CardManager.CreateCardData(DocTypeID)
' Получаем первую строку основной секции карточки
Set RowMainInfo = CardData.Sections(CardData.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
RowMainInfo.Value("Name") = "Имя документа"
Call oTypesObject.SetCardType(CardData.ID, DocsViewID, True, True, False, True, True, True, True)

'Здесь прописываются значения свойств документа. 
' В закомментрированном ниже коде свойству Name присвоено значение: Test oMailItem.Subject 
'Можно добавить свои свойства
' Set oName = GetProperty("Name", CardData, DocType)
' oName.Value("Value") = "Test oMailItem.Subject"
' oName.Value("TextValue") = "Test oMailItem.Subject"
' oName.Value("DisplayValue") = "Test oMailItem.Subject"


' Создаем слабый ярлык на карточку в выбранной папке
oFolderCard.CreateShortcut FolderID, CardData.ID, True

' Обновляем данные карточки
CardData.Refresh

' Отображаем карточку
host.ShowCard CardData.ID
End Sub

Function GetDocViewID(oFolderCard, FolderID)
GetDocViewID = ""
Set AllowedForFolderTypes = Nothing

'Получаем объект карточка папок
'    Set oFolderCard = UserSession.CardManager.Dictionary(ID_FOLDERSCARD)

'Получаем объект папки в которой будет храниться карточка
Set oFolder = oFolderCard.GetFolder(FolderID)

'Получаем разрешенные для папки типы и возвращаем их из функции
'Если на папку не включено ограничение на создаваемые виды возвращаем Nothing, иначе список разрешенных видов
If (oFolder.Restrictions And FOLDER_RESTRICTED_TYPES) <> FOLDER_RESTRICTED_TYPES Then
Set AllowedForFolderTypes = Nothing
Else
Set AllowedForFolderTypes = oFolder.AllowedTypes
End If

If AllowedForFolderTypes Is Nothing Then
Msgbox "На папке не стоит ограничение на виды создаваемых в ней карточек. Карточка не будет создана. За помощью обратитесь к администратору."
Exit Function
End If

If AllowedForFolderTypes.Count = 0 Then
Msgbox "В списке ограничений папки на создаваемые виды не стоит ни один вид. Карточка не будет создана. За помощью обратитесть к администратору."
Exit Function
End If

If AllowedForFolderTypes.Count > 1 Then
Msgbox "В списке ограничений папки на создаваемые виды установлен больше чем один вид. Карточка не будет создана. За помощью обратитесь к администратору."
Exit Function
End If

GetDocViewID = AllowedForFolderTypes.Item(0).TypeID

End Function

Function GetDocTypeByDocView(UserSession, DocsViewID)
' По умолчанию тип карточки равен -1 (Теоретически. Что в принципе не может быть,
' так как у вида документа не может не быть типа карточки.)
'ID карточки типов
Dim oSectDocType As Variant
Const ID_TYPESCARD = "{BE14D55D-92B7-4345-AD10-32588981F83D}" 'ИД Карточки справочника типов
GetDocTypeByDocView = -1

Set oTypesCard = UserSession.CardManager.DictionaryData(ID_TYPESCARD)
Set oSectDocType = oTypesCard.Sections(oTypesCard.Type.AllSections.GetByAlias("DocumentTypes").ID)
Forall Row In oSectDocType.AllRows
If Row.Value("RowID") = DocsViewID Then
GetDocTypeByDocView = Row.Value("DocumentType")
Exit Function
End If
End Forall

End Function

Function GetProperty(tName, CardData, DocType)
Const ID_SECTPROP_CARDIN = "{B822D7D1-2280-4B51-AE58-A1CF757C5672}" 'Секция свойства карточки входящий документ
Const ID_SECTPROP_CARDINT = "{ 5B6B407E-3D72-49E7-97D9-8E1E028C7274}" 'Секция свойства карточки внутренний документ
Const ID_SECTPROP_CARDOUT = "{13A6A514-DC45-4078-AD02-66A79F896E68}" 'Секция свойства карточки исходящий документ
Const ID_SECTPROP_CARDARCH = "{ECD7A672-22E3-4748-9962-00FC0FE2ABBC}" 'Секция свойства карточки архивный документ
Const ID_SECTPROP_CARDUNI = "{D25F1089-C63D-43E1-9FA4-864C48EECCB4}" 'Секция свойства карточки универсальный документ

If DocType = 0 Then
Set oProp=CardData.Sections(ID_SECTPROP_CARDIN)
End If
If DocType = 1 Then
Set oProp=CardData.Sections(ID_SECTPROP_CARDOUT)
End If
If DocType = 2 Then
Set oProp=CardData.Sections(ID_SECTPROP_CARDINT)
End If
If DocType = 3 Then
Set oProp=CardData.Sections(ID_SECTPROP_CARDARCH)
End If
If DocType = 4 Then
Set oProp=CardData.Sections(ID_SECTPROP_CARDUNI)
End If

Set oProp=CardData.Sections(ID_SECTPROP_CARDIN)
Set oPropRow=oProp.FindRow("@Name='" & tName & "'")
Set GetProperty=oPropRow

End Function

четверг, 3 апреля 2014 г.

Вызов хранимых процедур без прямого подключения к SQL

ExtensionMethod extensionMethod = session.ExtensionManager.GetExtensionMethod("BackOfficeExtension", "ResetRolesCache");
if (extensionMethod == null)
 return;
extensionMethod.Parameters.AddNew("cardId", ParameterValueType.Guid, cardId);
extensionMethod.Execute();


Хранимую процедуру можно вызвать также из клиентского скрипта:

Set Report = UserSession.ReportManager.Reports("{4958AEC9-5E38-4D83-ABF2-E92120D04F80}")

 Report.Parameters("TaskID").Value = TaskID
 Report.Parameters("PerformerID").Value = sCurrentUserID

Report.GetData

пятница, 4 октября 2013 г.

DV 5.1.2344 Добавление ссылки на карточку в другую карточку

Данная функция работала при создании исходящего из входящего по кнопке на панели инструментов входящего.
 Имя ссылки, передаваемое в функцию, должно существовать в справочнике ссылок.

using System;
using DocsVision.BackOffice.CardLib.CardDefs;
using DocsVision.Platform.ObjectModel;
using DocsVision.BackOffice.ObjectModel;
using DocsVision.BackOffice.ObjectModel.Services;
using Docsvision.DocumentsManagement;
using DocsVision.Platform.ObjectModel.Search;


        /// <summary>
        /// В список ссылок документа добавляет связанный документ
        /// </summary>
        /// <param name="document">карточка документа в который добавляется ссылка на другую карточку</param>
        /// <param name="addeddocument">карточка добавляемого документа в качестве ссылки в карточку другого документа</param>
        /// <param name="LinkName">Имя связи из справочника ссылок</param>
        private void CreateRefInCard(Document document, Document addeddocument, string LinkName)
        {
            IReferenceListService referenceService = CardControl.ObjectContext.GetService<IReferenceListService>();
           

            ReferenceList referenceList;
            if (document.MainInfo.ReferenceList == null)
            {
                referenceList = referenceService.CreateReferenceList();
                CardControl.ObjectContext.SaveObject(referenceList);
           
                document.MainInfo.ReferenceList = referenceList;
            }
            else
            {
                referenceList = document.MainInfo.ReferenceList;
            }
       
            LinksLinkType linkType = CardControl.ObjectContext.FindObject<LinksLinkType>(new QueryObject("LinkName", LinkName));
           
            Guid CardTypeID = CardControl.Session.CardManager.GetCardData(CardControl.ObjectContext.GetObjectRef(addeddocument).Id).Type.Id;
           
            referenceService.CreateReference(referenceList, linkType, CardControl.ObjectContext.GetObjectRef(addeddocument).Id, CardTypeID, false);
            CardControl.ObjectContext.AcceptChanges();
        }

воскресенье, 5 мая 2013 г.

Добавление нового свойства в карточку доп командой навигатора

for each SelectCard in SelectionIDs
   Set CardData = UserSession.CardManager.CardData(SelectCard)
   Set oProp = CardData.Sections(CardData.Type.Sections.GetByAlias("Properties").ID)
   Set oContrProp = oProp.FindRow("@Name = 'Контрагент'")
   if oContrProp is nothing then
      Set oContrProp = oProp.Rows.AddNew()
      oContrProp.Value("Name") = "Контрагент"
      oContrProp.Value("ParamType") = 11
' ... и т.д. - остальные поля
   end if
next
'Взято с форума forum.idoc.ru

воскресенье, 8 апреля 2012 г.

Об ошибке: 80040543: указанная строка данных не существует

Недавно при написании скрипта на событие сохранения столкнулся со следующей ошибкой:

Ошибка при работе с внутренним документом


Не удалось сохранить изменения
80040543: указанная строка данных не существует


Долго искал и гадал отчего она возникает. Скрипт проходил (вылавливал ошибки мессажбоксами) без ошибок, а уже после обновления карточки вылезала эта ошибка. Оказалась виновата следующая функция поиска строк (здесь используется не тот тип карточки, который был. Просто привел для примера. У меня был карточка типа внутренний документ. Поиск вел по секции Сотрудники. Выбирал сотрудников по полю Type):


CardData.Sections("7A9F0D60-444E-41AF-845E-4F4E94F43A52").FindRows _
("<ConditionGroup><Condition><Field>ApproverRowID</Field><Value>'" & miniRow.value("RowID")& "'</Value></Condition></ConditionGroup>")


В конце концов заменил этот поиск на цикл в котором применил условие для выбора только тех строк, которые мне нужны.


P.S. Так и осталось загадкой почему так происходило.

четверг, 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