Доброго времени суток всем.
Дайте, пожалуйста, ссылку на примеры (или ещё лучше - руководства) по написанию, на Javascript, модуля закладки и модуля детейла, на руководство о том, как связать модуль закладки с модулем страницы, на которой эта закладка должна быть расположена. И, если это будут всего лишь примеры, а не руководства, то чтобы были пояснения - комментарии там что ли. Но, опять же, желательно, чтобы эти комментарии были понятны для "чайника".

Нравится

4 комментария

Какая версия и какой продукт Вас интересует?

BPMonline 7.6 Bank Sales

Евгений,

Вам необходимо ознакомиться с информацией в SDK:
http://academy.terrasoft.ru/documents/?product=SDK&ver=7.6.0

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

Спасибо. Обращаюсь к SDK по ходу работы, когда есть время - много делать приходится.

Показать все комментарии

Добрый день
Просьба подсказать, где именно можно увидеть логику подсчета трудозатрат в Инциденте?

Нравится

3 комментария

Если речь о Service Desk, то см.в странице BaseServiceRequestInBPMonlineEditPage функцию GetServicePlannedWorkingTime и то место, где она вызывается, блок БП «Установить Плановые Трудозатраты и Показать Сообщение».

Добрый день! А подскажите, где собственно в интерфейсе Сервис Деска есть блок бизнес-процесса «Установить Плановые Трудозатраты и Показать Сообщение» ?

Увидела, что это ветка про 5.х.
Спасибо, тогда не нужно, думала речь про 7.х

Дарья, добрый день.

Реализацию подсчета трудозатрат, в версии продукта 7.х, есть возможность реализовать созданием БП, который будет считать время между созданием и завершением всех активностей по определенному ID обращения.

Показать все комментарии

Здравствуйте. Те, кто хорошо знает модуль BankModuleUtilites - скажите, пожалуйста, что представляет собой конструкция utilites, начинающаяся с 172-й строки в этом модуле и заканчивающаяся на 357-й строке? Это какой-то особый список функций ? Или что ?

Нравится

3 комментария

А BankModuleUtilites — это в какой версии и какой верикали системы?

Модуль BankModuleUtilites - в версии BPMonline 7.2. Используется в приложении кредитного конвеера для Гагаринского банка.

Здравствуйте. Функции, описанные в модуле BankModuleUtilities, используются в продукте bpm'online bank 7.2.2 для создания представлений модулей. Эти функции возвращают конфигурации элементов управления, на основе заданных параметров.

Показать все комментарии

Переношу JQueryInputMask из 7.2 в 7.6. Есть следующая функция:

var isInputEventSupported = function(eventName) {
                var el = document.createElement("input"),
                                eventName = "on" + eventName,
                                isSupported = (eventName in el);
                if (!isSupported) {
                        el.setAttribute(eventName, "return;");
                        isSupported = typeof el[eventName] === "function";
                }
                el = null;
                return isSupported;
}

В 7.6 интерпретатор показывает ошибку 'eventName' is already defined на строке

eventName = "on" + eventName,
Скажите, пожалуйста, что нужно сделать для исправления этой ошибки ?

Нравится

1 комментарий

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

Для устранения данного сообщения необходимо вынести присвоение из блока var:

var isInputEventSupported = function(eventName) {
	eventName = "on" + eventName;
	var el = document.createElement("input"),
		isSupported = (eventName in el);
	if (!isSupported) {
		el.setAttribute(eventName, "return;");
		isSupported = typeof el[eventName] === "function";
	}
	el = null;
	return isSupported;
}

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

Показать все комментарии

Добрый день.

Помогите разобраться, создан шаблон вида:
"Вы назначены ответсвенным по обращению № %Number% "%Subject%".
Суть обращения: %Symptoms%;
Автор обращения: %Contact.Name%"

Отправляем письмо и оно приходит уже таким:
"Вы назначены ответсвенным по обращению № Нет данныхidНет данных "Нет данных".
Суть обращения: Нет данных;
Автор обращения: Нет данных"

Как решить это?

Нравится

8 комментариев

Алеся, а какая Вас версия системы?

Версия системы 7.5.0.1473

Алеся, подскажите, вы редактировали существующий макрос, или добавляли новый?

Шаблон создан новый, а макросы я брала существующие.
Хотя письма приходящие по "коробочным" шаблонам, поступают с данными.

А идентификатор объекта, данными которого нужно запомнить письмо Вы передаете?

В FillEmailUserTask необходимо передавать параметр RecordId в котором передавать идентификатор объекта, в Вашем случае, как я понимаю Идентификатор обращения.

В FillEmailUserTask необходимо передавать параметр RecordId в котором передавать идентификатор объекта, в Вашем случае, как я понимаю Идентификатор обращения.

Александр, большое спасибо за помощь, у меня "Идентификатор обращения" брался не из того элемента, поменяла и все заработало.

Показать все комментарии

...и что делать, если вы её уже удалили.

В bpm'online 5.X есть возможность администрировать объекты по колонкам, то есть разрешать или запрещать разным пользователям системы видеть информацию в определённом поле карточки и столбце реестра.
доступ к колонкам

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

Exception Message: Элемент коллекции с идентификатором "{06CFA7D8-FED3-4D86-A396-B8094793C2AA}" не найден
Exception Type: Terrasoft.Common.ItemNotFoundException
Exception Source: Terrasoft.Core

Exception Stack Trace:
   at Terrasoft.Core.MetaItemCollection`1.GetByUId(Guid uid)
   at Terrasoft.WebApp.SysAdminUnitColumnPermissionsGridPageEventsProcess`1.FillData(DataSourceRequest dataSourceRequest)
   at Terrasoft.WebApp.BaseVirtualGridPageEventsProcess`1.ScriptGridPageRefreshRowExecute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessScriptTask.Execute(ProcessExecutingContext context, Func`2 internalExecute)
   at Terrasoft.WebApp.BaseVirtualGridPageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.WebApp.SysAdminUnitColumnPermissionsGridPageEventsProcess`1.ProcessQueue(ProcessExecutingContext context)

 

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

Чтобы вернуть работоспособность системе, достаточно удалить все записи о колонке. Смотрим Id из сообщения об ошибке и пишем с ним SQL-запрос:

 

DELETE FROM SysEntitySchemaColumnRight WHERE SubjectColumnUId = '06CFA7D8-FED3-4D86-A396-B8094793C2AA'

 

После его запуска система должна заработать нормально.

PS: если строку удалили, а свал всё равно происходит, то, вероятно, удалено несколько полей. Скопируйте Id (а он будет уже другой), запустите delete-скрипт и так до тех пор, пока не заработает.

Нравится

Поделиться

2 комментария

Надо же, кто-то еще использует 5.Х... я думала, всех давно перевели на 7-ку. Или что там у вас актуально, 9-ка? :)

Актуальная версия 7.7. Но кто-то сейчас и Х25 использует.

Показать все комментарии

Добрый день!

В странице раздела использую переопределенный метод GetModuleRowConfig со следующим кодом:

var configs = base.GetModuleRowConfig( module );

string primaryColumnName = module.Schema.PrimaryColumn.Name;
string primaryColumnValue = module.GetColumnValue(primaryColumnName).ToString();
var config = new DataSourceRowConfig(primaryColumnValue);

string VIPColumnValue = "";

Select select = new Select( UserConnection )
.Column("VipClientMarkId")
.From("Contact")
.Where("Contact", "Id")
.IsEqual( new QueryParameter( module.GetTypedColumnValue( "DebtorContactId" ) ) ) as Select;

VIPColumnValue = select.ExecuteScalar();

if ( VIPColumnValue != null ) {
configs.AddConfig( new DataSourceRowBackgroundColorConfigValue( "Salmon" ));
}

return configs;

При этом цвет фона меняется у всей строки, подскажите можно ли сделать так, чтобы в реестре менялся цвет только конкретного поля?

Нравится

3 комментария

Да, посмотреть, как это сделано, можно на странице «RecordAllChangesGridPage» (журнал изменений):

		public virtual DataSourceRowConfig GetRowConfig(Entity row) {
			if (!HighlightColumnsCheckPerformed) {
	HighlightColumns = GetColumnsHighlightState();
	HighlightColumnsCheckPerformed = true;
}
string primaryColumnName = row.Schema.PrimaryColumn.Name;
string primaryColumnValue = row.GetColumnValue(primaryColumnName).ToString();
var config = new DataSourceRowConfig(primaryColumnValue);
Guid changeType = row.GetTypedColumnValue<Guid>("ChangeTypeId");
string backgroundColor;
if (changeType == new Guid("A852C33F-0BDD-E011-92C3-00155D04C01D")) {
	backgroundColor = "Green";
} else if (changeType == new Guid("AA52C33F-0BDD-E011-92C3-00155D04C01D")) {
	backgroundColor = "Red";
} else {
	backgroundColor = "Blue";
}
var cellsBackground = new Dictionary<string, DataSourceRowColumnBackgroundColorConfigValue>();
if (PreviousRow != null && HighlightColumns) {
	var previousRow = PreviousRow as Entity;
	foreach (var column in row.Schema.Columns) {
		if ((column.Name != "ModifiedOn") && (column.Name != "ModifiedBy") 
			&& (column.Name != "ChangeTrackedBy") && (column.Name != "ChangeTrackedOn")
			&& (column.Name != "ChangeType")) {
			object currentValue = row.GetColumnValue(column.Name);
			object prevValue = previousRow.GetColumnValue(column.Name);
			if (!Object.Equals(currentValue, prevValue)) {
				cellsBackground.Add(column.Name, new DataSourceRowColumnBackgroundColorConfigValue("#FFF30F"));
			}
		}
	}
}
PreviousRow = row;
config.AddConfig(new DataSourceRowColorConfigValue(backgroundColor));
config.AddConfig(new DataSourceRowColumnsBackgroundColorConfigValue(cellsBackground));
return config;
		}

Алксандр, а если поле справочное, как тогда? (т.е. в бд поле DebtorContactId, а в карточке и реестре отображается Физ лицо)

А в чём разница? В моём примере в цикле перебираются колонки и выкидывается ModifiedBy (полное название ModifiedById), оно тоже справочное.

Показать все комментарии

Добрый день! Какие цвета можно использовать в конфигах( если можно ссылочку)

Использую следующие кофиги:
config.AddConfig(new DataSourceRowColorConfigValue("цвет"));
config.AddConfig(new DataSourceRowBackgroundColorConfigValue("Цвет"));

Цвета пока беру от сюда http://www.stm.dp.ua/web-design/color-html.php
Не все подходят..

Нравится

2 комментария

Можно указывать цвета в формате:

#A0A0A0

Так можно указать любой цвет.

"Зверев Александр" написал:

Можно указывать цвета в формате:

#A0A0A0

Так можно указать любой цвет.

Спасибо!

Показать все комментарии

Необходимо применить фильтр к комбобоксу StatusEdit в карточке редактирования задачи.

При применении следующего кода:

Page.StatusEdit.PrepareLookupFilter += delegate (object sender, ComboBoxEditEventArgs e) {
var InWorkStatusId = "394D4B84-58E6-DF11-971B-001D60E938C6";
Collection> filters = e.Filters;
filters.Add(new Dictionary {
{"comparisonType", FilterComparisonType.Equal},
{"leftExpressionColumnPath", "Id"},
{"useDisplayValue", false},
{"rightExpressionParameterValues", new object[] {InWorkStatusId}}});
};

При выборе выпадающего списка происходит следующая ошибка:

Exception Message: The control 'PageContainer_StatusEdit' does not have an AjaxEvent with the name 'InternalPrepareLookupFilter' or the handler is absent

Что не так делаю?

Нравится

18 комментариев

Попробуйте так:

Page.StatusEdit.PrepareLookupFilter += delegate (object sender, ComboBoxEditEventArgs e) {
var InWorkStatusId = "394D4B84-58E6-DF11-971B-001D60E938C6";
var filters = e.Filters;
filters.Add(new Dictionary<string, object> {
{"comparisonType", FilterComparisonType.Equal},
{"leftExpressionColumnPath", "Id"},
{"useDisplayValue", false},
{"rightExpressionParameterValues", new object[] {InWorkStatusId}}});
};

Та же самая ошибка вылетает.

Exception Message: The control 'PageContainer_StatusEdit' does not have an AjaxEvent with the name 'InternalPrepareLookupFilter' or the handler is absent

У меня работает нормально. Сообщите больше информации. Может, кроме этого в другом месте ещё какие-то фильтры на это поле есть?

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

А надо на Init.

Каким образом тогда в скрипте Init получить следующее значение:

var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue("Id");

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

Логика внутри делегата выполняется не на открытии, а в момент нажатия на лукап.

Почему тогда происходит ошибка:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в Terrasoft.WebApp.TaskEditPageEventsProcess`1.ChildInitAfterParentScriptExecute(ProcessExecutingContext context)

при получении Id открываемой активности:

var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue("Id");

???

И под скриптом Init подразумевался ChildInitBeforeParentScript ???

Функция GetTypedColumnValue — это generic, там надо указать тип в угловых скобках. Вроде:

Guid accountId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("AccountId");

Можно и before, и after.

Угловые скобки вырезал парсер форума, они там есть:

var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("Id");

т.е. ошибка с этим не связана.

Посмотрите в других разделах как устроено наложение фильтров и сделайте по аналогии. Там несложно.

Вот пример:

			Page.ManagerLookupEdit.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) {
	Collection<Dictionary<string, object>> filters = e.Filters;
	Guid accountId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("AccountId");
	filters.Add(new Dictionary<string, object> { 
       {"comparisonType", FilterComparisonType.Equal}, 
       {"leftExpressionColumnPath", "Account.Id"}, 
       {"useDisplayValue", false}, 
       {"rightExpressionParameterValues", new object[] {accountId}}});
};

Если нужно Id записи, карточка которой открыта, то можно просто:

           {"rightExpressionParameterValues", new object[] {Page.DataSource.ActiveRowPrimaryColumnValue.ToString()}}});

Между нами, есть некоторое недопонимание, если использовать напрямую т.е. просто вставить ваш код фильтра в скрипт, фильтр применяется, тут проблем нет.

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

var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("Id");

Условие должно проверяться внутри делегата.

if(NeedFilters) {
filters.Add(new Dictionary<string, object> {

Применил :

var TaskId = Page.DataSource.ActiveRowPrimaryColumnValue.ToString();

На выходе получил значение TaskId:

00000000-0000-0000-0000-000000000000

Возможно, запись ещё не сохранена.

Я открываю уже существующую запись.

Дело в том, что :

var TaskId = Page.DataSource.ActiveRowPrimaryColumnValue.ToString();

получает Id активности только если его перенести в ScriptAfterBasePageLoadComplete, в скриптах Init всегда нулевые значения.

Проверяйте значение поля внутри делегата.

Все работает. Большое спасибо.

Показать все комментарии

Здраствуйте,

Хочу с вами посоветоваться так как не могу найти решение следующий проблемы.
Пользователь портала при создание нового запросе через свой личный кабинет на вкладку «Комментарии» добавляет 2 файла. После классификации сотрудник технической поддержки берет данный запрос в работу. Но после этого пользователь портала передумывает и удаляет 1 из файлов на вкладке «Комментарии». Это не где не отслеживается. Не системный администратор и не сотрудник тех. поддержки не могут доказать что, раньше было прикреплено 2 файла вместо 1-го текущего файла.

С уважением,
Гюнель

Нравится

1 комментарий

Решение простое - установите на объект "Файлы и ссылки чего-то-там" признак "Администрируется по операциям".
Затем для пользователей портала ставите чтение и добавление, на удаление и изменение запрет.

Показать все комментарии