RSS Подписка на статьи RSS Подписка на комментарии Панель инструментов

Блог профессионалов стал частью сайта технической поддержки DocsVision http://support.docsvision.com. Новые материалы будут появляться уже на этом сайте.

Поиск

Ярлыки

авто генерация кода (1) Администрирование DocsVision (60) Атрибутивный поиск (3) База данных (24) Базы знаний (1) Безопасность (1) Бизнес-процессы (20) Блог (2) Вы увидите это первыми (1) Групповые политики (1) Диаграммы (2) Задания (2) Интеграция (2) Карточки DocsVision (14) Конструктор Решений (11) Маркетинг и продажи (4) Навигатор (3) Новое (3) Новости (32) Опрос (4) Опросы DocsVision (4) Оптимизация (3) Отчеты (2) Ошибки (1) Поддержка (14) Полезные ссылки (1) Представления (4) Производительность (5) Разбор полетов (18) Разработка для Workflow (7) разработка карточек (2) Разработка на платформе DocsVision (41) Разработка решений (43) Расширение платформы (1) Расширенные отчеты (9) Решения на платформе DocsVision (6) Сервисы DocsVision (3) Сканеры (3) Справочник сотрудников (1) Справочник типов (1) Установка (1) Утилиты (13) Шлюз в SharePoint (8) Штрихкод (2) Cкрипты карточек (7) DocsVision внутри (1) DocsVision Live (1) FileStream (1) FireFox (2) Opera (1) Powershell (5) Safari (1) SharePoint2007 (1) SharePoint2010 (2) Silverlight (1) UltraViews (1) Vista (1)

T-SQL Скрипт для рассчета количества рабочих часов между двумя датами

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

Внимание, скрипт работает только если первым рабочим днем недели является понедельник. Т.е. @@DATEFIRST = 1

Скачать скрипт

Итак, опрос.
1. Нужно ли публиковать такие скрипты и примеры, которые, по сути, не относятся к DocsVision, а скорее просто к разработке?
2. Нужен ли T-SQL скрипт, который выполняет рассчет количества рабочих часов с учетом конкретного бизнес-календаря?
Ответы жду в комментариях.


Добавлено:
В скрипте ошибка - неверно ведется рассчет времени, если обе даты в одной неделе. Читать дальше

Оставить комментарий (всего: 4)

T-SQL Скрипт для рассчета количества рабочих дней между двумя датами

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

Была написана функция (по мотивам данного примера), которая возвращает количество рабочих дней (пока без учета нестандартных выходных).

Думаю, будет полезно тем, кто делает расширенные отчеты для контроля исполнительской дисциплины.

Скачать скрипт

Внимание, скрипт работает только если первым рабочим днем недели является понедельник. Т.е. @@DATEFIRST = 1

Если значение переменной отличается, то нужно изменить его, либо подправить скрипт. Читать дальше

Оставить комментарий (всего: 0)

Публикация комментариев

Некоторые могли заметить, что после публикации, комментарии не сразу отображаются под статьёй. Происходит это потому, что сначала они попадают в панель управления, в которой администратор должен поставить галочку "Опубликовать".
Отключить это никак нельзя - особенность движка, но мы просматриваем все комментарии оперативно.

p.s. В правила добавлю. Читать дальше

Оставить комментарий (всего: 1)

Сканирование документов в DocsVision, пример интеграции с сетевым сканером и FineReader

В последнее время все чаще начинают применяться сетевые сканеры, которые удобны в использовании. Опишем, как же можно наладить взаимодействие сетевого сканера и DocsVision на примере демонстрационного решения - работы DocsVision с сетевым сканером Canon ScanFront 220 и программы распознания сканированных документов ABBYY FineReader. Решение демонстрирует следующие функции: сканирование бумажного документа (письма) с прикреплением в карточку DocsVision и распознание его в электронный документ MS Word.

Описание варианта использования

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

2. Картинка автоматически направляется в предопределенную папку пользователя на файл-сервере (посредством настроек сканера).
Сканер должен быть соответственно настроен: должны быть установлены настройки сети, указана папка для сохранения документа на сервере, формат картинки – jpeg или tiff.

3. Система DocsVision автоматически «находит» новую картинку в папке пользователя на файл-сервере (посредством бизнес-процесса ДВ, который должен быть предварительно запущен).


Путь папки на файл-сервере, папка сотрудника в навигаторе, вид создаваемого документа указывается в универсальном справочнике «Настройка сканирования».



4. Система DocsVision автоматически создает карточку документа в папке сотрудника в навигаторе, прикрепляет найденный файл рисунка к созданной карточке документа.

5. Пользователь из созданного документа осуществляет распознавание прикрепленного рисунка в документ посредством ABBYY FineReader и прикрепляет распознанный документ в формате Word document к текущей карточке документа.

Видеопрезентацию, бизнес-процесс, и xml справочника можно загрузить по ссылке Читать дальше

Оставить комментарий (всего: 3)

Категории в карточках

В Microsoft Outlook есть такая удобная функция как установка категорий письма. Кликаем кнопкой мыши и назначаем категорию, которая отображается в представлении.

Такой же функционал можно сделать и в DocsVision. Приведу простой способ (рассматривается версия DocsVision 4.1).

1. Создаем в карточке свойство типа "Строка" и с именем "Метка"
2. Делаем представление в котором выводим значение данного свойства. Пример
3. Создаем новую комманду Навигатора в справочнике дополнительных комманд Навигатора.
Назначаем команду на меню карточки, задаем название и иконку.


А в поле "Сценарий" указываем следующий скрипт.

Sub DoEvent(UserSession, CardHost, FolderType, FolderID, SelectionIDs)
On Error Resume Next

' Для каждой карточки из коллекции

For Each sID In SelectionIDs

' Получаем карточку
Set oCard = UserSession.CardManager.CardData(sID)
' Получаем секцию Properties

Set oPRows = oCard.Sections(oCard.Type.Sections.GetByAlias
("Properties").ID)
Set oRow=oPRows.FindRow("@Name='Метка'")

oRow.Value("Value")="Срочно" oRow.Value("DisplayValue")="Срочно"
Next
CardHost.Refresh

End Sub


Данный скрипт будет записывать всем выделенным в представлении карточкам, в строковое свойство "Метка" значение "Срочно". Свойство в карточке должно существовать.

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


Можно усложнить этот пример - привязывать категории из справочника категорий, и т.д.
Реализация функционала, через дополнительные комманды Навигатора может существенно ускорить работу делопроизводителя.
Посмотрите пример, как можно выделить номер карточке, даже не открывая её. Читать дальше

Оставить комментарий (всего: 5)

Использование сервиса Workflow в кластере NLB

Как производить настройку сервисов Workflow, если несколько серверов DocsVision объеденены в кластер с балансировкой нагрузки (NLB).

Допустим настроен NLB кластер из 2х серверов DocsVision.
Сеансы пользователей распределяются между двумя серверам кластера.

Все пользователи уже могут работать в системе. Однако, есть тонкий момент. Если планируется, что пользователи будут самостоятельно запускать бизнес-процессы, то нужно, чтобы на сервере, к которому они подключены, был запущен сервис Workflow.

Таким образом, поскольку заранее неизвестно, к какому серверу (узлу кластера) будет адресован пользователь, то нужно, чтобы на обоих узлах был запущен сервис Workflow. А поскольку оба сервиса будут обрабатывать одну базу необходимо, чтобы они были настроены в кластер Workflow.

Вывод, если необходимо, чтобы пользователи NLB кластера могли запускать бизнес-процессы, то необходимо, чтобы на узлах NLB был настроен кластер Workflow.

Однако, запуск бизнес-процессов пользователями, процедура, которая редко реализуется в конкретном решении (это по сути административная задача)*. Поэтому, достаточно оставить сервис Workflow на одном из узлов (данный сервис будет обрабатывать все процессы в базе данных), а на другом его остановить - никакого объединения в кластер Workflow в этом случае не требуется.

В случае если потребуется запустить какой-либо процесс, то пользователь может осуществить подключение к конкретному узлу, на котором запущен сервис.

-----------
* Тут возникает вопрос, а как быть с бизнес-процессами по задачам? Бизнес процессы по задачам создаются системным процессом "Экземпляр процесса Мониторинг задач", а не пользователями. Читать дальше

Оставить комментарий (всего: 2)

Сервисы DocsVision StorageServer и протоколы подключения

Часто нам присылают вопрос: мы остановили сервис DocsVision 4.1. StorageServer, а в Навигатор можно по-прежнему заходить.

Поэтому хочу немного пояснить архитектуру. Клиентские приложения могут соединяться с сервером DocsVision по двум протоколам: Net Pipes и HTTP (кстати для Навигатора, настройка протокола, по которому будет производится подключение есть в консоли настройки).
Для обслуживания данных протоколов на сервере DocsVision есть два сервиса:
1) Windows-сервис: DocsVision 4.1. StorageServer
2) Web-сервис: StorageServerService.asmx

Поэтому если один из сервисов не работает, то и не будет работать соединение по соответствующему протоколу.

Примечание, для администраторов. Навигатор, может обрабатывать ситуации, когда windows-сервис не отвечает и автоматически переключается на канал HTTP к web-сервису: StorageServerService.asmx. Поэтому при остановке windows-сервиса, клиенты могут продолжать работать в Навигаторе.


Читать дальше

Оставить комментарий (всего: 2)

Вывод в расширеном отчете ссылки на карточку

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

Итак, будем рассматривать отчеты, которые строятся хранимыми процедурами (не MS Reporting)

Для создания расширенного отчета, который будет отображен в браузере, разработчик должен сделать
а) Хранимую процедуру в базе данных.
б) Xslt преобразование, которое будет применяться к результатам работы процедуры.

Сервер расширенных отчетов возвращает результаты работы процедуры (т.е. все SELECT'ы) в виде одного xml:

<newdataset>
<table>
<column1></column1>
<column2></column2>
</table>
<table1>
<column1></column1>
<column2></column2>
</table1>
</newdataset>

Пусть в одной из колонок в результирующем SELECT'е возвращается идентификатор карточки: колонка InstanceID.
Ссылка на карточку имеет вид http://dvserver/docsvision/?CardID={AE16A7C0-25A0-40D8-B149-5EA2EFFAE337}&ShowPanels=2048&

Фактически для вывода требуется соединить 3 строки:
1) "http://dvserver/docsvision/?CardID={"
2) InstanceID
3) "}&ShowPanels=2048&"

Сделать это можно используя переменные в xslt

<xsl:variable name="clink1">http://dvserver/docsvision/?CardID={</xsl:variable>
<xsl:variable name="clink2" select="InstanceID">
<xsl:variable name="clink3">}&аmp;ShowPanels=2048</xsl:variable>

<a href="{$clink1}{$clink2}{$clink3}">
Открыть карточку
</a>

Внимание, в тексте примера в "&аmp;" стоит кириллическая "а", - сделано, чтобы опубликовать статью. При копировании наберите тег правильно.

Готово. Теперь в отчете будет выведена ссылка, нажав на которую пользователь откроет карточку. Читать дальше

Оставить комментарий (всего: 0)

Публикация

С сегодняшнего дня публикуем как минимум по одной статье блога в день. Читать дальше

Оставить комментарий (всего: 1)

Использование XSLT преобразований в нумераторах DocsVision 4.1

В версии 4.1. появилась возможность для создания полного номера документа использовать xslt преобразование. Преобразование задается в "Справочнике нумераторов" / "Свойство нумератора"

Xslt шаблон применяется к xml карточки, для которой выделяется номер. Таким образом, в полном номере можно вывести данные из полей карточки.

В шаблоне так же можно использовать ряд тегов:

[Number] - номер
[DepPref], [DepSuff] - префикс, суфикс подразделения
[TypePref], [TypeSuff] - префикс, суфикс вида
[CasePref], [CaseSuff] - префикс, суфикс дела
[CasePrefPar], [CaseSuffPar] - префикс, суфикс дела с учетом родителей
[FolderPref], [FolderSuff] - префикс, суфикс папки
[FolderPrefPar], [FolderSuffPar] - префикс, суфикс папки с учетом родителей

Пример XSLT шаблона:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:value-of select="//CardInc[1]/MainInfo/@Name"/>-[Number]+[TypePref]
</xsl:template>
</xsl:stylesheet>

Данный шаблон формирует номер по принципу:
имя карточки-номер+префикс вида Читать дальше

Оставить комментарий (всего: 6)

Причина ошибки Timeout expired при загрузке файла, база на SQL Server 2008

База данных внутреннего сервера DocsVision переводилась на новую машину. С Microsoft SQL Server 2005 32bit на Microsoft SQL Sever 2008 64 bit.
После перевода обнаружено следующее поведение. При добавлении файла любого размера в карточку возникает ошибка Timeout expired.

В журнале StorageServer фиксировалась следующая ошибка:

StorageServerRuntime Error: 0 : Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. Method name: StorageServer.FileWrite

Больше никаких ошибок в журналах DocsVision, и в системных журналах ОС не было. С производительностью сервера так же было все в порядке.

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

С помощью административных представлений (Dynamic Management Views) sys.dm_tran_active_transactions, sys.dm_exec_requests и sys.dm_exec_sql_text было обнаружено, что SQL Server дополнительно запускает следующий запрос:

SELECT StatMan([SC0], [LC0]) FROM ( SELECT TOP 100 PERCENT CONVERT([varbinary](200), SUBSTRING([Data], 1, 100)++ SUBSTRING([Data], CASE WHEN LEN([Data])<=200 THEN 101 ELSE LEN([Data])-99 END, 100) ) AS [SC0] ,DATALENGTH([Data]) AS [LC0] FROM [dbo].[dvsys_binaries] WITH (READUNCOMMITTED) ORDER BY [SC0] ) AS _MS_UPDSTATS_TBL

Эта команда получает первые и последние 100 байт из Data в колонку SC0, длину Data в колонку LC0 для каждой записи в dvsys_binaries, потом направляет полученные данные в функцию StatMan. Это крайне неэффективный запрос, он приводит к перечитыванию большого количества данных (в нашем случае это 11Гб). Осталось неясным, почему SQL Server 2008, при выполнении команды частичного обновления данных в BLOB-колонке для одной записи (указана по первичному ключу), запускает такой длительный запрос для анализа статистики.

Чтобы обойти проблему была выполнена команда:

EXEC sp_dboption 'MyBase', 'auto create statistics', 'false'

В результате отключено автоматическое создание статистики для нашей базы данных MyBase.

В процессе исследования проблемы были внесены следующие изменения:

1. Указан FILEGROWTH=100Mb – был 1 Мб. Столь малый показатель приводит к частым операциям по увеличению объема базы (дорогостоящая операция) и повышает общую фрагментированность данных.

2. Указан режим совместимости COMPATIBILITY_LEVEL = 100 – совместимость с форматом SQL Server 2008

Результат. Если после перевода базы на SQL Server 2008 появляется ошибка превышения таймаута при загрузке файла (создании карточки файла), то попробуйте отключить ведение статистики. Читать дальше

Оставить комментарий (всего: 0)

Если база данных имеет большой размер

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

dvsys_help_show_section_size

В результате работы будет выведен список таблиц, отсортированный по размеру, в сторону уменьшения. Ниже приведены рекомендации, если в списке таблиц с большим размером окажутся следующие.


1. dvtable_{388F390F-139E-498E-A461-A24FBA160487}

В данной таблице хранятся журналы всех экземпляров бизнес-процессов, которые существуют в системе. Для уменьшения размера таблиц нужно:
1. Удалить все отработавшие и уже не нужные экземпляры бизнес-процессов. Если запускаются подпроцессы, то необходимо сделать настройку удаления подпроцессов после завершения.
2. Определить какой из процессов делает большее число записей. Сделать это можно посмотрев на поле InstanceID в строке из данной таблицы. В этом поле содержится идентификатор карточки экземпляра бизнес-процесса. Журнал такого процесса, если он не нужен, можно очистить.
Команда очистки журнала определенного процесса:
DELETE FROM [dvtable_{388F390F-139E-498E-A461-A24FBA160487}]
WHERE InstanceID = 'ТУТ_ДОЛЖЕН_БЫТЬ_ID_ПРОЦЕССА_БЕЗ_ФИГУРНЫХ_СКОБОК'

Для удаления журналов всех завершенных бизнес-процессов выполните:
DELETE FROM [dvtable_{388F390F-139E-498E-A461-A24FBA160487}]
WHERE InstanceID IN
(SELECT InstanceID FROM [dvtable_{0EF6BCCA-7A09-4027-A3A2-D2EEECA1BF4D}] WHERE State = 4)


Можно удалить журналы всех экземпляров бизнес-процессов. На работу системы это не повлияет, однако, если есть процессы, приостановленные по ошибке, то причину остановки не удастся выяснить без журнала. Поэтому сначала нужно проверить нет ли процессов приостановленных по ошибке. Выяснить причину, а затем очищать таблицу.
Для удаления всех строк таблицы выполните:
TRUNCATE TABLE dvtable_{388F390F-139E-498E-A461-A24FBA160487}

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


2. dvsys_log

В этой таблице хранятся записи журнала «Навигатора». Для того, чтобы журнал не увеличивался не ограниченно в размерах необходимо настроить автоматическую очистку. Для этого в журнале навигатора выставьте опцию «Очищать журнал» с соответствующим параметром. И в консоли настройки задайте «Папку для выгруженных файлов журнала». При такой очистке журнал будет выгружаться на диск (при помощи bcp). Это позволит в дальнейшем восстановить журнал при необходимости.
Удалить все записи из этой таблицы можно так же вручную запросом:
TRUNCATE TABLE dvsys_log


3. dvsys_files (dvsys_binaries)

В этой таблице хранятся все файлы, загруженные в DocsVision. Уменьшить размер этой таблицы можно только удалив ненужные файлы. Читать дальше

Оставить комментарий (всего: 5)

Список Job'ов базы данных DocsVision

В базе данных DocsVision существует группа заданий (job'ов) , которые выполняют различные функции.

1. Индексация полнотекстовых каталогов
Job-ы с названиями dvftjob_Название базы_{Идентификатор} - запускают индексацию полнотекстовых каталогов.
Идентификаторы в названиях job-ов и полнотекстовых каталогов соответствуют идентификаторам типов карточек.
Согласование: A231269C-6126-4C1A-9758-F55FF9571EF8
Архивный документ: A9E3F102-355B-477D-A9F2-99B02579F34E
Карточка файла: 2BBD0A41-265E-4FF8-82D6-C6342F34B1AF
Входящий документ: C1FED883-08DE-420F-8FB4-C16CEFFC1630
Сообщение: 9D0B80A0-DFA2-49D9-9AE8-C8934913117A
Внутренний документ: 425DD1AC-8DF1-49F0-9A06-FA61381C4FEC
Исходящий документ: FA0C389E-1095-4BC1-BEDC-793463742571
Задача: 0056522E-FC72-48D2-8EBB-A60B838E36C9
Бизнес-процесс: AE82DD57-348C-4407-A50A-9F2C7D694DA8
Бизнес-календарь: F31B9F60-F81F-4825-8216-FC3C1FF15222
Задание бизнес-процесса: F7E2090A-EEC3-4B51-B1BB-567D4A0117D6
Отчет: 52F3DB4D-C3D4-4C03-BFF2-D8CFDC6E6CFC
Универсальный документ: E724C058-B678-42FE-9C73-441705698CDB

dvftjob_Название базы_system - запускает полнотекстовое индексирование файлов.

2. Другие задания
dvjob_Название базы_clear_log - очистка журнала навигатора.
Параметры ежедневной очистки журнала навигатора настраиваются в меню навигатора - Сервис - Журнал - Настройки журнала.

dvjob_Название базы_purge_deleted_cards - очистка корзины.
Настраивается в консоли настройки – Базы данных – Настройка – вкладка Управление.

dvjob_Название базы_clear_old_sessions - удаляет неактивные сессии

dvjob_Название базы_archive – архивирует карточки
Настраивается в консоли настройки – Базы данных – Настройка – вкладка Архивирование. Читать дальше

Оставить комментарий (всего: 0)

Примеры бизнес-процессов, часть 1

Несколько примеров процессов со скриптами.

1. Рассчет количества рабочих часов между текущей датой и указанной


Используется VB.NET скрипт
Исходный параметры:
Переменная БП varDep - подразделение с календарем
Переменная БП varTargetDate - назначенная дата

как результат: varDuration - длительность рабочего времени в этом интервале.


2. Смена представления у папки

Используется VB.NET скрипт
Меняется представление по умолчанию у папки, указанной в переменной varFolders
на представление с идентификатором указанном в переменной varView.


3. Создать подпапку в папке 'Завершенные'

Используется VB.NET скрипт
Процесс ищет все папки с названием "Завершенные" и добавляет подпапку "2007".
Хороший пример работы с поисковым запросом

4. Получение сотрудников из подразделения и вложенных подразделений

Используется VB.NET скрипт
Получение всех сотрудников, указанного подразделения, включая вложенные подразделения.
varDep - указывается подразделение
varEmpl - возвращаются сотрудники (коллекция)


Скачать архив Читать дальше

Оставить комментарий (всего: 0)

Диагностика проблемных бизнес-процессов

Приложенный скрипт помогает выявить процессы в которых вероятно есть проблемы. При этом обнаруживаются процессы со следующими проблемами:
1. Давно не обрабатывавшиеся процессы. «Давность» задается путем изменения переменной @DaysCount и задается в днях.
2. Активные процессы в которых нет реально активных функций
3. Процессы с функциями ожидающими изменений в связанных карточках, но при этом дата изменения связанной карточки меньше даты последней обработки процесса. При этом карточка была изменена более чем час назад (это нужно для того чтобы не находить процессы которые просто ещё не успели обработать эту карточку)
4. Процессы в которых есть завершенные задания, но функция задания все равно находится в состоянии «Ожидает изменений». При этом учитываются только задания измененные более часа назад, аналогично пункту 3.
5. Процессы завершенные успешно, но имеющие функции в состоянии «Завершена по ошибке»
6. Процессы с большим логом. Размер лога задается в переменной @MaxLogMessages

В заголовке скрипта задается ряд значений при помощи которых скрипт можно кастомизировать:


@ServerURL
URL ссылка на сервер DV вида 'http://localhost/DocsVision/?BaseName=DocsVision&CardID='

@DaysCount
Число дней после которых процесс считается «долго не обработанным»

@MaxLogMessages
Число сообщений в журнале после которого считается, что у процесса большой лог

@LongAgoExecuted
Текстовое описания состояния процесса подходящего под пункт 1.

@NoActiveFunctions
Текстовое описания состояния процесса подходящего под пункт 2.

@ExecuteTimeLessThanLinked
Текстовое описания состояния процесса подходящего под пункт 3.

@ProcessWithFinishedTasks
Текстовое описания состояния процесса подходящего под пункт 4.

@FinishedProcessWithFailedFunctions
Текстовое описания состояния процесса подходящего под пункт 5.

@ProcessWithLargeLog
Текстовое описания состояния процесса подходящего под пункт 6.

В качестве результата работы скрипт выдает описание возможной проблемы, дайджест процесса и URL ссылку на процесс сформированный с учетом значения переменной ServerURL Читать дальше

Оставить комментарий (всего: 0)

Утилита поиска карточек имеющих определенный набор прав

Для решения одной задачи потребовалась утилита, которая бы выводила список всех карточек, которые имеют определенный набор прав. Такая утилита была создана в службе ТП DocsVision.
(Администраторы далее могут сразу перейти в конец статьи и скачать утилиту)

Поскольку по самим дескрипторам. которые хранятся в базе определить набор прав при помощи T-SQL запроса нельзя, то единственным способом является перебор дескрипторов всех карточек.
Т.о. алгоритм следующий
1. Получение набора карточек CardDataCollection, среди которых нужно сделать выборку только тех, которые имеют нужные права.
2. Для каждой карточки из набора получить SecureCard
3. Из SecureCard получить последовательно SecurityDescriptor и AccessControlList
4. И в полученном AccessControlList проверить совпадения AccessControlEntry из условий поиска.

Какие ограничения присутствуют.
В диалоге "Безопасность" для описания прав - условий поиска нельзя указать, что эти права могут быть унаследованы. Т.е. если в диалоге будет указано искать карточки у которых права назначены для DOMAIN\User1, то будут найдены только те карточки, в которых данный набор задан явно и не отнаследован.
Помимо получения CardDataCollection для каждой карточки приходится получать SecureCard, т.е. идет обращение к серверу, что естественно, его нагружает.
Эту проблему можно обойти получая дескриптор непосредственно из базы:
1. Получаем CardData.ID
2. Из dvsys_instances получаем ссылку на дескриптор безопасности (поле SDID) из dvsys_security
3. Из dvsys_security получаем SecurityDesc (дескриптор Base64String)

Таким образом утилита может послужить примером работы с дескрптором безопасности, классом SecurityManager.
Обратите внимание, что для работы диалога назначения прав нужно наличие схемы безопасности SecuritySchema.xml (не удаляйте этот файл)

Утилита скомпилирована с библиотеками от DocsVision 4.1.1632. Для работы с другими версиями нужно присоединить к проекту библиотеки DocsVision.ObjectManager.Interop.dll и DocsVision.SecurityManager.Interop.dll

Скачать утилиту (утилита для DocsVision 4.1.1632, инструкция и исходный код на VB.NET VisualStudio 2008) Читать дальше

Оставить комментарий (всего: 10)