Как можно скрестить DocsVision и Outlook, чтобы работая только с одним приложением выполнять операции сразу в двух.
Опыт первый. Работаем с DocsVision через Outlook.
Создаем папку в Outlook
В свойствах на вкладке "Домашняя страница" указываем адрес сервера DocsVision.
Готово. В папке теперь показывается DocsVision Навигатор.
Опыт второй. "Переносим" Outlook внутрь DocsVision
Данный вариант требует, чтобы в организации был сервер Exchange и развернут Outlook Web Access
Создаем папку в DocsVision и в свойствах указываем адрес Outlook Web Access и опцию "По умолчанию отображать URL"
Готово. В папке теперь показывается Outlook.
Так же можно сделать папку с любым почтовым сервером. Например с GMail.
Читать дальше
Новая версия функции рассчета рабочих часов между двумя датами с учетом бизнес-календаря. Предыдущие версии содержали ошибку.
Итак напомню.
Бизнес календарь имеет 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.
В чем же была ошибка?
При рассчете диапазона неучитывался високосный год, из-за этого все даты после февраля были смещены.
В скрипт добавлена новая функция, которая учитывает данный сдвиг.
Скачать скрипт
Читать дальше
Довольно популярный вопрос.
Добавляем свойство в вид карточки в справочнике, и данное свойство присутствует только у вновь созданных карточек. Старые карточки не имеют этого свойства. А если добавить кнопку - функцию в виде, то данная кнопка появляется как вновых так и в старых карточках. Почему так происходит?
Дело в том, что свойства хранятся в самой карточке. Только при создании карточки по виду их настройки перечитываются из справочника и применяются. Все же остальные настройки, например, права доступа к полям, функции и т.п., получаются из справочника при каждом открытии. Поэтому, если скрыть какую либо вкладку, то она не будет показываться и в ранее созданных карточках.
p.s. А как все таки добавить новое свойство в ранее созданные карточки?
Сделать это можно, например, бизнес-процессом.
Читать дальше
Велик соблазн добавить свою библиотеку в стандартную, например "Делопроизводство". Делать этого нельзя. Как я уже писал ранее, схема карточки хранится в двух местах: базе данных и в компоненте библиотеки. Схему в базу добавить можно, через CardManager, а вот в скомпилированный компонент библиотеки добавить ничего нельзя.
Единственным правильным способом будет создание своей библиотеки.
Читать дальше
Как сделать так, чтобы у разработанной карточки был фиксированный размер окна.
Реализация зависит о того, на чем написана эта карточка
COM компонент на VB6:
Private Sub ICardUI_GetWindowSize(ByVal ActivateFlags As DVCardHost.ActivateFlagEnum, CX As Long, CY As Long, MinCX As Long, MinCY As Long, CanResize As Boolean)
' размер
CX = 7400 / Screen.TwipsPerPixelX
CY = 4000 / Screen.TwipsPerPixelY
MinCX = 4000 / Screen.TwipsPerPixelX
MinCY = 3000 / Screen.TwipsPerPixelY
' запретить изменение
CanResize = False
End Sub
Карточка на .Net
Достаточно в свойствах компонента карточки сделать равным MinSize и MaxSize
Читать дальше
При интеграциях DocsVision - SharePoint частой задачей является перенос записи о сотруднике в DocsVision. Например пользователь создает запись в SharePoint, по этой записи должна создаться карточка DocsVision, и в поле "Автор", должен быть указан сотрудник, который создал запись.
Сотрудник в SharePoint и Сотрудник в DocsVision - разные сущности, и нельзя получив значение одного типа, присвоить переменной другого. Но есть общее, что их объединяет - учетная запись:
Таким образом, если нужно получить сотрудника SharePoint и связать его с записью в DocsVision, то.
1. Получаете в переменную типа "Сотрудник SP" значение из колонки sharepoint (или из любого другого источника)
2. Получаете из этой переменной строку - учетную запись сотрудника
3. Через ф-цию "Мониторинг DocsVision" ищете по секции "Сотрудники", карточки "Справочник сотрудников" запись, у которой учетная запись совпадает с записью, полученной из переменной "Сотрудник SP"
4. Из найденной строки секции получаете идентификатор строки, которая соответствует сотруднику.
Данный идентификатор можно записывать в карточку DocsVision.
Читать дальше
Карточки в DocsVision состоят из двух сущностей: данных, структура которых описана схемой, и программного компонента, который реализует логику. Программный компонент вызывается при открытии карточки по clsid - идентификатору класса.
Если просуммировать эти факты, то возникает вопрос - можно ли подменить программный компонент стандартной карточки, которая поставляется, например, в Делопроизводстве? Ответ - да. Например, можно заменить справочник Контрагентов, реализовав свою собственную логику и интерфейс, оставив стандартную схему, что не приведет к нарушению работоспособности других карточек Делопроизводства.
Так может выглядеть вариант справочника Контрагентов
Есть одна сложность. Как я уже описал, компонент вызывается по clsid, который находится в схеме карточки. При создании своего справочника нужно clsid его компонента записать в схему справочника Контрагентов и загрузить на сервер. Но XML схема, кроме сервера находится в компоненте библиотеки (*.dll) - и там произвести замену нельзя.
В этом случае лучше поступить так - заменить clsid своего справочника на clsid оригинального справочника Контрагентов. В этом случае, при открытии будет показываться разработанный вами компонент.
Читать дальше
Ниже несколько скриншотов функциональности новой версии DocsVision 5.0, находящейся сейчас в разработке. Вы увидите это первыми! Новый справочник ссылок: Изменение темы (темы будут поддерживаться для всех справочников): Форма редактирования ссылки: Дополнительные параметры ссылки – параметры создания связанной карточки по ссылке и настройка правил сопоставления полей: Новый справочник категорий: Форма редактирования категории: Справочник сотрудников: Свойства сотрудника: Редактирование разметки формы сотрудника/подразделения. Встроенный редактор позволяет изменять местоположение, размеры, видимость, метки всех стандартных полей на всех вкладках; а также добавлять произвольное количество собственных полей (свойств), и писать для них обработчики событий (сценарии): Внимание! Представленные эскизы являются предварительными. В финальной версии функциональность может в той или иной степени измениться,. Компания DocsVision не несет никакой ответственности или обязательств в связи с публикацией данных экскизов.
Читать дальше
При разработке сценариев в карточках, новых карточек, внешних приложений и утилит для платформы DocsVision часто возникает задача программно получить идентификатор текущего пользователя из справочника сотрудников – например, чтобы автоматически заполнить поле “Автор” или “Регистратор” в создаваемой карточке. Решение этой задачи не так просто, как кажется на первый взгляд, так как сессия DocsVision привязана только к доменной учетной записи пользователя; и никак не соотносится с записью этого пользователя в справочнике сотрудников (которой, кстати, может и не быть!). Поэтому наиболее универсальным алгоритмом получения записи справочника для текущего пользователя является следующий: 1) Получить доменное имя текущего пользователя (владельца сессии). Это имя хранится среди свойств сессии (Properties) и называется “AccountName”: string account = UserSession.Properties[“AccountName”].Value.ToString(); 2) Найти по доменному имени соответствующую запись в справочнике сотрудников (если она есть) с помощью поиска:
const string RefStaffID = "6710B92A-E148-4363-8A6F-1AA0EB18936C"; const string EmployeesID = "DBC8AE9D-C1D2-4D5E-978B-339D22B32482";
SectionQuery query = ses.CreateSectionQuery(); query.ConditionGroup.Conditions.AddNew("AccountName", FieldType.String, ConditionOperation.StrEquals, account); string querytext = query.GetXml();
CardData refstaff = ses.CardManager.GetDictionaryData(new Guid(RefStaffID)); RowDataCollection users = refstaff.Sections[new Guid(EmployeesID)].FindRows(querytext);
System.Guid userID; if (users.Count > 0) { userID = users[0].Id } else { // стоит предусмотреть ситуацию, когда пользователя нет в справочнике! };
Дополнительно стоит иметь ввиду, что начиная с версии 4.1 в справочнике сотрудников допускается наличие нескольких сотрудников с одинаковой учетной записью (например, если один и тот же сотрудник числится на разных должностях в разных подразделениях). При этом, конкретная запись для работы выбирается пользователем в специальном диалоге при запуске Навигатора:
В этом случае, идентификатор текущего пользователя (выбранного в диалоге)записывается в специальное свойство сессии “CurrentUserID”:
string userID= UserSession.Properties[“CurrentUserID”].Value.ToString();
Однако нужно учитывать, что такой способ будет работать только для сессий, созданных в Навигаторе. Если сессия пользователя создана иным способом (например, из Личного Помощника или другого внешнего приложения) - то такого свойства сессии не будет существовать, и получать идентификатор пользователя нужно будет иным способом (например - описанным выше, с использованием поиска).
Читать дальше
При использовании библиотеки DocsVision.Platform.ObjectManager.dll можно обнаружить, что в ней отсутствует класс WorkflowManager. Как в этом случае запустить бизнес-процесс?
Для этого нужно воспользоваться вызовом серверного расширения Workflow.StorageServerExtension
ExtensionMethod method = session.ExtensionManager.GetExtensionMethod("WorkflowExtension", "StartProcess");
method.Parameters.AddNew("processID", ParameterValueType.Guid).Value = processId.ToString();
method.Execute();
Способ определения какие вызовы можно делать такой же, как и с другими библиотеками. Нужно подключить сборку DocsVision.Workflow.StorageServerExtension.dll к VisualStudio и посмотреть список методов через ObjectBrowser
p.s. Все про серверные расширения можно прочитать в руководстве разработчика на платформе, параграф 4.18 "Серверные расширения"
Читать дальше
Как получить пользователя, запустившего бизнес-процесс в самом экземпляре процесса.
Информация об авторе экземпляра хранится в секции "Общее описание", карточки бизнес-процесса. Поле "Автор экземпляра".
Получить карточку текущего экземпляра бизнес-процесса можно через универсальную функцию.
Затем, имея карточку экземпляра, прочитав, поле "Автор экземпляра", получаем учетную запись автора. По данной учетной записи в справочнике сотрудников можно найти строку, соответствующую сотруднику.
Скачать пример
P.s. Ого! Это уже 100й пост в нашем блоге. Небольшой юбилей :)
Читать дальше
Давненько не было новых статей :) Продолжим с небольшой. Не все обращают внимание, что в каждом бизнес-процессе есть настройка шлюза в DocsVision (Свойства бизнес-процесса / Шлюзы). Если в данных настройках указать путь к другому серверу DocsVision, то в бизнес-процессе можно работать с карточками другого сервера. Т.е. разные процессы могут работать с разными серверами.
Читать дальше
Симптом.
Загружаем библиотеку карточек, через Card Manager, в базу 4.3. Библиотека не видна в ветке "Карточки" Навигатора. При этом, карточки видны в контекстном меню "Создать", а так же просматриваются в DVExplorer
В чем причина.
В 4.3. Навигатор не отображает библиотеку в ветке "Карточки", в случае если не указан clsid компонента библиотеки.
Что нужно сделать.
Создать компонент библиотеки и указать его clsid в свойствах библиотеки карточек.
Читать дальше
|
|