Часто задаваемые вопросы

Каким образом получить родительский объект имея подчиненный?

Для этого предназначен метод ObjectHelper.GetParent.

Метод, к примеру, можно использовать для получения документа, которому принадлежит файл:
Document document = ObjectHelper.GetParent<Document>(documentFile); (1)
1 documentFile — файл (тип DocumentFile) искомого документа.
Как изменить значение в элементе управления в карточке

Для доступа к элементу управления из скрипта карточки, достаточно обратиться к методу FindPropertyItem базового класса карточки BaseCardControl, передав название элемента управления:

ICustomizableControl control = CardControl;

ILayoutPropertyItem layoutItem = control.FindPropertyItem<ILayoutPropertyItem>("Theme"); (1)

layoutItem.ControlValue = "Новое значение"; (2)

layoutItem.Commit(); (3)
1 Получение элемента управления.
2 Установка нового значения.
3 Сохранение.

Название элемента можно посмотреть в Конструкторе разметок.

Пример работы с Docsvision из Powershell

В приведенном ниже примере, создаётся скрипт, выполняющий подключение к серверу Docsvision, и получение номера из карточки Нумератора.

Add-Type -Path с:\DocsVision.Platform.dll
Add-Type -Path с:\DocsVision.Platform.ObjectManager.dll (1)

$connectionString = "ConnectAddress=http://docsvision.domain.com/DocsVision/StorageServer/StorageServerService.asmx" (2)
$sessionManager = [DocsVision.Platform.ObjectManager.SessionManager]::CreateInstance($connectionString)
$userSession = $sessionManager.CreateSession()

[GUID]$numeratorCardID = "00000000-0000-0000-0000-000000000000" (3)
[DocsVision.Platform.ObjectManager.SystemCards.NumeratorCard]$numeratorCard = $userSession.CardManager.GetCard($numeratorCardID)
[GUID]$outId = [GUID]::Empty

$number = $numeratorCard.Zones[0].GetNumber([GUID]::Empty, 1, [ref] $outId); (4)

write $number (5)
1 Требуется указать действительный путь к используемым библиотекам Docsvision.
2 Требуется указать действительный адрес подключения к Docsvision.
3 Требуется передать действительный адрес Нумератора.
4 Получение номера из первой зоны нумерации.
5 Вывод полученного номера.

Аналогичная задача может быть решена без объектной модели — прямым обращением к сервису Docsvision

$serverUri = "http://docsvision.domain.com/DocsVision/StorageServer/StorageServerService.asmx" (1)

[GUID]$numeratorCardID = "00000000-0000-0000-0000-000000000000"
$zoneName = "Zone" (2)

$result = 0
[GUID]$numberId = [GUID]::Empty
[GUID]$userID = [GUID]::Empty

$client = New-WebServiceProxy -Uri $serverUri"?WSDL" -UseDefaultCredential

[GUID]$sessionId = $client.SessionLogin("","", [ref]$result) (3)

$number = $client.NumGetFirstFree($sessionId, $numeratorCardID, $zoneName, $userID, [ref]$numberId) (4)
1 Адрес сервиса Docsvision.
2 Идентификатор карточки нумератора и название зоны, в которых будет резервироваться номер.
3 Открытие сессии.
4 Получение номера.

Полное описание методов сервиса приведено в разделе Методы веб-сервиса Docsvision.

Как узнать идентификатор карточки

Узнать идентификатор существующий карточки можно несколькими способами:

  • Посмотреть в Windows-клиенте — идентификатор карточки отображается в её свойствах.

  • Используя утилиту Docsvision Explorer, входящей в Resource Kit — идентификатор карточки отображается в поле Selected card ID.

Получить идентификатор созданной карточки, используя объектную модель

Для получения идентификатора объекта (например, объект document типа DocsVision.BackOffice.ObjectModel.Document) можно воспользоваться методом ObjectContext.GetObjectRef(ObjectBase):

Guid id_document = objectContext.GetObjectRef(document).Id;
или так (начиная с НО9):
Guid id_document = document.GetObjectId();

Корректный идентификатор нового объекта может быть получен только после сохранения объекта в контексте объектов.

Получить отображаемое имя текущего сотрудника
StaffEmployee currentEmployee = objectContext.GetService<IStaffService>().GetCurrentEmployee();
string displayName = currentEmployee.DisplayName;
Получить карточку сотрудника по его идентификатору (id_empl)
StaffEmployee staffEmployee = staffService.Get(new Guid("id_empl"));
Считывание данных с элемента управления типа коллекция, например "Сотрудники"

Для сотрудников, в ControlValue соответствующего элемента управления содержится коллекция идентификатором выбранных сотрудников — IEnumerable<Guid>. Для записи, в ControlValue передается массив таких идентификаторов (Guid[]).

Доступ к значению поля
int? result = userSession.CardManager.GetCardData(cardID).Sections[sectionID].FirstRow.GetInt32(fieldAlias); (1)
1 cardID — идентификатор карточки; sectionID — идентификатор секции; fieldAlias — псевдоним поля.

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

Guid cardID = new Guid("00000000-0000-0000-0000-000000000000"); (1)

string sectionAlias = "DynSection"; (2)

string fieldAlias = "DynField"; (3)

CardType type = userSession.CardManager.GetCardData(cardID).Type; (4)

Guid sectionID = type.Sections[sectionAlias].Id; (5)

int? result = userSession.CardManager.GetCardData(cardID).Sections[sectionID].FirstRow.GetInt32(fieldAlias); (6)

Document document = objectContext.GetObject<Document>(cardID); (7)
result = (((BaseCardSectionRow)document.GetSection(sectionID)[0])[fieldAlias] as int?);
1 Идентификатор карточки.
2 Название динамической секции.
3 Название динамического поля.
4 Получение типа карточки.
5 Получение идентификатора.
6 Получение значения поля через старую объектную модель.
7 Или даже так, если через новую объектную модель.
Как узнать идентификатор определённого вида карточки

Воспользуйтесь утилитой Docsvision Explorer, входящей в Resource Kit.

  1. Нажать Card types. В открывшемся окне определить идентификатор типа карточки (идентификатор в "Selected type ID"), также идентификатор можно найти в разделе Описание полей стандартной карточки (идентификатор указан вначале описания конкретной карточки).

  2. Нажать Cards. В списке типов карточек выбрать "Справочник видов карточек", после чего нажать Search.

  3. Выбрать найденный справочник (будет в единственном экземпляре). В справочнике нужно найти строку с найденным ранее идентификатором типа карточки (по содержимому поля "CardTypeId").

  4. Нажать Enter section.

  5. Найти в дереве видов карточек нужный вид по названию. В значении поля RowID будет искомый идентификатор вида карточки.

Получение сертификата сотрудника

Сертификаты используются при подписании, шифровании и расшифровке данных карточек, а также при верификации установленных подписей. Сертификат сотрудника может быть получен несколькими способами:

  1. Вне контекста Windows-клиента:

    IUserProfileCardService iUserProfileCardService = objectContext.GetService<IUserProfileCardService>();
    X509Certificate2 certificate = iUserProfileCardService.GetCertificate(@"DOMAIN\IvanovII");

    Для получения сертификата сотрудника с использованием метода GetCertificate, сертификат должен быть указан в соответствующем поле (см. Руководство по настройке), в Справочнике сотрудников.

    Другой вариант — получения сертификата из хранилища сертификатов ОС Windows. В примере получаем первый сертификат с закрытым ключом.

    X509Certificate2 GetCertificate()
    {
     X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
     store.Open(OpenFlags.OpenExistingOnly);
     foreach (var item in store.Certificates)
     {
      if (item.HasPrivateKey) return item;
     }
     return null;
    }
  2. В контексте Windows-клиента (например, в скрипте карточки)

    bool cancel = false;
    X509Certificate2 certificate = DocsVision.BackOffice.WinForms.Controls.SelectCertificateForm.SelectCertificate(ref cancel, objectContext);
    if(cancel) return;

    В данном случае, сотруднику будет выведено окно выбора сертификата.