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)

Определение учетной записи, под которой пользователь авторизуется на IIS

Иногда требуется определить под какой учетной записью авторизуется пользователь при входе на IIS. Для этого очень подходит утилита TokenDump
Инструкция простая. Файлы выкладываются в папку, в которую будет заходить пользователь. И регистрируется компонент TokDumpSrv.dll через regsvr32.exe
Когда пользователь откроет страницу default.aspx или default.asp, то отобразится информация о его учетной записи. Читать дальше

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

Вызов расширенного отчета из адресной строки

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

Параметры передаются как в любом запросе к aspx, первый через ? последующие через &
Имя параметра то же, какое задано в настройках отчета, и оно чувствительно к регистру.

Пример.
http://dvserver/docsvision/ReportingServer/Fetch.aspx?basename=DVBase&reportid=%7bEA242123-1C33-45BF-AEB9-E6784AAD62BD%7d&cardid=%7b99841090-2FF8-4DFB-B44A-A14A36E59FC0%7d&PartnerID=SDADFE1C-9A03-45CD-94C1-EE8577C12346

здесь
Идентификатор отчета
Идентификатор карточки расширенного отчета
Параметр


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

Теперь о безопасности. Нужно в любых отчетах уделять внимание безопасности. При возврате результирующего набора сервер расширенных отчетов ожидает колонку SecurityDesc, в которой должен быть дескриптор безопасности (каждая карточка ). И если у пользователя, который вызывает отчет нет прав на строку (нет записи в дескрипторе), то эта строка ему в отчет не будет возвращена. Если этой колонки нет, то будут возвращены все строки.

Как получить дескриптор - просто. Например, делается выборка по карточкам в этом случае нужно соединить Таблица.InstanceID = dvsys_instances.InstanceID, далее соединить dvsys_instances.SDID = dvsys_security.ID и получить из dvsys_security.SecurityDesc.


Добавлено.
Как это можно использовать? Например, делаете отчет, в котором есть статистика по всем контрагентам, а при нажатии на контрагента открывается новый отчет по нему (по сути в первом отчете есть ссылка на другой отчет, в который передаются параметры, как в xlst динамически делать ссылки описано в http://dvprofessionals.blogspot.com/2009/03/blog-post_4221.html).

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

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

Редактор шаблонов печати

Многим известна утилита "Редактор шаблонов печати", при помощи которой можно создавать несложные xslt шаблоны печати карточек. (для тех, кто читает о ней впервые, выкладываю на сервер). Статус данной утилиты так и не определен. Несколько раз она дорабатывалась, и последняя версия - четвертая. Сейчас есть идея переписать её, дополнив функционал. Основная переработка - отказ от использования MS Word в качетстве HTML редактора, - слишком неоптимальный генерируется HTML код.
Предлагаю обсудить желаемый функционал данной утилиты в комментариях.

UPD: Есть желание сделать разработку утилиты как совместный проект на базе sourceforge.net. Если хотите присоединиться, то так же сообщайте в комментариях Читать дальше

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

Получение количества занятых лицензий

В одном из коментариев прозвучала проблема подсчета занятых лицензий.
Подсчитать занятые лицензии не трудно. Лицензии конкурентные и учитываются так - сесии открытые с одной машины от одного пользователя занимают одну лицензию.

T-SQL запрос к базе:

1) Считаем лицензии без учета сессий от определенных учетных записей (например, сервис Workflow имеет собственную лицензию)

-- Получение количества занятых лицензий
-- Ограничиваем сессии от конкретных аккаунтов

DECLARE @SysAccounts table
(AccountName nvarchar(256))


INSERT INTO @SysAccounts VALUES
-- Здесь нужно задать учетные записи, лицензии которых не должны учитываться
(
'DOMAIN\User'
)
SELECT COUNT(DISTINCT dvsys_sessions.UserID) 'Licenses count' FROM dvsys_sessions
JOIN dvsys_users
ON dvsys_users.UserID = dvsys_sessions.UserID
WHERE dvsys_users.AccountName NOT IN (SELECT AccountName FROM @SysAccounts)

2) Считаем лицензии без учета сессий от определенных машин (так же можно учитывать сеансы системных сервисов)

-- Получение количества занятых лицензий
-- Ограничиваем сессии от конкретных машин

DECLARE @SysMachines table
(MachineName nvarchar(256))


INSERT INTO @SysMachines VALUES
-- Здесь нужно задать имена машин, сессии от которых не должны учитываться при подсчете
(
'SUPPORT1'
)
SELECT COUNT(DISTINCT dvsys_sessions.UserID) 'Licenses count' FROM dvsys_sessions


Если задачу подсчета нужно проводить постоянно, то можно написать собственное расширение консоли настройки (snap-in). В данное расширение будет выполнять запрос к базе.


UPD. Коллеги подсказали еще более красивый скрипт

SELECT DISTINCT
CAST([UserID] AS nvarchar(36)) + CAST([ComputerName] AS nvarchar(256))
FROM
[dbo].[dvsys_sessions] WITH (NOLOCK)
Читать дальше

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

Авторизация на прокси сервере

[1] Процесс подключения к клиента к серверу.
Процесс подключения клиента к серверу DocsVision происходит в два этапа, следующим образом.

1. Internet Explorer (IE) соединяется с IIS, и получает html страницу. В данной html странице есть javascript который создает ActiveX компонент Навигатора.
2. Навигатор подкючается либо к web-сервису по HTTP, либо к windows-сервису по net pipes.

[2] Типы авторизации
Сервер DocsVision поддерживает два способа авторизации клиентов: Встроенная (Integrated) аутентификация, - авторизация пользователей происходит под текущим логином и паролем, и базовая (Basic), - для авторизации необходимо указать логин и пароль. Первый вариант может работать только в сетях, где у каждого клиента есть доступ к контроллеру домена, или к серверу, на котором зарегистрированы учетные записи (сеть без ActiveDirectory). Это типичная сеть организаций с одним или несколькими доменами. Второй вариант работает в любых сетях, поскольку логин и пароль передаются с клиента напрямую на сервер DocsVision.

[3] Возможности авторизации клиентской части на прокси-сервере
В текущей реализации клиентская часть DocsVision может авторизовываться на прокси сервере, только если используется встроенная аутентификация.

Рассмотрим ситуацию, когда машина клиента находится в сети за прокси-сервером и производится попытка соединения с удаленным сервером DocsVision, напрямую, без установки vpn туннеля. Соединение возможно по HTTP протоколу с базовой авторизацией.
Что при этом происходит.
1. Internet Explorer (IE) соединяется с IIS, авторизуясь на прокси-сервере, и получает html страницу. В данной html странице есть javascript который создает ActiveX компонент Навигатора.
2. Навигатор производит попытку подкючения к web-сервису по HTTP, но предварительно требуется авторизоваться на прокси-сервере. Поскольку в нашем сценарии используется базовая аутентификация, то это невозможно сделать. В результате "Навигатор" отображает ошибку "Доступ запрещен".

Сухая выжимка. Подключение по базовой аутентификации, через прокси-сервер с включенной авторизацией, к серверу DocsVision по HTTP невозможно. Это касается, например, сервиса DVLive (см. FAQ).
Для случая когда машина клиента внутри сети, за прокси. То нужно отключить авторизацию.
Если машина клиента находится вне прокси, и то лучше делать vpn туннель во внутреннюю сеть. Так еще и безопаснее. Читать дальше

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

Ждем интересных статей

Концепция блога была в том, чтобы делиться опытом, а возможно и какими-то наработками, которых не жалко. Причем статьи не обязательно должны быть от сотрудников DV, но и от любого специалиста.

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

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

Сервисы файлового доступа

Опубликовано официальное описание на сайте http://docsvision.com/nc/catalogue/dv/ftp_webdav.html

Там же две видеодемонстрации работы. Читать дальше

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

T-SQL функция рассчета количества рабочих часов между двумя датами с учетом бизнес-календаря

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

Прежде расскажу как хранятся данные в бизнес-календаре.
Бизнес календарь имеет 3 секции (лучше посмотреть в CardManager)

1. Основная информация (только одно поле Name, понятно для чего оно нужно)
2. Года (Years). Имеет отдно поле Year в котором указывается год
2.1 Подсекция Days. Имеет поля Day - номер дня от начала года и Type тип
2.1.1 Подсекция WorkTime. Поля StartTime и EndTime - временной диапазон
3. DefaultTimeSettings. Поля StartTime и EndTime - временной диапазон


В календаре можно делать несколько настроек.

1. Настрока рабочего времени по умолчанию.
Данная настройка будет храниться в секции DefaultTimeSettings. Строки секции будут содержать временные интервалы.

2. Настройка конкретного дня.
В этом случае будет создана строка в секции Years, в подсекции Days, в подсекции WorkTime с указанием интервала.
Например, 02.01.2009 должен быть рабочим днем, с рабочим времением с 12:00 до 15:00.
При сохранении данные будут хранится следующим образом (названия секций в квадратных скобках):
[Years]: Year = 2009
[Days]: Day = 2
[WorkTime]: StartTime=12:00, EndTime=15:00

3. Настройка календаря по умолчанию
Данные настройки будут храниться в той же секции Years (аналогично п.2), но в году 1796.

Если для конкретного дня нет сохраненных настроек, берется следующее рабочее время:
Рабочие дни: с понедельника по пятницу
Рабочий график: с 9:00 до 13:00, и с 14:00 до 18:00


Скрипт состоит из 3х функций
1. Проверка, является ли данный день рабочим FIsWorkTime
2. Ф-ция рассчета длительности рабочего времени для одного дня FGetDayDuration
3. Основная ф-ция рассчета длительности между двумя датами FBusinessHours2

Алгоритм следующий.
Ф-ция FBusinessHours2 вычисляет при помощи FGetDayDuration длительность рабочего времени в первом дне интервала (до конца первого рабочего дня). Длительность рабочего времени в последнем дне интервала (от начала рабочего дня до конечного времени), и длительность во всех днях между начальным и конечным.

Поскольку данные хранятся для конкретных дней, а не для всех, то единственным способом подсчета является перебор всех дней в цикле. Это крайне не оптимальный способ. Альтернативным вариантом было бы периодическое создание "карты" рабочего расписания для абсолютно всех дней в интервале, с хранением времени в UTC в отдельной таблице. Тогда расчет длительности можно будет выполнить несколькими SELECT'ами за доли секунды.

Ф-ция FBusinessHours2 может возвращать данные в минутах или часах в зависимости от 3-го параметра @Mode.

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

Новая версия скрипта Читать дальше

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

Анонс модуля "DocsVision Сервисы файлового доступа"

Пока официальные публикации готовятся, публикую демонстрацию работы нового модуля "DocsVision Сервисы файлового доступа"

Сервисы позволяют работать с файлами в DocsVision, как с обычными файлами на ftp или http (WebDAV) ресурсе. При этом папки и карточки DocsVision представлены как папки файловой системы.
По моему мнению, это просто отличный модуль. Рекомендую обратить внимание.

Подробности в ролике.

1. Создаю карточку Внутреннего документа
2. Открываю ftp сервер по ссылке (для наглядности сделал как папку)
3. На ftp видны все папки и карточки DocsVision. Обратите внимание, что карточки отображаются так же в виде папкок
4. Копирую документ в карточку
5. Теперь, если открыть карточку, то на вкладке "Документы и ссылки" будет наш документ. Если скопировать не в карточку, а в папку, то будет создана карточка файла.




Cкачать avi Читать дальше

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

Чего не хватает?

Какого инструмента вам нехватает для обычной работы c DocsVision, или для выполнения каких-либо других задач? Мне вот приходится очень часто останавливать / перезапускать сервисы DV и IIS, для различных проверок. Сделал скрипт. А то каждый раз открывать консоли вручную очень надоедает :).
А еще мне неудобно то, что не могу просто и быстро, с выводом всех данных, просмотреть экспортированнй xml файл журнала бизнес-процесса ;). Небольшие журналы открываю в блокноте или в VisualStudio. Для больших журналов использую LogParser.

И еще всякие операции с базой на MSSQL.... В общем вопрос чего не хватает, что раздражает, и какие инструменты используете? Читать дальше

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

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

Продолжение темы комментариев.
Теперь комментарии появляются сразу после публикации. Оказывается, такая возможность была сразу.
Оцените перевод русского интерфейса blogger:

Я то подозревал, что "Ввод комментариев" означает фактическую возможность делать это. Читать дальше

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

FAQ по DocsVisionLive

Летом 2008 года был запущен демонстрационный портал DocsVision Live, который позволяет ознакомиться с DocsVision в онлайн режиме, не производя развертывание на своих серверах (подробнее можно прочитать на сайте портала).

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

Симптом 1:
При переходе по ссылке, которая получена после регистрации, в окне Internet Explorer появляется следующее сообщение:

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

Причина:
Прокси-сервер в вашей сети мешает корректной авторизации на сервере DVLive.

Решение:
Воспользуйтесь одним из нижеперечисленных способов.
1. Отключите авторизации на прокси-сервере для доступа к HTTP://DOCSVISION.HOSTING.PARKING.RU/*
2. Отключите прокси-сервер для выхода в Интернет из вашей сети



Симптом 2:
При переходе по ссылке, которая получена после регистрации, в окне Internet Explorer появляется следующее сообщение:

Загрузчик не может найти инсталляционный msi-пакет или заплатку
http://docsvision.hosting.parking.ru/DOCSVISION/Setup/prerequisites/prerequisites.msi

Причина:
Точная причина неизвестна. Возможно, установлено правило запрещающее приложению InternetExplorer загружать файлы, или внешнее приложение (антивирус, фильтр) не дает этого сделать.

Решение:
Перейдите по ссылке, указной в тексте ошибки (http://docsvision.hosting.parking.ru/DOCSVISION/Setup/prerequisites/prerequisites.msi), загрузите и установите скачанный файл. Продолжите установку DV Live по ссылке пользователя. Читать дальше

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

Поиск проблем при ошибке "Сервер не ответил в течение заданного промежутка времени"

Рассмотрим возможные причины появления сообщения "Ошибка SOAP метода, сервер не ответил в течении заданого промежутка времени". Данная ошибка означает, что либо запрос был отправлен на сервер, но до сервера не дошел, либо сервер обрабатывает запрос слишком долго.
По каким причинам это может происходить.

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

2. Проблема на сервере.
Большая нагрузка, либо, что тоже возможно, ошибка внутри платформы не позволяет выполнить запрос за отведенное время.

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

1. Работу с разными каналами связи.
Для этого нужно попробовать соединиться сначала по протоколу Net Pipes. Например, открыв Навигатор по ссылке вида http://имя_сервера/DocsVision?Transport=100

Затем по HTTP
http://имя_сервера/DocsVision?Transport=0

Если при работе через конкретный транспортный протокол ошибки нет, то данный протокол можно назначить по умолчанию в "Консоли настройки". Далее можно выяснить, почему соединение по данному протоколу работает нестабильно. В случае с Net Pipes, возможно мешает работа анитивируса. В случае с HTTP, как правило, причина кроется в хитрой конфигурации локальной сети или прокси сервера.


2. Проверить журнал сервера, на предмет ошибок, которые могут свидетельствовать либо о нагрузке на сервер, либо об проблемах в платформе.

Журнал сервера включается в консоли настройки, ветка "Сервер". Читать дальше

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

Новый виджет для блога

В блог добавил новый виджет - отображение списка комментаторов.
Удобно, что можно просмотреть все комментарии от одного человека кликнув по ссылке. Читать дальше

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

Использование LogParser для работы с журналами DocsVision

LogParser - эта утилита стала для меня открытием в прошлом году, хотя создана она еще в 2005. Её очень удобно использовать для поиска конкретной информации в больших журналах. Основная "фича" - использование языка запросов SQL к любым файлам с данными (текст, XML, CSV и др.), для получения выборки. Все возможности перечеслять не буду - их можно прочитать в инструкции.
Приведу один пример использования. Часто в журнале Workflow нужно выяснить сколько времени длился тик и сколько функций, за тик было выполнено. Ранее открывался блокнот или любой другой редактор, и делался поиск по фразе Execution takes. При этом блокнот открывая большой журнал просто подвисал на неопределенное время.

Используя LogParser сделать выборку можно за доли секунды выполнив запрос
logparser.exe "SELECT Text FROM 'путь к логу' WHERE Text LIKE '%Execution takes%'" -i:TextLine -o:Datagrid
Результат будет выведен в отдельном окне.


Утилита консольная, но поскольку есть API, то создано много GUI'шных интерфейсов для неё. Читать дальше

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

Массив Params в методе CardHost.SelectFromCard

Метод CardHost.SelectFromCard позволяет открывать карточки в режиме выбора. Например, из скрипта открывать справочник, чтобы пользователь выбрал значения.
При вызове этого метода одним из параметров является массив Params=Array(...), который всегда вызывает вопросы.
В этом массиве передаются различные данные в саму карточку.

Для разных справочников DocsVision они разные, но всегда:
Params(0) - ID секции, из которой выбираем (если в справочнике всего одна секция, то параметр не учитывается). Для контрагентов это будет выглядеть как m_oCardHost.SelectFromCard(RefPartners.ID, "Выбор организации", Array(cPartnersDepartments)) для выбора подразделения и m_oCardHost.SelectFromCard(RefPartners.ID, "Выбор организации", Array(cPartnersEmployees)) для выбора сотрудника.

Константы - идентификаторы секций:
Public Const cPartnersDepartments As String = "{c78abded-db1c-4217-ae0d-51a400546923}"
Public Const cPartnersEmployees As String = "{1a46bf0f-2d02-4ac9-8866-5adf245921e8}"

Params(1) - ID элемента, на который справочник спозиционируется при открытии, если это возможно. В данном случае - ID заранее выбранной организации или сотрудника.

Далее уникальные параметры:
Params(2) - ID организации в дереве (если не указан Params(1) при выборе сотрудников, то встанем на эту организацию)

Params(3) - если True, то режим поиска

Params(4) - X-Path Filter на организации

Params(5) - разрешает выбор сразу нескольких организации или сотрудников Читать дальше

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

Программный поиск карточек с включением удаленных в результаты поиска

При использовании UserSession.CardManager.FindCards() из Managed ObjectManager поиск не возвращает удаленные карточки в результатах поиска.
Метод FindCards в принципе не умеет возвращать удаленные карточки, т.к. он возвращает объекты CardData, а для удаленной карточки этот объект получить нельзя.

То же условие касается архивных карточек.

Для поиска таких карточек, лучше использовать не FindCards, а представление.

Пример кода:

ViewSource source = ViewSource.FromSearch(QueryText); source.ShowDeleted = true;
InfoRowCollection rows = m_oUserSession.CardManager.GetViewData(source, Guid.Empty); MessageBox.Show(rows.Count.ToString()); Читать дальше

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

Не успел

Обещано по статье каждый день, но сегодня не получится....

p.s. жду ответов на опрос в предыдущем посте =). Читать дальше

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