Симптом.
Настроена отправка текста задания в виде HTML (функция "Задание" бизнес-процесса). Создано собственное преобразование для текста задания. При этом письмо приходит без шаблона оформления.
В чем причина.
Причина заключается в некоторых параметрах оформления шаблона, которые мешают применению его к xml данным.
Что нужно сделать.
В тексте шаблона нужно заменить строку
<body style="padding-top: 0px; padding-left: 0px">
на
<body>
Читать дальше
В карточках конструктора решений для управления файлами используется свойство «Список файлов». Я приведу несколько примеров кода, в которых демонстрируется, как работать с этим элементом управления программно. Для всех операций понадобится получить элемент управления файлами.
//создаем экземпляр вспомогательного класса, он нам понадобится для поиска элемента свойства LayoutHelper layoutHelper = new LayoutHelper(CardControl.LayoutControl, CardControl.BarManager, Session, CardData.Type.Id); //получаем элемент свойства ICustomPropertyItem propitem = layoutHelper.GetCustomPropertyItem("fileList"); //если он null, то выходим if(propitem == null) return; //получаем элемент управления файлами FileListView fileListView = propitem.PropertyControl as DocsVision.BackOffice.View.WinForms.Controls.FileListView; //если он null (вдруг это свойство не "Список файлов"), то выходим. if(fileListView == null) return;
После того как элемент управления файлами получен, можно выполнять интересующие нас операции.
1)Добавление файла.
a) явно передавая пути к файлам, которые необходимо добавить в список
//создаем переменную, типа "Список", записываем в нее пути к файлам, которые нужно добавить System.Collections.Generic.List files = new System.Collections.Generic.List(); //например, в данном случае добавляется всего 1 файл (указывается полный путь к файлу) files.Add(@"c:\dvmanagement.lic"); //вызываем метод добавления файлов у элемента управления файлами fileListView.AddFiles(files);
//в этом методе есть небольшая недоработка, чтобы ее обойти, воспользуемся средствами рефлексии //вызываем Protected метод OnListChanged с помощью Reflection, после его вызова элемент управления понимает, что нужно сохранять данные Type filiListViewType = fileListView.GetType().BaseType; if(filiListViewType == null) return; MethodInfo onListChangedMethidInfo = filiListViewType.GetMethod("OnListChanged", BindingFlags.Instance | BindingFlags.NonPublic); if(onListChangedMethidInfo == null) return; onListChangedMethidInfo.Invoke(fileListView, new object[1]{ EventArgs.Empty });
б) с помощью выбора файлов с файловой системы //вызываем метод добавления файлов у элемента управления файлами. появится диалог выбора файлов. после нажатия на Ok файлы добавятся в список. fileListView.AddFiles();
в) с помощью выбора карточки файла из DocsVision
//будет показан диалог выбора карточки файла. параметр false определяет, показывать только карточки, не являющиеся шаблонами fileListView.AddCardFile(false)
2) Удаление файла(ов)
Удалить выбранные в списке файлы можно следующим образом
fileListView.DeleteFiles();
3) Сохранение файлов на файловую систему
a) всех файлов
fileListView.SaveFiles();
б) выбранных файлов
fileListView.SaveFiles(fileListView.SelectedFileReferences);
4) Открытие файла
//булевский флаг readOnly определяет, открывать файл на редактирование или только чтение fileListView.OpenSelectedFile(readOnly);
5) Блокировка выделенного файла
fileListView.CheckOut();
6) Снятие блокировки c выделенного файла с сохранением изменений
fileListView.CheckIn();
7) Снятие блокировки c выделенного файла с потерей изменений
fileListView.UndoCheckOut();
8) Добавление комментария к выделенному файлу
//будет показан специальный диалог fileListView.AddFileComment();
9) Переименование выделенного файла
fileListView.Rename();
10) Вставить файл из буфера клавиатуры
fileListView.PasteFromClipboard();
Примечание.
1) Необходимо добавить ссылки на сборки DocsVision.TakeOffice.ObjectModel.dll DocsVision.Platform.CardLib.dll DevExpress.Utils.v9.2.dll DevExpress.Data.v9.2.dll DevExpress.XtraLayout.v9.2.dll
2) Необходимо в код скрипта в заголовок вставить набор директив "using" using System; using System.Reflection; using System.Windows.Forms; using DocsVision.BackOffice.Model; using DocsVision.BackOffice.Model.CardProperties.Entities; using DocsVision.BackOffice.View.WinForms; using DocsVision.BackOffice.View.WinForms.Controls; using DocsVision.BackOffice.View.WinForms.PropertyControls; using DocsVision.BackOffice.View.WinForms.LayoutItems; using DocsVision.BackOffice.View.WinForms.Helpers; using DocsVision.TakeOffice.ObjectModel; using DocsVision.TakeOffice.ObjectModel.FileList; using DocsVision.TakeOffice.ObjectModel.File; using DocsVision.Platform.ObjectManager;
Читать дальше
В SharePoint 2010 доработаны средства определения неисправностей. Очень хороший доклад на эту тему http://www.techdays.ru/videos/2765.html
Но я хочу выделить из этого одну часть. При возникновении ошибок с компонентами модуля "Расширения SharePoint, сайт отображает окно:
В этом случае необходимо открыть журнал SharePoint, который расположен в папке Programm Files\Common Files\Microsoft Shared\WebServer Extensions\14\LOGS. В данном журнале нужно найти запись об ошибке соответствующую "Идентификатору взаимосвязи" (Correlation ID).
В тексте ошибки будет более детальное описание.
Читать дальше
Добрый день!
Эта заметка предназначена для тех, кто пишет код для работы с данными карточек DV с помощью объектной модели, предоставляемой платформой (сборка DocsVision.Platform.ObjectManager.dll). Практически сразу разработчик сталкивается с необходимостью искать в документации или с помощью утилиты CardManager какие-то непонятные гуиды и прочие строковые константы, используемые в описании карточки. Естественно, эти строки оформляются как константы и т.д., но за актуальностью значений приходится следить, опечатки обнаруживаются только на этапе тестирования (а хотелось бы при компиляции). Очевидно, с этими трудностями когда то столкнулись и разработчики DV и чтобы облегчить свое существование разработали инструмент, генерирующий удобную объектную модель для доступа к константам описания карточки. Этот инструмент можно использовать из командной строки или интегрировать в MS Visual Studio версии 8.0 - 10.0. После этого про гуиды можно больше не вспоминать!
Пример файла, сгенерированного с помощью этого инструмента можно найти в проекте, предоставляемом вместе с руководством разработчика (например, Samples\Cards\TestCardLib\Test\Constants\TestCard.cs)
Для запуска из командной строки надо воспользоваться командой ConstGenerator.exe /i:YourCard.xml
Список параметров командной строки можно посмотреть запустив генератор с ключом /?: ConstGenerator.exe /?
Для интеграции с MS VS надо зарегистрировать сборку с помощью команды regasm: regasm ConstGeneratorTool.dll /codebase
После этого надо добавить в проект файл с описанием карточки и указать в поле CustomTool значение DVConstGenerator:
Генерация будет выполняться автоматически при сохранении файла с описанием карточки или по команде контекстного меню RunCustomTool :
Скачать генератор констант можно тут
Кроме того, в новой версии генератора констант добавлена регистрация в 10-й студии.
Читать дальше
Скрипт карточки на кнопку-функцию может вернуть набор значений, которые влияют на дальнейшую логику работы карточки. Об этом подробно написано в документации разработчика. Я же хочу немного прокомментировать данные значения. Пояснения актуальны для DocsVision 4.5, 4.5 SR1 и 4.5 SR2
1 - кнопка становится недоступной
- кнопка-функция блокируется, и становится серой
2 - обновить элементы управления карточки
- Данные из CardData карточки будут отображены в элементах управления формы. Во всех полях, за исключением полей на основной вкладке. На ней они останутся без изменения.
4 - установка режима “только чтение” для карточки
- карточка будет переведена в режим "Только чтение". Пользователь не сможет внести изменения в карточку
8 - закрытие карточки
- карточка будет закрыта. При этом если в ней были сделаны изменения, то пользователю будет отображен диалог с предложением сохранения изменений.
Так же будет вызвано событие "закрытие карточки"
16 — немедленное сохранение изменений
- данные из CardData карточки будут отправлены на сервер.
32 — установка флага изменения данных карточки
- при возврате данного значения карточка будет считать, что в неё внесены изменения. При закрытии вызовется соответствующий диалог.
64 — установка флага сохранения изменений
- карточка будет считать, что все изменения сохранены. Диалог при закрытии не будет отбражен. Значения 32 и 64 исключают друг друга.
1024 – установка флага изменения состояния
- карточка отобразит измененное состояние. Т.к. данное поле находится на основной вкладке, то для того, чтобы состояние отобразилось нужен данный флаг
4096 – загрузить номер в карточку (если он был изменен)
- карточка отобразит измененный номер. Т.к. данное поле находится на основной вкладке, то для того, чтобы состояние отобразилось нужен данный флаг
Читать дальше
В карточках конструктора решений есть свойство типа "Нумератор". Оно позволяет пользователю выделить номер. Но как решить задачу автоматического выделения номера, например, при открытии карточки?
В текущих версиях конструктора сделать это можно только программно, и задача не тривиальная. поэтому приведу готовый кусок кода.
Обработчик события AfterActivate - будет выполнен сразу после открытия карточки.
на С#
// обработчик события AfterActivate - будет выполнен сразу после открытия карточки
private void cardControl_AfterActivate(System.Object sender, System.EventArgs e)
{
// получаем свойство типа "Нумератор". Нужно указать название свойства
var numeratorProperty = GetCardProperty("Регистрационный номер");
// если номер уже задан, то выходим из метода, ничего не делая
if (numeratorProperty.Value != null)
return;
// получаем атрибут правила и его значение (идентификатор)
var ruleAttribute = numeratorProperty.Description.GetAttribute("Rule");
Guid? ruleId = (Guid?)ruleAttribute.Value;
// с помощью преобразователя данных создаем новый номер по правилу
var numeratorMapper = new DocsVision.BackOffice.Model.CardProperties.DataAccess.NumeratorNumberMapper(
Session, CardData.Id, DomainObject.NumbersSectionId.Value);
var number = numeratorMapper.Create(ruleId.Value);
// устанавливаем новое значение свойства
numeratorProperty.Value = number;
// обновляем элементы карточки, чтобы отобразить новое значение
RefreshControls();
}
// вспомогательный метод поиска элемента по названию
private CardProperty GetCardProperty(string propertyName)
{
foreach (CardProperty property in PropertyController.CardProperties)
{
if (property.Name == propertyName)
return property;
}
return null;
}
Vb.net
Private Sub cardControl_AfterActivate(sender As System.Object, e As System.EventArgs)
' получаем свойство типа "Нумератор"
Dim numeratorProperty AS DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty = GetCardProperty("Регистрационный номер")
' если номер уже задан, то выходим из метода, ничего не делая
If numeratorProperty.Value IsNot Nothing Then
Return
End If
' получаем атрибут правила и его значение (идентификатор)
Dim ruleAttribute as DocsVision.BackOffice.Model.Layouts.Entities.PropertyAttribute = numeratorProperty.Description.GetAttribute("Rule")
Dim ruleId As System.Nullable(Of Guid) = CType(ruleAttribute.Value, System.Nullable(Of Guid))
' с помощью преобразователя данных создаем новый номер по правилу
Dim numeratorMapper as DocsVision.BackOffice.Model.CardProperties.DataAccess.NumeratorNumberMapper = New DocsVision.BackOffice.Model.CardProperties.DataAccess.NumeratorNumberMapper(me.Session, CardData.Id, DomainObject.NumbersSectionId.Value)
Dim number as DocsVision.BackOffice.Model.CardProperties.Entities.NumeratorNumber = numeratorMapper.Create(ruleId.Value)
' устанавливаем новое значение свойства
numeratorProperty.Value = number
' обновляем элементы карточки, чтобы отобразить новое значение
me.PropertyController.RefreshControls
End Sub
' вспомогательный метод поиска элемента по названию
Private Function GetCardProperty(propertyName As String) As DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty
For Each [property] As DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty In PropertyController.CardProperties
If [property].Name = propertyName Then
Return [property]
End If
Next
Return Nothing
End Function
Читать дальше
В конструкторе решений есть поля типа "Дата", для которого можно выбрать значение по умолчанию - "Сегодня". Но если нужно добавить дату со смещением? Например, как добавить несколько дней?
Для этого достаточно указать значение
Сегодня+NД
где N - нужное количество дней
Читать дальше
В версии DocsVision 4.5 есть встроенный функционал проверки длительности выполнения определенных операций. Настройка выполняется, как обычно, в консоли, параметр "Время отклика сервера"
В случае если данные значения не выполняются, то пользователь видит в Навигаторе предупреждение (см. самый первый скриншот).
Как быть пользователям предыдущих версий. Конечно, переходить на 4.5 :)
Но можно также сделать подобный функционал проверки в виде внешней утилиты.
Каким функционалом должен обладать данный инструмент.
1. Проверять время создания сессии
2. Проверять длительность получения данных карточки
3. Проверять время выполнения поиска и т.п.
В случае невыполнения указанных параметров сигнализировать о проблеме.
Пример подобной утилиты я выложил на ftp. В архиве утилита, скомпилированная для DocsVision 4.1, инструкция, и исходный код.
Комментарий для желающих доработать. Основные методы проверки реализованы в библиотеке DVCheckObjects. Т.е. можно написать, например, консольное приложение, которое будет использовать данную библиотеку, и назначить это приложение как задачу в Task Scheduler на сервере.
Читать дальше
Програмно завершить задание бизнес-процесса можно следующим образом
1. В секции "Performing" установить
а) в поле TaskState значение 5 (исполнено)
б) в поле ActualEndDate текущую дату (дату завершения)
2. В секции "CurrentPerformer" установить
а) в поле PerformerState значение 5 (исполнено), если задание было делегировано, то 13 (возврат с делегирования)
Если задание имеет подчиненные задания, то их необходимо либо удалить, либо завершить. Сделать это нужно, для того, чтобы не оставалось "висящих" дочерних заданий и процессов, при завершении родительского задания.
Так же нужно завершить задания контроллеров, если такие есть.
Читать дальше
Задача сохранения данных карточки бывает двух видов: сохранение данных из контролов в CardData, и сохранение CardData на сервер.
Решением первого случая будет вызов
this.PropertyController.Save();
Для сохранения данных на сервер нужно воспользоваться неким трюком. Для решения подошел бы метод SaveData, используемый внутри карточки, но он не является открытым (вероятно, это будет изменено в следующих версиях). Сейчас им можно воспользоваться следующим способом:
typeof(BaseCardControl).GetMethod("SaveData", System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance).Invoke(CardControl, null);
Читать дальше
Запустить бизнес-процесс из скрипта на событие карточки, создаваемой в конструкторе решений, можно тем же способом, что описывался ранее.
Читать дальше
При открытии Навигатора, либо при программном соединении с сервером вы можете встретить сообщение об ошибке "Не удалось разобрать SOAP сообщение, полученное от сервера". В чем может быть причина.
Данное сообщение об ошибке отображается в случае если ожидается ответ от сервера в определенном формате, а приходит что-то другое.
В каких случаях это может быть?
1. Сервер возвращает какую-либо страницу об ошибке: 403, 404
2. Подключение идет по неверному адресу (к другому сайту и т.п.)
Для проверки нужно под пользователем, под которым производится соединение открыть страницу http://server/DocsVision/StorageServer/StorageServerService.asmx
Либо можете другим способом. Переведите транспортный протокол в консоли настройки на HTTP+SOAP. Затем запустите на машине, на которой работает ваш код какой-либо HTTP отладчик. Например Fiddler. И посмотрите, какой ответ возвращает сервер.
В версии DocsVision 4.5, если соединение происходит через ISA сервер вы сможете столкнуться с другой причиной данной ошибки. Но об этом в следующем посте.
Читать дальше
Ранее разработчики при отладке скриптов в некоторых случаях встречались с ситуациями, когда поля карточек очищались, либо высвобождался номер.В версии 4.5 была несколько изменена логика поведения скриптов карточек.
1. Из скрипта на событие "изменение свойства" записать новое состояние невозможно, т.к. оно всегда перезаписывается на то, что в данный момент выбрано в UI.
Смену состояния надо делать в скрипте кнопки тулбара (функция), сохранения или закрытия.
Для кнопки тулбара есть специальный флаг DoEvent = 1024 показывающий то, что состояние было изменено.
2. При возврате DoEvent=16 - сохранение изменений, значения из вкладки "Основная" будут записаны из UI в CardData. Т.е. если вы в скрипте на кнопку-функцию изменили, например Название карточки, а затем вернули DoEvent=16, то ваши изменения будут затерты значениями из UI. Решением для такого случая будет перенос кода, который изменяет поля, на событие "сохранение". Событие "Сохранение" теперь вызывается каждый раз при возврате DoEvent=16
3. Если карточка только что создана, а в скрипте на кнопку-функцию вы возвращаете флаг DoEvent=64 (установка признака сохранения), то при первом закрытии так же будет отображаться диалог с предложением сохранить карточку. Дело в том, что в 4.5 при первом сохранении создается ярлык на карточку (чего не делается при указании флага 64). Следовательно появляется данный диалог
Читать дальше
В конструкторе решений для управления содержимым дайджеста карточки применяется XSLT-преобразование. Если вы не знакомы с этой технологией, не беда, есть несколько простых правил, которых в большинстве случаев хватит за глаза и за уши. Для того, чтобы описать дайджест карточки, необходимо в конструкторе, в режиме редактирования дизайна карточки, выбрать саму карточку и атрибут дайджест, откроется редактор дайджеста.  Чтобы вывести в дайджест значение поля, необходимо написать конструкцию вида: <xsl:value-of select="//Имя_секции/@Имя_поля"/>
А для вывода в дайджест значения свойства:
<xsl:value-of select="//CustomPropertiesRow[@Property_Name='Имя свойства']/@Value"/>
Теперь продемонстрируем пример дайджеста, выводящего данные о названии маршрута и его типе из карточки Маршрута: Маршрут "<xsl:value-of select="//CustomPropertiesRow[@Property_Name='Название маршрута']/@Value"/>". Тип: <xsl:value-of select="//Main/@RouteType"/> Результат настройки дайджеста будет выглядеть так:
Маршрут "Для согласования юр.док-ов". Тип: последовательный
Читать дальше
В Конструкторе есть простой и эффективный механизм связанных полей, позволяющий автоматически подтягивать значения по ссылке из других карточек и справочников. Однако этот механизм позволяет лишь показывать данные из других объектов, не позволяя их отредактировать и сохранить. Если стоит задача вытащить данные по ссылке в контролы, чтобы позволить затем пользователю их редактировать, то придется немного потрудиться... Задача. Предположим, у нас есть карточка маршрута согласования и карточка документа, где это маршрут используется. Карточка маршрута служит для описания типовых маршрутов и содержит список согласующих лиц, тип маршрута (последовательный, параллельный) и другие параметры. В документе, после выбора типового маршрута хочется дать пользователю возможность отредактировать список согласующих лиц и тип маршрута.Решение. В карточке документа размещаем 3 основных контрола: - Выбор маршрута ( контрол типа Ссылка на карточку) - Тип маршрута ( контрол типа Группа радиокнопок) - Согласующие лица ( контрол типа Сотрудники) а также 2 вспомогательных контрола: - Тип маршрута Вспомогательный ( контрол типа Группа радиокнопок) - Согласующие лица Вспомогательный ( контрол типа Сотрудники) Вспомогательные контролы делаем невидимыми (устанавливая атрибут Visibility в Invisible или EmptySpace) и привязываем по ссылке к соответствующим полям карточки маршрута согласования, выбираемой в контроле Выбор маршрута (как это сделать, описано в руководстве администратора). Затем пишем следующий скрипт для события ControlValueChanged контрола Выбор маршрута: using System; using System.Windows.Forms; using DocsVision.Platform.ObjectManager; using DocsVision.BackOffice.View.WinForms; using DocsVision.BackOffice.Model; namespace ScriptNamespace { public class ScriptClass { public void Execute(UserSession session, CardData cardData, baseCardControl cardControl) { // Получение значения связанного свойства, которое на форме сделано невидимым. // Его единственная задача - получить значение по ссылке object propertyValue = cardControl.PropertyController.GetPropertyValue("Тип маршрута Вспомогательный"); // Запись значения в свойство cardControl.PropertyController.UpdateProperty("Тип маршрута", propertyValue); // То же для контрола типа Список сотрудников object propertyValue2 = cardControl.PropertyController.GetPropertyValue("Согласующие лица Вспомогательный"); cardControl.PropertyController.UpdateProperty("Согласующие лица", propertyValue2); // Обновление элементов управления cardControl.PropertyController.RefreshControls(); } } }
Все! Теперь после выбора ссылки на карточку маршрута можно редактировать тип маршрута и список согласующих лиц.
Читать дальше
В продолжение статьи.
Для переноса базы DocsVision 4.5 с MS SQL Enterprice (Developer), на редакцию MS SQL Standart. Необходимо предварительно выполнить специальный скрипт, а затем создавать и переносить бекап.
Скачать скрипт для DocsVision 4.5
Скрипт для предыдущих версий 4.1 и 4.3
Читать дальше
Начиная с Windows Server 2008 в службе терминалов появилась возможность создавать ярлыки для приложений терминального сервера. Так называемые RemoteApp ( http://technet.microsoft.com/ru-ru/library/cc731340%28WS.10%29.aspx). Это позволяет работать в терминальной сессии с одним определенным приложением. Я опишу как создать такой ярлык для Навигатора DocsVision, тем более, что в этом случае есть особенности.
1. Открываем консоль RemoteApp Manager на сервере терминалов (в данном примере это Windows 2008 R2)
2. В данной консоли выбираем Add RemoteApp Programs
3. В списке приложений нам предлагаю указать нужное. И тут есть одна особенность. Логичным выглядит выбор ярлыка DocsVision Навигатор (C:\Program Files\DocsVision\Platform\4.5\Client\Navigator.url). Однако, здесь поджидает сюрприз. Если создать таким образом RemoteApp, то при открытии пользователем, оно будет закрываться автоматически через 10 - 15 секунд. Эта особенность не связана с ярлыком Навигатора, а происходит с любыми ярлыками на интернет ресурсы. Для проверки можете создать ярлык (*.url) на сайт, например, dvprofessionals.blogspot.com. Разверните его как RemoteApp. Как только пользователи откроют его, он через 10 секунд закроется.
Поэтому в списке приложений нужно указать Internet Explorer (iexplore.exe). Причем, если сервер 64 битный, то нужно выбирать 32 разрядную версию Internet Explorer, которая находится в папке C:\Program Files (x86)\Internet Explorer.
3. После выбора приложения Internet Explorer мастер создания завершит работу. Дальше в списке приложений находим только что созданное и вызываем в контекстном меню свойства.
4. В свойствах указываем опцию Always use the following command-line arguments, и в строке параметров указываем адрес сервера DocsVision
5. Все, осталось только создать ярлык. В свойствах выбираем Create .rdp File
Файл появится в папке C:\Program Files\Packaged Programs. Теперь достаточно передать его пользователям и они смогут работать в терминальной сессии с Навигатором, как с RemoteApp
Читать дальше
Если через "Универсальную функцию / Шлюз SharePoint / Элемент общего списка / Добавить вложение из файловой системы" попытаться добавить файл у которого есть две точки перед расширением (например test..txt), то при добавлении будет ошибка:
"При выполнении универсальной функции 'Добавить файловое вложение из файловой системы' произошла ошибка.Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown."
По данному сообщению понять причину нельзя. Однако, она тривиальна. В SharePoint нельзя загрузить такие файлы. Можно попробовать выполнить это непосредственно из интерфейса портала.
Читать дальше
В SharePoint у элемента общего списка может быть поле типа "Гиперссылка". У данного поля есть два свойства: URL и описание.
Как при помощи бизнес-процесса заполнить это описание?
Ответ можно получить, попробовав прочитать это поле. Если значение из данной колонки записать в строковую переменную, то можно увидеть что оно будет сохранено в виде "URL, Описание". Значит, чтобы добавить описание нужно точно такую же строку записать в поле этой колонки.
Воспользуемся ф-цией универсального обмена данными. Источник строка вида "http://docsvision.com, DocsVision". Приемник элемент общего списка документов. В качестве свойства указываем название колонки:
Читать дальше
Рассмотрим пример заполнения свойства типа "Текст" при открытии карточки.
При помощи утилиты CardGenerator создано описание библиотеки и карточки. Описание библиотеки загружено в базу. В конструкторе решений на нашу карточку добавляем несколько полей. Пусть это будет карточка сообщения, у которой будут поля "От", типа "Сотрудник", "Кому", типа "Сотрудник", и "Текст", типа "Текст".

Для того, чтобы назначить скрипт на открытие необходимо в окне "Структура разметки" выбрать узел с карточкой, и открыть вкладку "Свойства".
У карточки довольно много свойств и событий. Это может ввести в заблуждение. Например, какое событие использовать для создания скрипта на открытие: CardActivating, CardActivated, или AfterActivate? Для подобного скрипта нужно использовать событие AfterActivate - оно в списке выделено.
Кликаем на это поле, и открывается окно редактирования скрипта.
Разработчики скриптов карточек и сценариев БП, часто просили реализовать подсветку. И при создании Конструктора решений эти пожелания учтены. В нашем редакторе скриптов есть не только подсветка, но и InteliSense!
Для заполнения поля "Текст" пишем такой сценарий.
using System;
using System.Windows.Forms;
using DocsVision.Platform.ObjectManager;
using DocsVision.BackOffice.View.WinForms;
using DocsVision.BackOffice.Model;
namespace ScriptNamespace
{
public class ScriptClass
{
public void Execute(UserSession session, CardData cardData, BaseCardControl cardControl)
{
cardControl.PropertyController.UpdateProperty("Текст","Салют!");
cardControl.PropertyController.RefreshControls();
}
}
}
"Refresh" нужен, чтобы поля обновились.
Важно. После внесения изменений в карточку необходимо перезапустить сервисы DocsVision.
Готово. При открытии карточки наше поле заполняется.
Читать дальше
|
|