Добрый день

Есть шаблон для отправки уведомлений (напр., о регистрации Инцидента). В этом шаблоне мне нужно сделать вывод данных не из %Symptoms% , а из %Notes%. Я внесла это изменение в шаблон - но в самом уведомлении подтянулось "Нет данных" (хотя в Инцидент.Заметки имеется текст!). Подскажите, в чем моя ошибка? Заранее спасибо

Нравится

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

Notes — не совсем обычное поле, в нём хранится форматированный текст. Можете показать, как в нему в шаблоне обращаетесь?

в шаблоне обращаюсь - %Notes%

- это как к колонке с объекте Инцидент и запрос на обслуживание

Татьяна, логика заполнения макросов значениями задана в схеме FillEmailTemplateUserTask в куске кода:

string dataEmpty = "Нет данных";
foreach (var columnNamePass in subjectMacros) {
	string columnName = string.Empty;
	string value = string.Empty;
	try {
		columnName = columnNames[columnNamePass];
		value = (entity.GetColumnValue(columnName) ?? dataEmpty).ToString();
	} catch {
		//value = "<Колонка [" + columnNamePass + "] не найдена>";
		value = dataEmpty;
	}
	Subject = Subject.Replace("%"+columnNamePass+"%",value);
}
foreach(var columnNamePass in bodyMacros) {
	string columnName = string.Empty;
	string value = string.Empty;
	try {
		columnName = columnNames[columnNamePass];
		value = (entity.GetColumnValue(columnName) ?? dataEmpty).ToString();
	} catch {
		//value = "<Колонка [" + columnNamePass + "] не найдена>";
		value = dataEmpty;
	}
	Body = Body.Replace("%"+columnNamePass+"%",value);
}

«Нет данных» выводится при любой исключительной ситуации во время попытки считать поле из Entity или при его пустом значении. Более подробно можно выяснить, проведя отладку этого места, используя Visual Studio.

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

Добрый день
Подскажите, можно ли добавить новую деталь Заметки-1 по аналогии с деталью Заметки в существующем разделе, используя рук-во по добавлению новой детали (5.4.6) или в данном случае нужно как-то действовать по другому алгоритму?

Нравится

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

Эта деталь устроена иначе. Фактически, это не деталь с записями, а текстовое бесконечное поле Notes в объекте. Деталь инициализируется в схеме «Инициализировать детали», см. там по слову «Notes». Чтобы сделать ещё одну деталь, нужно вносить в скрипт доработки и добавить в объект ещё одно бесконечное поле.

А где найти этот скрипт?

В схеме «Инициализировать детали».

А где найти эту схему?

В разделе «Конфигурация».

Сделала по инструкции новую Деталь в карточке КЕ. После перезахода в систему - деталь не появилась. Нужно ли чистить Redis или проблема в чем-то другом?

// новая деталь никак не связана с Заметками

// новая деталь никак не связана с Заметками

или какой-то доступ к этой детали нужно создавать? у меня права сист.администратора

Да, нужно почистить Redis, чтобы деталь появилась.

У нас один сервер редис для тестовой и боевой. Если очистить кеш - то придется чистить на двух. Новую деталь я делаю на тестовой системе, на продуктиве - пока нет. После чистки - деталь появится на тестовой?

Если у Вас настроено на один сервер, но разные номера баз, то можно чистить отдельно. См. документацию по Redis.
Конечно, при чистке всего редиса деталь появится там, где она есть и не появится там, где её нет.

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

Для очистки redis не обязательно использовать команду flushall, вы можете очистить редис для конкретной базы с помощью команды flushdb. Более подробно читайте с посте - ссылка.

У нас один сервер redis на нем две базы: 0 -это боевая, 1 -это тестовая . я попытался вести flushdb 1 -получил ошибку без аргументов. Что это значит?

У нас один сервер redis на нем две базы: 0 -это боевая, 1 -это тестовая . я попытался вести flushdb 1 -получил ошибку без аргументов. Что это значит?

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

Перед выполнением команды flushdb нужно указать базу, для которой вы хотите её применить. Сделать это можно с помощью команды select <номер базы>. Подробнее можете ознакомиться, например, по этой ссылке.

спасибо

спасибо

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

Добрый день!

В версии 5.3.3.68 (Лояльность) существует для "Воздействия" возможность указать на вкладке детали "Дни недели", собственно, дни недели действия воздействия в одной части детали и время в другой части детали (в зависимости от указанного слева дня) - коробочная версия:

Рисунок 1

Но это две зависимых страницы. У меня вопрос в следующем: существует ли способ создать страницу детали похожего плана с 2-мя независимыми гридами, привязанных к двум разным таблицам? Вариант разнести страницы на 2 различные детали не подходит.

Среди перечня возможных вариантов ничего подходящего не нашел:
Рисунок 2

Прошу помощи!

Нравится

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

Виталий, этот вопрос рассматривался тут.

Вас понял - буду тестировать. Спасибо!

Пока что 2 вопроса:
1) Какую родительскую страницу указывать для самой страницы детали (т.е. самый верхний объект)? Тоже страницу реестра файлов к комментариям?
2) Какой объект указывать при добавлении детали? Таблицы у меня 2, а объект можно указать лишь один.

1. В примере по ссылке «Cтраница реестра комментариев» унаследована от «Базовая страница реестра».
2. Для детали там указан объект «Комментарий».

Впрочем, не уверен, что в этом примере детали именно независимые.

Для двух независимых должно быть похоже, но отправлять на правую деталь сообщение GridPageRefreshRow не при смене активной записи на левой детали (DataSourceActiveRowChanged) как в примере сейчас, а на событии прихода сверху уведомления о смене записи в основном разделе (GridPageRefreshRow).

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

Добрый день

В карточке Инцидента:
Если в поле Заявитель.Инцидент выбран Контакт, где ТИП=Сотрудник, то: поле Происхождение.Инцидент должен автоматически подтягиваться значение из справочника "Обнаружено сотрудником".

Подскажите, пожалуйста, как из Инцидента обратиться к справочнику Контактов, а из него - к справочнику Типов. Заранее спасибо

Нравится

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

Получать значение из другой таблице по Id можно при помощи функции GetEntityTypedColumnValue. Пример её использования.
По Id контакта получаете значение его поля «Тип» и сравниваете с Id записи «Сотрудник» в справочнике типов.

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

Добрый день

Подскажите, как сделать следующее:
при нажатии на ОК в карточке Инцидента поле "План.дата завершения" становилась недоступной для редактирования всеми пользователями системы.

Нравится

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

Недоступность задаётся методом Page.PlanEndDateEdit.SetEnabled(false) у контрола. Можете на при открытии карточки на событии PageLoadComplete проверять нужное условие и в зависимости от этого делать доступным или нет.

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

Добрый день

Если я создаю Активность (Задачу) из Изменения , а к этому Изменению привязано несколько Инцидентов , то:

при нажатии на ОК в Активности нужно подвязать номер Инцидента. А если их несколько, то неудобно заходить на вкладку Инциденты в Изменении и смотреть эти номера. Можно ли при нажатии на ОК в Активности сделать сообщение с выбором этих номеров ? Т.е. я выбираю этот номер Инцидента и он указывается в поле Инцидент.Активность.

Заранее спасибо

Нравится

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

Это можно с помощью действия OpenLookupUserTask, вот пример работы с ним.

А если другой вариант:
если я в карточке Активности с типом Задача создам кнопку "молния", и при нажатии на нее - если поле изменение.активность заполнено, а поле Инцидент.Активность не заполнено, то: система выдаст список номеров Инцидентов, подвязанных к этому Изменению.

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

В примере по ссылке выше показано, как добавляется фильтр.

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

чтобы именно при нажатии на "молнию" срабатывал фильтр?

И как сделать кнопку-молнию в опред.поле?

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

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

Добрый день! Коллеги, поскажите пожалуйста, как можно получить значения выпадающего списка (comboBox).
Список значений формировался не через связь со справочником, а добавлением значений вручную, методом

AddItem()

например:

Page.usrComboBox.AddItem("test1","test1");
Page.usrComboBox.AddItem("test2","test2");
...

вопрос - где в Page.usrComboBox хранятся эти данные?
Спасибо!

Нравится

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

Влад,

Текущее значение можно получить так:

Page.usrComboBox.Value

Или Page.usrComboBox.SelectedItem, а точнее его ключ и значение:
Page.usrComboBox.SelectedItem.Text
Page.usrComboBox.SelectedItem.Value
Плюс отвечая на вопрос по поводу хранения всех данных, если вы не используете источник данных и добавляете значения в ручную, можно их кешировать в какой-то переменной для последующего использования. А выбранное пользователем значение читается как описано выше.

Спасибо за ответы! Еще один уточняющий вопрос.
список ComboBox заполняется несколькими значениями, по нажатию на кнопку, методом AddItem. Если нажать на кнопку, соответственно значения добавятся опять(задвоятся). Вот для того чтобы сделать проверку и избежать задвояния, меня и интересовало наличие метода, который возвратит список всех текущих значений списка ComboBox(не выбранного а всего списка).

usrComboBox.value 

- в данном случае выбрасывает искючение (изза того что value - не uid а string)

Вопрос решен, спасибо!

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

Добрый день, коллеги!

Имеется примерно такой запрос:

var newSelect = new Select(CurrentUserConnection)
        .Column("Table1", "Column1").As("Column1")
        .From("Table1").As("Table1")
        .Where("Table1", "Column2").IsNotEqual(  ...  ) as Select;

И имеется некоторая коллекция значений, к примеру:

List myList = new List();

Вопрос в следующем: Каким образом можно в условие запроса передать список значений моей коллекции (будь то Array, ArrayList, List, Dictionary, Hashtable, SortedList или другое - значения не имеет)?

Условно говоря, мне нужно мою коллекцию представить в виде типа "Select", чтобы можно было использовать в месте отмеченном 3-мя точками, - это если следовать сигнатуре этих методов, согласно описанию из SDK (www.terrasoft.ru/bpmonlinesdk/). Но как это сделать? Прошу помощи!

Нравится

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

Виталий, для этого нужно использовать конструкцию .Not().In(массив_или_список_идентификаторов) .
Пример использования (схема EditSynchUserInSynchRole):

var ldapGroupsIds = new List<QueryParameter>();
	var ldapUserLoginAttribute = SysSettings.GetValue(UserConnection, "LDAPUserLoginAttribute").ToString();
	using (var ldapUtils = new LdapUtilities(UserConnection)) {
		var usersCollection = ldapUtils.GetUsersAttributesByFilter(ldapUserLoginAttribute + "=" + ldapEntry, new [] {"distinguishedName"});
		var userDn = string.Empty;
		foreach (SearchResultEntry user in usersCollection) {
			userDn = user.DistinguishedName;
			break;
		}
		var ldapGroupIdentityAttribute = SysSettings.GetValue(UserConnection, "LDAPGroupIdentityAttribute").ToString();
		var groupsCollection = ldapUtils.GetGroupsAttributesByFilter("member=" + userDn, new [] {ldapGroupIdentityAttribute});
		foreach(SearchResultEntry group in groupsCollection) {
			ldapGroupsIds.Add(new QueryParameter(ldapUtils.IdentityAttributeToString(group.Attributes[ldapGroupIdentityAttribute][0])));
		}
	}
 
	if (ldapGroupsIds.Count < 1) {
		return true;
	}
 
	var delete = new Delete(UserConnection).From("SysUserInRole").
	Where("SysUserId").IsEqual(Column.Parameter(userId)).
	And().Exists(new Select(UserConnection).
		Column("Id").From("SysAdminUnit").
		Where("SysUserInRole", "SysRoleId").IsEqual("SysAdminUnit", "Id").
		And("SynchronizeWithLDAP").IsEqual(Column.Parameter(true)).
		And("LDAPEntryId").Not().In(ldapGroupsIds));
	delete.Execute();

Если же передавать массив, то так (схема AdministrativeGrantedRightsGridPage):

	object[] objectParameters = new object[adminUnitCollection.Count];
	for (int i = 0; i < adminUnitCollection.Count; i++) {
		objectParameters[i] = adminUnitCollection[i];
	}
}
var entitySchemaManager = Page.UserConnection.EntitySchemaManager;
var rightsSchema = entitySchemaManager.GetInstanceByName("SysAdminUnitGrantedRight");
var select = new Select(Page.UserConnection)
		.Column(rightsSchema.Name, "Id")
		.Column(rightsSchema.Name, "GrantorSysAdminUnitId")
		.Column("Grantor", "Name").As("GrantorSysAdminUnitName")
	.From(rightsSchema.Name)
	.InnerJoin("SysAdminUnit").As("Grantor").On("Grantor", "Id").IsEqual(rightsSchema.Name, "GrantorSysAdminUnitId")
	.Where(rightsSchema.Name, "GranteeSysAdminUnitId").In(Column.Parameters(objectParameters))
	.OrderByAsc("Grantor", "Name") as Select;

Хм... Честно говоря, если судить по информации из SDK (http://i.piccy.info/i9/fa961117bdc660b65920ae24393d4c3e/1452507140/1535…), то оператор "In()" не принимает произвольную коллекцию, потому и решил переспросить. Во всяком случае, вопрос закрыт. В очередной раз спасибо Вам, Александр!

Я тоже думал, что только массивы из Object, но оказалось, что не только массивы.
В первом примере обратите внимание, что коллекция из элементов именно типа QueryParameter.

А это действительно важно, использовать именно тип "QueryParameter"? Т.е., к примеру:

List<Guid> guids = new List<Guid>();

нельзя использовать? Или тот же тип "string"? В том же SDK есть только такой пример: http://i.piccy.info/i9/7c65675471d92405256ab8d1e300693f/1452512386/1789…

Если следовать этому описанию, то коллекция ГУИДов должна выглядеть так:

List<QueryParameter> guids = new List<QueryParameter>();
guids.Add(new QueryParameter((new Guid("...")).ToString()))

Верно ли это? Тогда я не смогу указать оператор "In()" для колонки, содержащую тип "Guid", т.к. я буду проверять наличие текущей записи в коллекции guids, а у нее QueryParameter содержит тип "string". Что-то тут нечисто... Подскажете, как быть?:confused:

Попробуйте сделать как в моём первом примере, там как раз сравнивается со списком из Guid, хоть и приводится к строке.

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

Добрый день!

Подскажите, как в 5-ке вывести всплывающее окно (уведомление) пользователю? Аналог в 7-ке - это:

showOrderInfo: function() {
    var activeRowId = this.get("ActiveRow");
    var gridData = this.get("GridData");
    var dueDate = gridData.get(activeRowId).get("Date");
    this.showInformationDialog(dueDate);
}

Заранее спасибо!

Нравится

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

Вам подойдет следующий способ отсюда:

http://www.community.terrasoft.ru/forum/topic/11784

"Вильшанский Дмитрий" написал:

Стандартный способ показать информационное сообщение пользователю из скрипта страницы.

Создаем скрипт подготовки и Действие процесса "Открыть окно сообщения"

Пишем в скрипте:

InfoMessageUserTask.Page = Page;

InfoMessageUserTask.Icon = "INFORMATION";

InfoMessageUserTask.Buttons = "OK";

InfoMessageUserTask.MessageText = "Тариф успешно заведен в Bill-Master";

*не забываем использовать Localizible strings

Также можно сделать следующим образом:

InfoMessageUserTask.ResponseMessages = new Dictionary<string, string> {{"ok", "SomeMessage"}}  Генерация сообщения SomeMessage по нажатию кнопки ok

Увы, это способ я находил... Я потому и создал новый пост, чтобы узнать, есть ли другой способ, к примеру, не создавая "Действие процесса". И, насколько я понял, одними средствами C# это сделать не получится. Но спасибо всё равно, что уделили время моему вопросу!

Средствами C# сделать можно всё. То же действие «Открыть окно сообщения» можно создать и выполнить программно.

Пример из ApprovalInServiceRequestEditPage:

var openMessageWindow = new QuestionUserTask(UserConnection); 
openMessageWindow.Page = Page;
openMessageWindow.ProcessInstanceId = InstanceUId;
openMessageWindow.MessageText = ServiceApprovalNotFindedMessage;
openMessageWindow.Buttons = "OK";
openMessageWindow.Icon = "INFO";
openMessageWindow.ResponseMessages = new Dictionary<string, string> {
      	{"ok", "ClosePageMessage"},
};
openMessageWindow.Execute(context);

Александр - очень признателен за ответ: как раз то, что надо! Спасибо, что всегда выручаете!!! С наступающим Вас праздником!)

Виталий, Вам тоже хороших праздников!

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

На сторінці реєстру звернень добавив кнопку, прописав назву, встановив відступ і опублікував схему.
Після чого не зміг відкрити схему в дизайнері.
Дає
Exception Message: Ссылка на объект не указывает на экземпляр объекта.
Exception Type: System.NullReferenceException
Exception Source: Terrasoft.UI.WebControls

Виявилось, що я не можу взагалі жодної сторінки відкрити в дизайнері, - всюди те саме.

І що то воно таке ?

error.txt

Нравится

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

Деякі сторінки все ж відкриваються:
Cостояния запросов на обслуживание
Cостояния инцидентов

Потім пачка базових сторінок відкривається, але починаючи з "Базовая страница редактирования" - помилка.

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

Схема сторінки виявилась битою, не вистачало цілої купи методів (це з того, що вдалося помітити)
Це спотворило весь згенерований C#-текст схеми.

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

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

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