Коллеги, подскажите в каком направлении копать.
Представим, что есть текстовое поле у которого чисто визуально нужно отобразить "звёздочку обязательности", но по факту она не должна за собой нести проверку на заполненность этого поля.

Каким образом это можно реализовать?

Нравится

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

В схеме странице, в Diff для этого поля, укажите для свойства values, значение isRequired: true
Как я помню она будет нести чисто визуальный смысл.

"Примерный пример":

diff: [
{
"operation": "insert",
"name": "UsrColumn",
"values": {
  "isRequired": true
},
"parentName": "Header"
}
]

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

"Кисловский Михаил Андреевич" написал:

По сути это же баг системы.

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

Добрый вечер!

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

Если поле необходимо сделать обязательным - воспользуйтесь бизнес-правилами.

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

Здравствуйте.
Не отображаются, и не изменяются стадии в продаже. Т.е. если создать новую стадию, изменить порядок базовых, как бы не менял, базовые всегда идут в одной последовательности и новые не добавляются.

P.S. Разлогиниться пробовал. Чистка кеша не помогает. Да даже редис чистил и пулл перезапускал - ничего не помогло.

Версия 7.10.2.1416

Нравится

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

Добрый день, Илья!

На сколько пониманию речь идет о том, что Вы добавляете и меняете порядок в дизайнере кейсов DCM. А для того, чтоб стадия появилась на шкале стадий ее также необходимо добавить в справочник "Стадии продажи" и в поле "Отображать на шкале стадий" поставить "Да".

"Адасюк Валерий Викторович" написал:

Добрый день, Илья!

На сколько пониманию речь идет о том, что Вы добавляете и меняете порядок в дизайнере кейсов DCM. А для того, чтоб стадия появилась на шкале стадий ее также необходимо добавить в справочник "Стадии продажи" и в поле "Отображать на шкале стадий" поставить "Да".

Я добавлял именно в справочник Стадии Продаж.

И все, вопрос решился. Я не знал про настройку кейсов.

Спасибо.

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

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

К примеру есть карточка контакта. Перед сохранением пользователю задаётся вопрос с 2 вариантами.
При выборе 1 варианта, после сохранения карточки необходимо выполнить 1 действие, ну и соответственно при выборе 2 варианта 2 действие.

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

Нравится

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

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

Дизайн процесса:
1. Стартовый сигнал по добавлению/изменению записи в объекте [Контакт].
2. Элемент [Вопрос пользователю]. Указать варианты ответов.
После пункт 2 идут условные потоки. Каждый условный поток содержит один из вариантов.
Пользовательская логика.

Условно:
Если пользователь выбрал 1-ый вариант - > Изменить данные в контакте, где Id = Стартовый сигнал. Id, установить Тип контакта = Сотрудник
Если пользователь выбрал 2-ой вариант - > Изменить данные в контакте, где Id = Стартовый сигнал. Id, установить Тип контакта = Партнер

Здраствуйте.
Бизнес процесс будет запущен после того как карточка сохранена. А запрос пользователю должен поступить до сохранения, на тот случай если пользователь вместо выбора варианта нажмёт отмену

Чисто в теории

this.showConfirmationDialog(message, function(result) {
	if (result !== this.Terrasoft.MessageBoxButtons.YES.returnCode) {
		this.set("flag", true);     //если "да", то устанавливаем какой-нибудь аттрибут в true или в аттрибут записываем что-либо
		this.save({callback: this.aftersavefunction});
	}
}, ["yes", "no"]);

после save приходим в нашу функцию

aftersavefunction: function() {
	var flag = this.get("flag"); //в зависимости от аттрибута делаем что хотим
	/*code*/
}

Небольшое замечание: callback сработает только если также выставить isSilent в true.

Итого:

this.save({callback: this.aftersavefunction, isSilent: true});

 

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

Коллеги, добрый день.

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

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

Если запускать этот БП вручную, он успешно отрабатывает. При вызове из задания (QuartzScheduler) - падает на шаге генерации ПФ.

ПФ генерируется в ScriptTask с помощью вызова ReportService:

var reportData = reportService.GenerateMSWordReport(templateId, recordId, convertInPDF);

Шаг падает со следующим Exception:

System.NullReferenceException: Object reference not set to an instance of an object.
   at Terrasoft.Configuration.ReportService.ReportService..ctor()
   at Terrasoft.Core.Process.UsrOutdatedTSActNotif.ScriptTask2Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Нравится

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

Здравствуйте, вероятно при работе планировщика нет userconnection-а, попробуйте из стороннего c# кода вызвать свой бп с формированием отчета:
https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/zapusk-process…
если получится, то сделайте бп который будет работать по планировщику, и вызывать таким же образом образом другой бп с формированием отчета.
Такой вызов должен эмулировать нормальный заход пользователя на сайт (авторизация) и запуск процесса как бы в ручном режиме.

Илья,
большое спасибо, помогло.

Единственный минус - в таком случае придётся заводить служебного пользователя для поторяющизся задач и хранить где-то его логин/пароль в открытом виде.

Возможно есть какой-то более простой способ получить UserConnection в БП, запускаемом из Quartz?

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

В создании дополнительно пользователя нет необходимости.
Будет подтягиваться userconnection пользователя, которого вы укажите при создании job’а.
Условно:

string userName = userConnection.CurrentUser.Name;
AppScheduler.ScheduleMinutelyProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, solutionName, userName, minutleyInterval, isSystemUser : true);

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

Всем доброго времени суток.
Версия 7.10.

Как можно отменить бизнес-правило из "коробочной" версии? Вот, например, страница CasePage, есть правило для колонки Контакта:

"Contact": {
                                                "FiltrationContactByAccount": {
                                                        "ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
                                                        "autocomplete": true,
                                                        "autoClean": true,
                                                        "baseAttributePatch": "Account",
                                                        "comparisonType": this.Terrasoft.ComparisonType.EQUAL,
                                                        "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                                        "attribute": "Account"
                                                }
                                        },

Как его можно отменить, или "перебить" своим правилом? Суть: фильтрация для контакта не нужна, при выборе контрагента не должно сбрасываться значение контакта.

Нравится

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

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

Ответ по ссылке:
http://www.community.terrasoft.ru/forum/topic/12017#comment-52036

Пожалуйста, пользуйтесь поиском.

В версии 7.10. появилась возможность управления бизнес-правилами. Их можно отключить, используя вкладку "Бизнес-правила" в мастере раздела.

Алексей, спасибо.

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

Доброго дня!

Для запуска экземпляра бизнес-процесса использую класс Terrasoft.Core.Process.Process. Но в версии 7.10 не обнаружил метода SetPropertyValue для установки значения параметра процесса перед запуском.

Примеры вызова метода рассматривались здесь https://community.terrasoft.ru/forum/topic/24716.

Я правильно понимаю, что метод зачем-то убрали из класса Process, или не там смотрю?

Сейчас в классе есть только схожий по смыслу метод SetParameterValue, но он не доступен для вызова снаружи, т.к. protected.

(

Нравится

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

Добрый день, подобную задачу для 7.10.1 решали в следующей теме: http://www.community.terrasoft.ru/forum/topic/25592

Илья, добрый день! Указанный пост видел. Уточните пожалуйста, какой именно подход из поста будет считаться решением моего вопроса?

"Давыдов Андрей Дмитриевич" написал:будет считаться решением моего вопроса?

Process process = processSchema.CreateProcess(userConnection);
 
if (processSchema.Parameters.ExistsByName(@"ContactNum"))
{
        process.SetPropertyValue(@"ContactNum", var1);
}
 
process.SetPropertyValue(@"ManagerNum", var2);
 
process.Execute(userConnection);

Данила, в первом посте я писал:

Для запуска экземпляра бизнес-процесса использую класс Terrasoft.Core.Process.Process. Но в версии 7.10 не обнаружил метода SetPropertyValue для установки значения параметра процесса перед запуском.

Сейчас в классе есть только схожий по смыслу метод SetParameterValue, но он не доступен для вызова снаружи, т.к. protected.

Разобрался. Чтобы у типа Process появился метод SetPropertyValue нужно было добавить using неймспейса Terrasoft.Common.

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

1. Раздел -> Открыть мастер раздела.
2. Основные свойства раздела -> Страница - имеет вид кнопки с выпадающим списком, состоящим из двух строк.
Проблема: при нажатии на любую из них, содержимое, для создания/редактирования, не загружается. Система пишет "Загрузка" и в таком состоянии страница может находиться долгое время. Предполагаю, что проблема именно в этих выпадающих строчках, хранящих неверное ID.
Кто знает как можно решить проблему?

Нравится

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

Здравствуйте, в момент перехода по ссылкам из выпадающего списка, обрабатывается содержимое указанных страниц, там могут быть проблемы в diff-ах. Откройте консоль разработчика в браузере до момента перехода, и почитайте что гласят ошибки. Посмотрите сожержимое dif-ов страниц CasePageV2, и CasePage. Если это не поможет, напишите в поддержку с предоставлением доступа к сайту. support@terrasoft.ru

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

Всем доброго времени суток.
Версия 7.10.

Ситуация такая: в CTI панели добавлена кнопка Создания обращения - по клику на неё должна открываться карточка создания нового обращения Case и автоматически заполняться некоторыми данными (сейчас неважно, какими).

Функция-обработчик клика по кнопке в схеме CTIPanel сейчас выглядит так:

//Создание обращения
                                onCreateNewCase: function(){

                                        this.openCardInChain({
                                                id: "Id",
                                                schemaName: "CasePage",
                                                operation: "add",
                                                moduleId: this.sandbox.id + "_CasePage",
                                                //Автоматически устанавливаем значения в открываемой карточке
                                                defaultValues: []
                                        });
                                }

В результате клика тем не менее карточка открывается внутри панели (см. второй скриншот). Подозреваю, что проблема в moduleId.. как правильно указать настройки?

Нравится

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

Для создания новой записи попробуйте указать пустой гуид в moduleId:

this.openCardInChain({
	schemaName: "ContactPageV2",
	operation: "add",
	moduleId: "00000000-0000-0000-0000-000000000000",
	defaultValues: [{name: "Name", value: "Some name"}, {name: "Test", value: "TestTest"}]
});

Максим, то же самое.

this.openCardInChain({
					        schemaName: "CasePage",
					        operation: "add",
					        moduleId: "00000000-0000-0000-0000-000000000000",
					        //Автоматически устанавливаем значения в открываемой карточке
					        defaultValues: []
					});

Страница карточки загружается внутри боковой панели.

Может быть, надо вызывать это не в CTIPanel, а в схеме основного блока? Тогда где - ведь открыта может быть любая страница (списковая, карточка, справочник и тд), а боковая панель доступна везде.

Вот есть например такое сообщение для перехода по ссылкам:

this.sandbox.publish("PushHistoryState", {
		                hash: "SectionModuleV2/CaseSection/",
					});

Может здесь можно какие-либо параметры передать для инициализации новой записи? Или хотя бы где (в какой схеме) реализована подписка на это сообщение? Переход ведь работает везде, даже на SystemDesigner.

"Смородинов Денис" написал:Вот есть например такое сообщение для перехода по ссылкам:

Вот к этому сообщению я тоже пришёл в итоге.
opencardinchain не работает вообще. И сообщения прописывал, и moduleId с renderTo указывал.
Самое простое (на мой взгляд) сделать insert в нужный объект (создать запись с необходимыми полями),
и потом в колбеке

var page = "ContactPageV2"; //имя схемы страницы редактирования
var entityId = //guid записи
this.sandbox.publish("PushHistoryState", {hash: Terrasoft.combinePath("CardModuleV2", page, "edit", entityId)});

Данила, спасибо.

Я вчера сам уже склонился к такому же решению.

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

Всем доброго времени суток.
Версия 7.10.

Есть insertQuery - создание записи в таблице. Примерно такой:

var bq = $this.Ext.create("Terrasoft.BatchQuery");
                                                                        var insert = Ext.create("Terrasoft.InsertQuery", {
                                                                rootSchemaName: "UsrObject"
                                                            });
                                                           
                                                            insert.setParameterValue("UsrId", "id", $this.Terrasoft.DataValueType.TEXT); //id
                                                       
                                                        bq.add(insert);
                                               
                                                        bq.execute(function(response){
                                                                console.log(response);
                                                        }, this);

В респонсе вываливается что-то примерно такого вида:

{queryResults: Array(0), success: true}

Запись же при этом создаётся.
Вопрос как узнать именно Id созданной записи в рамках базы. Имеется в виду не пользовательский, а тот, который присваивается каждой записи вида "9bed938d-9e06-4176-8ff5-8ec6ab49ca9a"?

Нужно чтобы потом сделать в ту же запись Update.

Нравится

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

Добрый день, Денис!

К сожалению, сразу получить guid на клиент с помощью InsertQuery не получится, так как идентификатор формируется на уровне базы (newid()). В принципе, можно взять последний объект по дате создания, в большинстве случаев это он и будет. Средствами системы это можно сделать в БП, элемент Добавить данные - а потом элемент Изменить данные, и отфильтровать по Id = Id созданной записи элемента Добавить данные.

Илья, а если допустим создать сервис, или БП, и создавать внутри него (т.е. на бекенде прямо в базе), то можно ли будет его вернуть в качестве response от сервиса?

Денис, пожалуйста, все-таки можно. Execute возвращает только количество добавленных строк, поменять сигнатуру ядровых методов не получится. Но ведь мы можем сами сгенерировать Id в C#-
Guid.NewGuid(), и передать его в InsertQuery. После чего данный guid можно будет успешно использовать в других запросах.

double post

Илья, спасибо, ещё один вопрос, чтобы прояснить все варианты.

Есть такая функция: Terrasoft.generateGUID();

Если я сделаю вот так:

var myGuid = Terrasoft.generateGUID();
var bq = this.Ext.create("Terrasoft.BatchQuery");
                                                                        var insert = Ext.create("Terrasoft.InsertQuery", {
                                                                rootSchemaName: "UsrObject"
                                                            });
 
insert.setParameterValue("Id", myGuid, this.Terrasoft.DataValueType.GUID); //id
                                                            insert.setParameterValue("UsrId", "id", this.Terrasoft.DataValueType.TEXT); //id
 
                                                        bq.add(insert);
 
                                                        bq.execute(function(response){
                                                                console.log(response);
                                                        }, this);

Сохранится ли запись под myGuid, вообще, возможно ли его таким образом сгенерировать?

UPD. По моему, работает.

Если делать на сервере C#-кодом, то Id можно вставить как и любое другое поле.

				using (var dbExecutor = UserConnection.EnsureDBConnection()) {
					var insert = new Insert(UserConnection)
					.Into("CampaignPurchaseQtyCount")
					.Set("Id", Column.Parameter(x.Id))
					.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("ProcessListeners", Column.Parameter(0))
					.Set("PurchaseDate", Column.Parameter(PurchaseDate.Date))
					.Set("CampaignId", Column.Parameter(x.CampaignId))
					.Set("CardId", Column.Parameter(x.CardId))
					.Set("IsRewarded", Column.Parameter(x.IsRewarded));
					insert.Execute(dbExecutor);
				}

Уникальный GUID на C# генерится:

var UId = Guid.NewGuid();

Александр прав, id - это просто поле. Необязательное для Insert'a

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

Собираюсь использовать службу DataService с клиентской части, так как совсем не разбираюсь в С#. Но в документации для чтения и добавления примеры для JS есть, а для удаления и обновления записей -
нет. Прошу помощи: буду очень признателен за пример удаления и обновления записи через DataService на из клиентской части)

Нравится

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

Для обновления ищите по конфигурации слова "Terrasoft.UpdateQuery"
примеров множество, вот из OpportunityManagementEndOfStagePreconfiguredPage:

var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: "Activity"
});
updateQuery.filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL, "Id", activityId));
updateQuery.setParameterValue("Status",
		ConfigurationConstants.Activity.Status.Cancel,
		this.Terrasoft.DataValueType.LOOKUP);
updateQuery.execute(function() {
	this.loadActivities();
}, this);

Удаление по словам "Terrasoft.DeleteQuery", примеров так же очень много, вот из DocumentRelationshipDetailV2:

var deleteQuery = this.Ext.create("Terrasoft.DeleteQuery", {
	rootSchemaName: "DocumentRelationship"
});
var masterRecordId = this.get("MasterRecordId");
var filters = this.getDeleteRelationFilters(masterRecordId, selectedRows);
deleteQuery.filters.add("DocumentsFilter", filters);
deleteQuery.execute(function() {
	this.hideBodyMask();
	this.deselectRows();
	this.reloadGridData();
}, this);

"Максим Шевченко" написал:

Для обновления ищите по конфигурации слова "Terrasoft.UpdateQuery"

примеров множество, вот из OpportunityManagementEndOfStagePreconfiguredPage:

var updateQuery = Ext.create("Terrasoft.UpdateQuery", {

        rootSchemaName: "Activity"

});

updateQuery.filters.addItem(this.Terrasoft.createColumnFilterWithParameter(

                Terrasoft.ComparisonType.EQUAL, "Id", activityId));

updateQuery.setParameterValue("Status",

                ConfigurationConstants.Activity.Status.Cancel,

                this.Terrasoft.DataValueType.LOOKUP);

updateQuery.execute(function() {

        this.loadActivities();

}, this);

Удаление по словам "Terrasoft.DeleteQuery", примеров так же очень много, вот из DocumentRelationshipDetailV2:

var deleteQuery = this.Ext.create("Terrasoft.DeleteQuery", {

        rootSchemaName: "DocumentRelationship"

});

var masterRecordId = this.get("MasterRecordId");

var filters = this.getDeleteRelationFilters(masterRecordId, selectedRows);

deleteQuery.filters.add("DocumentsFilter", filters);

deleteQuery.execute(function() {

        this.hideBodyMask();

        this.deselectRows();

        this.reloadGridData();

}, this);


Большое спасибо!

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