Добрый день
Есть новый раздел. Помогите, пожалуйста, как сделать возм-ть просмотра расписания?

Нравится

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

Чтобы сделать возм-сть просмотра расписания, можно посм. как это сделано в разд. активностей.
См. схему «ActivitiesShedulerPage» и то, как там использ. контрол «ScheduleEdit». Также см., как эта страница встраивается в раздел «ActivitiesModulePage».

Правильно ли я понимаю, что мне нужно создать новые "Группу" и "Элемент в Группе" ?

Группы и расписание вроде бы никак не связаны. Как хотите.

Делаю страницу расписания нового раздела, сохранила/опубликовала. Почему расписания нет в нужном разделе?

Думаю, расписания нет, поскольку Вы его добавили неправильно.
Может, стоит заказать разработку этого раздела у Terrasoft или компаний-партнёров?

Нет, не стоит.

Date: 04.12.2015 9:45:55 Date (UTC): 04.12.2015 6:45:55 Exception Message: В типе "ZapShedulerPageEventsProcess" отсутствует свойство "IsModuleProcessesTuningMode" Exception Type: Terrasoft.Common.InvalidObjectStateException Exception Source: Terrasoft.Common

подскажите, пожалуйста, что это за ошибка?

Добрый день!
Скорее всего у Вас есть несоответствие с параметрами процесса. Где-то в коде он используется, но отсутствует среди параметров

Добрый день
Если проводить аналогию с расписанием Активности - этот же параметр где можно найти?

"TatianaM" написал:

Date: 04.12.2015 9:45:55 Date (UTC): 04.12.2015 6:45:55 Exception Message: В типе "ZapShedulerPageEventsProcess" отсутствует свойство "IsModuleProcessesTuningMode" Exception Type: Terrasoft.Common.InvalidObjectStateException Exception Source: Terrasoft.Common

подскажите, пожалуйста, что это за ошибка?

- эта ошибка исчезла.

Теперь при переходе в Расписание почему-то не отображаются записи. Что может быть причиной?

Записи могут не отображаться из-за того, что идет некорректный запрос. При входе проверьте профайлером, что запрос идет верный и возвращает данные. Если все Ок, то тогда нужно искать в интерфейсе

P.S. Да и идет ли запрос вообще

Подскажите, а где должен идти запрос?

В профайлере SQL Server'а

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

Добрый день!
7.6
В карточке редактирования Базы знаний есть такое поле Решение ( с HTML-тегами)
Можно ли увеличить его размер? - высоту увеличить

Не через мастер не получается увеличить(почему-то обратно потом уменьшается), ни через дизайнер.
Это максимальный размер такого поля?

Нравится

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

Дарья, оно конфигурируется в карточке, надо искать где и пробовать мержить...

Александр, вот это поле в карточке

{
"operation": "insert",
"parentName": "KnowledgeBasePageGeneralBlock",
"propertyName": "items",
"name": "Notes",
"values": {
"contentType": Terrasoft.ContentType.RICH_TEXT,
"layout": {"column": 0, "row": 0, "colSpan": 24},
"labelConfig": {
"visible": false
},
"controlConfig": {
"imageLoaded": {
"bindTo": "insertImagesToKnowledgeBase"
},
"plainTextValue": {
"bindTo": "NotHtmlNote"
},
"images": {
"bindTo": "knowBaseImagesCollection"
},
"plainTextMode": {
"bindTo": "plainTextMode"
}
}
}
}

Как можнно увеличить его размер?

Вероятно как-то так:
сontentType": Terrasoft.ContentType.RICH_TEXT,
"layout": {"column": 0, "row": 0, "colSpan": 24},
"height": "600px",

Спасибо

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

Добрый день
Стоит задача: сделать новую деталь в разделе "Запрос на изменение". В этой детали должен быть как бы реестр изменения поля "состояние" этого ЗИ: наименование состояния и дата его изменения. Пожалуйста, помогите с порядком действий при добавлении этой детали. она должна быть новая или связанная? Заранее спасибо

Нравится

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

Вам нужно добавить новую деталь.
Связанная — это отображение в виде детали существующего раздела.
О создании детали написано в инструкции на стр. 206.

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

Є реєстр запитів на внесення змін.
Редагується конкретний запит.
В ньому є деталь активності.
Редагується активність.
Змінюється статус активності.
По факту зміни статусу активності спрацьовує налаштований процес, який змінює статус запиту.

Все працює, але, ні на сторінці редагування запиту, ні, після його закриття, в реєстрі не відображається факт зміни статусу запиту (звісно, поки не зробиш примусового оновлення).

Запитання:
Як забезпечити візуальне оновлення статусу на сторінці редагування і в реєстрі запитів ?

Нравится

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

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

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

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

OpenUserTaskSenderMailing.ProcessKey = InstanceUId;
string schemaUId = "22C06297-4508-4E5D-9362-4909CF8156CB";
OpenUserTaskSenderMailing.UseCurrentActivePage  = true;
OpenUserTaskSenderMailing.PageParameters = new Dictionary string, object>();
var pageParameters = (Dictionary string, object>)OpenUserTaskSenderMailing.PageParameters;
pageParameters.Add("schemaUId", schemaUId);

return true;

Нравится

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

Вот пример открытия такого окна из БП:
from lookup
Скрипт в начале (фрагмент):

OpenCardTypePageUserTask.ProcessKey = InstanceUId;
OpenCardTypePageUserTask.PageParameters = new Dictionary <string, object>();
var pageParameters = (Dictionary <string, object>)OpenCardTypePageUserTask.PageParameters;
pageParameters.Add("schemaUId", "F1E86D1A-DB06-4D92-859B-81B2E90FC5FB");
pageParameters.Add("useHierarchy", false);
pageParameters.Add("customClosedEvent", "LookupClosed");
pageParameters.Add("multiSelectMode", false);
if (OldCardTypeId != Guid.Empty) {
	var filters = new Collection<Dictionary<string, object>>();
	filters.Add(new Dictionary<string, object> { 
		{"comparisonType", FilterComparisonType.Equal}, 
		{"leftExpressionColumnPath", "CardType.Id"},
		{"useDisplayValue", false}, 
		{"rightExpressionParameterValues", new object[] {OldCardTypeId}}});                                                              
	pageParameters.Remove("LookupFilters");
	pageParameters.Add("LookupFilters", filters);
}
 
return true;

У промежуточного события сообщение «LookupClosed».

Скрипт в конце:

var selectedStatusesIds = (Dictionary <string, object>)OpenCardTypePageUserTask.GetSelectedValues(UserConnection); 
if (selectedStatusesIds.Count == 0) {
	return false;	
}
Inner_CardCategory = new Guid(selectedStatusesIds.First().Key);
return true;

на сколько поняла не все перечисленные вами параметры обязательные, обясните несколько из них пожалуйста:

pageParameters.Add("useHierarchy", false);
pageParameters.Add("multiSelectMode", false);
pageParameters.Add("customClosedEvent", "LookupClosed");

Вот касательно последнего параметра, customClosedEvent что это? Как мне узнать правильное название необходимого мне значения? Я смотрела у нас в конфигурациях разные справочники открываются и для каждого справочника значение customClosedEvent свое иои LookupClosed это стандарное значение?. Опять же фильтр мне не нужен, мне нужны все значения справочника (можно его не использовать?)

Первый параметр — видимо, древовидность реестра. Если в справочнике нет в записях ссылки на родительскую, то не надо.

Второй — возможность выбора в окне нескольких записей за раз.

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

Ну вот вроде, все как у вас, но не работает..

Подготовка параметров MassMailingScriptTask
1

OpenUserTaskSenderMailing.ProcessKey = InstanceUId;
OpenUserTaskSenderMailing.UseCurrentActivePage  = true;
OpenUserTaskSenderMailing.PageParameters = new Dictionary <string, object>();
var pageParameters = (Dictionary <string, object>)OpenUserTaskSenderMailing.PageParameters;
pageParameters.Add("schemaUId", "22C06297-4508-4E5D-9362-4909CF8156CB");
pageParameters.Add("customClosedEvent", "LookupClosed");
return true;

Работа с полученными данными MassMailingScriptTask

var manager = UserConnection.GetSchemaManager("EntitySchemaManager") as EntitySchemaManager;
SetMassMailingStatus(MassMailingId, new Guid("ED5F422E-F46B-1410-6590-1C6F65E24BE8"), 
	manager, this.UId, "StartDateTime");//В работе
 
//GetCurrentUserEmail();
var values = (Dictionary <string, object>)OpenUserTaskSenderMailing.GetSelectedValues(UserConnection);
 if (values.Count == 0) {
	return true;
}
 
var EmailFromId = new Guid(values.First().Key);
 
//var EmailFromId = new Guid(EmailFromId);
string EmailFrom = "";
Select select = new Select(UserConnection)
.Column("Name")
.From("SenderMailing")
.Where("Id").IsEqual(EmailFromId.ToString()) as Select;
 
PrepareMailSubjectAndBody(manager);
 
var targetEntitySchemaQuery = new EntitySchemaQuery(manager, "MassMailingContact");
var idMailing = targetEntitySchemaQuery.AddColumn("Id").Name;
var EmailOfMailing = targetEntitySchemaQuery.AddColumn("EmailAddress").Name;
var idContactOfMailing = targetEntitySchemaQuery.AddColumn("Contact.Id").Name;
var contactNameOfMailing = targetEntitySchemaQuery.AddColumn("Contact.Name").Name;
var accountIdOfMailing = targetEntitySchemaQuery.AddColumn("Account.Id").Name;
var accountNameOfMailing = targetEntitySchemaQuery.AddColumn("Account.Name").Name;
var ownerOfMailing = targetEntitySchemaQuery.AddColumn("MassMailing.Owner.Id").Name;
string campaignColName = targetEntitySchemaQuery.AddColumn("MassMailing.Campaign.Id").Name;
 
targetEntitySchemaQuery.Filters.Add(targetEntitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "MassMailing.Id", MassMailingId));
var listFilter = new EntitySchemaQueryFilterCollection(targetEntitySchemaQuery, LogicalOperationStrict.Or);
listFilter.Add(targetEntitySchemaQuery.CreateIsNullFilter("SendStatus"));
listFilter.Add(targetEntitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.NotEqual, "SendStatus", new Guid("8074FFC0-6107-E011-A646-16D83CAB0980")));
targetEntitySchemaQuery.Filters.Add(listFilter);
var mailingCollection = targetEntitySchemaQuery.GetEntityCollection(UserConnection);
 
var macrosDictionary = new Dictionary<string,string>();
var activityRecipients = string.Empty;
var processUserTaskManager = UserConnection.ProcessUserTaskSchemaManager;
var userTaskSchema = (ProcessUserTaskSchema)processUserTaskManager.FindInstanceByName("SendEmailUserTask");
 
MacrosHelper.UserConnection = UserConnection;
 
foreach (var mailingMacros in mailingCollection) {
	Guid campaignId = mailingMacros.GetTypedColumnValue<Guid>(campaignColName);
	Guid targetId = mailingMacros.GetTypedColumnValue<Guid>(idMailing);
	string recepient = mailingMacros.GetTypedColumnValue<string>(EmailOfMailing);
	Guid contactId = mailingMacros.GetTypedColumnValue<Guid>(idContactOfMailing);
	string contactName = mailingMacros.GetTypedColumnValue<string>(contactNameOfMailing);
	Guid accountId = mailingMacros.GetTypedColumnValue<Guid>(accountIdOfMailing);
	string accountName = mailingMacros.GetTypedColumnValue<string>(accountNameOfMailing);
	Guid ownerId = mailingMacros.GetTypedColumnValue<Guid>(ownerOfMailing);
 
	string htmlBody = MacrosHelper.ProcessText(MailBody, UserConnection.CurrentUser.ContactId, 
		contactId, accountId);	
	if (accountId != Guid.Empty) {
		activityRecipients = GetActivityResipients(accountName, recepient);
	} else if (contactId != Guid.Empty) {
		activityRecipients = GetActivityResipients(contactName, recepient);
	}	
	var activitySchema = manager.GetInstanceByName("Activity");
	var activity = activitySchema.CreateEntity(UserConnection);
	activity.SetDefColumnValues();
	activity.SetColumnValue("TypeId", new Guid("E2831DEC-CFC0-DF11-B00F-001D60E938C6")); // Email
	activity.SetColumnValue("Sender", EmailFrom);
	activity.SetColumnValue("Recepient", activityRecipients);
	activity.SetColumnValue("Title", MailSubject);
	activity.SetColumnValue("HtmlBody", htmlBody);
	activity.SetColumnValue("StartDate", DateTime.UtcNow);
	activity.SetColumnValue("DueDate", DateTime.UtcNow);
	activity.SetColumnValue("OwnerId", ownerId);
	activity.SetColumnValue("AuthorId", UserConnection.CurrentUser.ContactId);
	activity.SetColumnValue("StatusId", new Guid("4BDBB88F-58E6-DF11-971B-001D60E938C6")); // Finished
	activity.SetColumnValue("ResultId", new Guid("FB7D22DA-F36B-1410-E19F-1C6F65E9F927")); // Done
	activity.SetColumnValue("ShowInScheduler", false);
 
	if (campaignId != Guid.Empty)
	{
		activity.SetColumnValue("CampaignId", campaignId);
	}
 
	if (accountId != Guid.Empty) {
		activity.SetColumnValue("AccountId", accountId);
	} else if (contactId != Guid.Empty) {
		activity.SetColumnValue("ContactId", contactId);
	}
	activity.SetColumnValue("MassMailingId", MassMailingId);
	activity.Save();
 
	CopyAttachmentsToActivity(MassMailingId, activity.PrimaryColumnValue);		
 
	var userTask = (SendEmailUserTask)userTaskSchema.CreateProcessUserTask(UserConnection);
	userTask.ActivityId = activity.PrimaryColumnValue;
	userTask.Execute(context);
	ErrorCode = userTask.SendEmailStatus;
	SetMassMailingContactSendStatus(ErrorCode, targetId, manager);
}
 
SetMassMailingStatus(MassMailingId, new Guid("FF7F4232-F46B-1410-6690-1C6F65E24BE8"), manager, 
	Guid.Empty, "EndDateTime");//Завершена
 
return true;

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

Ещё написали слово «джоб». Если оно действительно запускается по кварцу или иному планировщику, то в таком БП не факт, что вообще можно отображать что-то на экране. Пользователя с браузером может и не быть. Система не знает, кому окно показывать.

Ну я может не правильно выразилась... На прикрепленных файлах(см.ниже) ВЕСЬ процесс запускается по действию, проходит разные проверки и в конце в последнем коде (выделила желтым снимок_2) при определенном параметре вызывается процесс (выделила синим снимок_3) который я описывала изначально

Намудренно конечно, но так было изначально от разработчиков... Вот собственно в таком МЕГА процессе есть возможность открытия моего справочника?

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

окей, спасибо, буду тогда искать другие пути реализации

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

Нет. Так тоже не выйдет. У Вас в тот момент вообще может не быть пользователя с браузером.

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

Добрый день!

Подскажите, каков код для добавления напоминания пользователю, а также, какие поля за что отвечают.

Насколько я понял, то за уведомления отвечает таблица "Reminding"...

Спасибо!

Нравится

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

Обычно сообщения в виде жёлтой плашки вверху окна выводятся кодом вроде:

Page.BaseMessagePanel.AddMessage(WarningMessageCaption, messagePanelMessage, MessageType.Warning);	

При этом текст сообщения лучше брать из локализируемой строки (справа в дереве в дизайнере БП).

Если же нужно много текста, то, возможно, стоит задизайнить отдельную карточку с текстовым полем и кнопкой ОК и показывать её.

Александр, а существует ли такой же код, только для использования в задании-сценарии (блок с C# кодом) в бизнес-процессе? Проблема в том, что это описание добавления напоминания я выполняю не в процессе модуля формы, а в отдельном простейшем БП, потому у меня нету "Page"...

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

А, так Вы об этих напоминаниях, теперь понял.

Такие создаются путём добавления новой записи в таблицу, дальше система сама их сама показывает.

В таблицу можно добавить при помощи класса Entity:

	var remindingSchema = UserConnection.EntitySchemaManager.GetInstanceByName("Reminding");
	var reminding = remindingSchema.CreateEntity(UserConnection);
	reminding.SetDefColumnValues();
	reminding.SetColumnValue("Id", Guid.NewGuid());
	reminding.SetColumnValue("AuthorId", UserConnection.CurrentUser.ContactId);
	reminding.SetColumnValue("ContactId", contactId);
	reminding.SetColumnValue("SourceId", new Guid("a66d08e1-2e2d-e011-ac0a-00155d043205"));
	reminding.SetColumnValue("RemindTime", UserConnection.CurrentUser.GetCurrentDateTime());
	reminding.SetColumnValue("Description", string.Format(RemindingDownMask.ToString(), ServiceDataUserTask.ResultEntity.PrimaryDisplayColumnValue));
	reminding.SetColumnValue("SubjectId", IncidentReadDataUserTask.ResultEntity.GetTypedColumnValue<Guid>("Id"));
	reminding.SetColumnValue("SubjectCaption", IncidentReadDataUserTask.ResultEntity.GetTypedColumnValue<string>("Number"));
	reminding.SetColumnValue("SysEntitySchemaId", new Guid("4a5122f9-493f-46a8-b757-fdddbb71a847"));
	reminding.Save();

Или аналогично при помощи более низкоуровневого Insert:

Insert insert = new Insert(UserConnection)
	.Into("Reminding")
	.Set("Id", Column.Parameter(Guid.NewGuid()))
	.Set("CreatedOn", Column.Parameter(DateTime.UtcNow))
	.Set("CreatedById", Column.Parameter(UserConnection.CurrentUser.ContactId))
	.Set("ModifiedOn", Column.Parameter(DateTime.UtcNow))
	.Set("ModifiedById", Column.Parameter(UserConnection.CurrentUser.ContactId))
	.Set("SubjectId", Column.Parameter(ContactConsts.SupervisorUId))
	.Set("SourceId", Column.Parameter(RemindingConst.AuthorSourceTypeUId))
	.Set("ContactId", Column.Parameter(UserConnection.CurrentUser.ContactId))
	.Set("RemindTime", Column.Parameter(DateTime.UtcNow))
	.Set("AuthorId", Column.Parameter(ContactConsts.SupervisorUId))
	.Set("Description", Column.Parameter(description))
	.Set("SysEntitySchemaId", Column.Parameter(UserConnection.EntitySchemaManager.GetInstanceByName("Contact").UId));
insert.Execute();

Примеры из разных мест, поиском можно найти ещё.

Поле SysEntitySchemaId задаёт Id нужной таблицы раздела, SubjectId — Id записи в нём, о которой напоминаем, SourceId — одна из 2 констант (либо «автору», либо «ответственнному»), остальные поля понятны из названия.

Александр, низкий поклон!!! Спасибо огромное!

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

Добрый день

Создала новый раздел по инструкции .
Сделала новую запись в этом разделе. Теперь: кнопки Добавить, Удалить и Копировать - работают. А при нажатии на кнопку Изменить, система выдает следующую ошибку:

Нравится

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

Татьяна, если Вы создали раздел по инструкции и что-то не работает, то причины могут быть такими:

  • Либо это неправильная инструкция.
  • Либо Вы что-то по ней сделали не так или пропустили какой-то шаг.

К сожалению, без дополнительной информации сложно сказать больше.

Можете попробовать самостоятельно провести отладку, чтобы понять, в чём дело.

Можно выслать мне корректную инструкцию по созданию раздела или видео-материал ?

О создании раздела есть здесь, со стр. 157.

Сделала еще раз по этой инструкции. Опять кнопку Изменить выдает ту же ошибку с именем параметра key. В чем ее причина, не подскажете?

Из всей инструкции у меня не получилось сделать Основную отображаемую колонку объекта. - Система просто ничего не выдавала для выбора.

Возможно, у Вас в объекте раздела не выбрано первичное поле для отображения.

#5 TatianaM 26 ноября 2015 – 14:34
Из всей инструкции у меня не получилось сделать Основную отображаемую колонку объекта. - Система просто ничего не выдавала для выбора.

Почему это произошло?

Кстати, беру объект активность, где указана осн.отображаемая колонка - Заголовок. Нажимаю в этом поле на кнопку выбора - система не предлагает к выбору Заголовок. ВОпрос- каким образом заголовок мог оказаться в этом поле?

Возможно, в этом Вашем новом разделе нет подходящего текстового поля.

Вот еще момент:

при создании основного объекта в инструкции написано:
"
После выбора родительского элемента в структуру объекта будут добавлены
системные колонки, которые содержат информацию, необходимую для
идентификации объекта системой: “Id”, “Создано”, “Создал”, “Изменено”,
“Изменил”.
"

так вот, я род.элемент указала "Базовый элемент" (как в инструкции), после чего системные колонки не добавились. Почему ? Может быть, в этом причина?

#10 TatianaM 26 ноября 2015 – 15:15
Вот еще момент:

при создании основного объекта в инструкции написано:
"
После выбора родительского элемента в структуру объекта будут добавлены
системные колонки, которые содержат информацию, необходимую для
идентификации объекта системой: “Id”, “Создано”, “Создал”, “Изменено”,
“Изменил”.
"

так вот, я род.элемент указала "Базовый элемент" (как в инструкции), после чего системные колонки не добавились. Почему ? Может быть, в этом причина?

// Хотя в объекте Активность в структуре тоже не отображаются колонки “Id”, “Создано”, “Создал”, “Изменено”, “Изменил”.

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

Возможно, в этом Вашем новом разделе нет подходящего текстового поля.


В страница карточки записи есть многострочное поле, в объекте есть поле с типом Строка неогр.длины.

да!!!все, надо было тип изменить. все получилось

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

Добрый день
Я сделала новый раздел HELP. При этом, в рук-ве по настройке не нашла, как добавить еще возможность фильтрации по периоду. Помогите, пожалуйста. Заранее спасибо.

Сделала так:

А хотелось бы еще и период вывести, как, напр., в разделе Активность:

Нравится

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

Это делается правкой страницы раздела и добавлением дополнительной логики в её БП.

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

Спасибо, поняла.

Добрый день
Слева у меня сделана возможность выбирать период. Но почему реестр записей не изменяется при выборе определенного периода? У меня записи в реестре содержат колонки "Дата начала" и "Дата завершения", как/где эти даты учитываются , если выбран период? Если проводить аналогию с активностями - где именно (в каком скрипте) это учитывается?

В разделе активностей оно учитывается в функции BasePrepeareFilters. Вы можете сделать аналогично.

А в разделе Инциденты оно где учитывается, в какой функции ?

А в разделе Инциденты оно где учитывается, в какой функции ?

А в разделе Инциденты оно где учитывается, в какой функции ?

Вы можете открыть процесс этого раздела и посмотреть. Это несложно.

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

Добрый день!

Коллеги, подскажите, какой есть правильный способ получить все данные, находящиеся в гриде некоторого раздела, когда уже установлены некоторые фильтры динамической группы и быстрые фильтры для текущего грида?

Задача в чем. Нужно получить это уже отфильтрованный грид, наложить на него свой фильтр и отобразить его.

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

Эти темы перечитывал:
https://community.terrasoft.ru/forum/topic/12723
https://community.terrasoft.ru/forum/topic/12327
https://community.terrasoft.ru/forum/topic/10834
https://community.terrasoft.ru/forum/topic/10764
https://community.terrasoft.ru/forum/topic/12978
https://community.terrasoft.ru/forum/topic/9063
https://community.terrasoft.ru/blogs/9136

Похожее, но не то...

Заранее благодарю!

P.S.: Прошу прощения за бестактность, но! Где можно узнать, какие методы и свойства мне доступны для какого-либо объекта в системе? Хоть какое-то минимальное SDK с объяснениями, пусть даже на китайском языке! Банально не хватает технической литературы по кодингу... =(

Нравится

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

Виталий, минимальный SDK находится здесь.
Свойства можно посмотреть в Visual Studio, подключившись к отладке сайта.
Возможно, то, что Вам нужно, можно посмотреть в скрипте ScriptBasePrepareFilters страницы BaseModulePage (базовая страница раздела). Там делается похожее, берётся датасорс страницы и добавляются и удаляются нужные фильтры. Также см. в других функциях и скриптах той же страницы.

Александр, как всегда выручаете) Спасибо за SDK! Ее находил. Думал, что есть еще какая-либо, которой пользуются немолодые программисты Terrasoft. Да вот только новый вопрос появился...

В исходном коде BaseModulePage в указанном Вами скрипте ScriptBasePrepareFilters имеется действительно все то, что мне нужно. НО! SDK не содержит описания метода CreateFiltersGroup. Вот и вопрос: какие перегрузки для него имеются и отработает ли он вообще? Я, конечно же, буду сейчас пробовать, но тем не менее, последний вопрос остается открытым... Выходит, что SDK не полная?

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

Тут на Community есть много примеров вызова этого метода. Похоже, всюду используется одна и та же перезагрузка, с 2 параметрами: текстовое название группы латинскими буквами и логическая операция («LogicalOperationStrict.And» или «LogicalOperationStrict.Or»).

Вас понял - спасибо за наставления!

Осталось решить последнее. Подскажите, каков код для обновления моего грида? Я выполняю следующий код для добавления в грид значений после применения фильтра:

Page.DataSource.LoadRows();

но предыдущие строки грида остаются (что, собственно, логично). Надо вручную обновлять, а это неудобно. В SDK, кстати, не нашел ничего о LoadRows, DataSource, Refresh, Reload, Update, Init и др.... =(

	Page.TreeGrid.Clear();
	Page.DataSource.LoadRows();

Теперь точно всё! Александр, еще раз Вам спасибо за помощь! Хорошего дня!

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

Добрый день!

Хотел поинтересоваться у знатоков, как добавлять системные переменные и каков синтаксис по их использованию: запись и считывание значения? Нашел пример для 7-ки:

https://community.terrasoft.ua/forum/topic/12369

Заранее благодарю!

Нравится

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

Если речь о системных настройках, как по ссылке, то так:

var maxFileSize = (int)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "MaxFileSize");
...
Terrasoft.Core.Configuration.SysSettings.SetValue(UserConnection, "GoogleContactSynchInterval", GoogleContactSynchInterval);

Тип переменной может быть различным.

Добрый день!
В инструментах есть вкладка "Системные настройки", там Вы можете ее добавлять/изменять
Из С# кода (пример):

var value = (Guid)Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "SomeName");
 
Terrasoft.Core.Configuration.SysSettings.SetValue(UserConnection, UserConnection.RootAdminUnitGroupId, "SomeName", someValue);

Спасибо, коллеги! Очень признателен за ответы!

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