Возможно ли расположить кнопку напротив каждой строки детали? Например кнопку "Удалить".

Примерно так:

Изображение удалено.

Нравится

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

И "Редактировать"!

Не знаю как с кнопками в конце, но в схеме разделов можно подсмотреть код и реализовать такой вариант:

Чисто теоретически можно забиндаться к добавлению записи в грид и вставлять свой контейнер с кнопкой на то место что вам требуется. Ну и конечно придётся поиграться со стилями. Что-то подобное мы уже пытались делать. Одно могу сказать что к добавлению элемента в DOM мы уже имели опыт биндинга и выполнения своей логики, а так же создания произвольных HTML элементов на странице.

А то что посоветовал Данила можно подсмотреть в странице локального поиска дублей, например. Вот как то так: 

{
	id: "duplicateGrid",
	className: "Terrasoft.Grid",
	type: "tiled",
	primaryColumnName: "Id",
	activeRow: {bindTo: "activeRow"},
	columnsConfig: [columnsConfig],
	collection: {bindTo: "gridData"},
	activeRowAction: {bindTo: "onActiveRowAction"},
	activeRowActions: [
		{
			className: "Terrasoft.Button",
			style: Terrasoft.controls.ButtonEnums.style.BLUE,
			caption: resources.localizableStrings.IsNotDuplicateCaption,
			tag: "IsNotDuplicate",
			visible: {bindTo: "getGridButtonIsNotDuplicateVisible"}
		},
		{
			className: "Terrasoft.Button",
			style: Terrasoft.controls.ButtonEnums.style.BLUE,
			caption: resources.localizableStrings.IsDuplicateCaption,
			tag: "IsDuplicate",
			visible: {bindTo: "getGridButtonIsDuplicateVisible"}
		}
	]
}

 

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

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

Т.е нужно вывести всего две записи из списка

 //Создаем фильтр
var contactFiler = Terrasoft.createFilterGroup();
contactFiler.name = "contactFiler";
contactFiler.logicalComparisonTypes = Terrasoft.LogicalOperatorType.OR;
 
var filter1 = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Name","Контрагент уже в системе");
var filter2 = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Name","Некорректные данные");
                                                                 
                                                         
contactFiler.addItem(filter1);
contactFiler.addItem(filter2);

По отладчику видно , что в коллекцию добавляется два элемента, но список пуст

Нравится

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

Роман, а вы этот фильтр (contactFiler) где и как используете?

contactFiler.logicalComparisonTypes = Terrasoft.LogicalOperatorType.OR;

"Неправильно ты, дядя Фёдор, бутерброд ешь"...

Попробуйте 

contactFilter.setLogicalOperation(1);

 

Варфоломеев Данила,

После вставки этого метода,пишет contactFilter  - undefined

Толмачев Дмитрий Юрьевич,

 

var config = {
              entitySchemaName: "UsrLooseReason",
              multiSelect: false,
              columns: ["Name","Description"],
              hideActions: false,//Скрываем кнопку "Добавить"
              filters: contactFiler
             };
 this.openLookup(config, function (arg) {}, this);

 

Последовский Роман пишет:

После вставки этого метода,пишет contactFilter  - undefined

 Потому что у вас не contactFilter, а contactFiler. Исправляюсь:

contactFiler.setLogicalOperation(1);

 

Варфоломеев Данила,

Огромное спасибо!!! Все заработало

Роман, здравствуйте!

Согласно Вашему коду у Вас используется параметр logicalComparisonTypes.

Он сравнивает строковые значения («Контрагент уже в системе» = «Некорректные данные»). В результате фильтр возвращает 0.

Нужно вместо logicalComparisonTypes использовать logicalOperation, чтобы использовать условие И/ИЛИ.

 

Параметр logicalOperation описан на SDK - https://academy.terrasoft.ru/documents/technic-sdk/7-11/rabota-s-filtrami-entityschemaquery,

Также на https://academy.terrasoft.ru/documents/technic-sdk/7-11/primenenie-filtracii-k-spravochnym-polyam можете увидеть, что "По умолчанию фильтры в коллекции объединяются с использованием логической операции AND. Если необходимо применить операцию OR, ее нужно указать явно в свойстве logicalOperation объекта Terrasoft.FilterGroup.".

 

Параметр logicalComparisonTypes на SDK не описан.

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

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

Планируется ли в блоке бизнес-правил реализация фичи проставления значений любых полей в зависимости от значений в других полях? (onChange)

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

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

Здравствуйте, Никита!

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

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

Одеяненко Юлия пишет:

На данный момент в работе находится реализация функциональности заполнения полей системными переменными при определенных условиях

Ага. Вот мы и нашли виновника. Ребят, вы тут в 7.11 логику сломали. Вот с чего в деталях с редактируемым реестром 2 раза onChange событие отрабатывает? причём 1 раз приходит значение с колонками, которые подтягиваются через lookupListConfig, а второй раз без них.

Данила, здравствуйте!

Мы уточнили информацию касательно логики деталей с редактируемым реестром у ответственной команды разработчиков, в версии 7.11 не вносилось таких изменений в продукт, которые могли бы повлиять на логику данного типа деталей. Если у Вас есть конкретный кейс, когда базовая деталь с редактируемым реестром отрабатывает некорректно, пожалуйста, напишите нам на support@terrasoft.ru, мы обязательно рассмотрим Ваш кейс и, при необходимости, внесем правки в базовую версию продукта.

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

Здравствуйте, Владимир!

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

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

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

 

Нравится

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

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

if (this.isAddMode()) {....вызов функций...}

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

 

Здравствуйте, подскажите  есть ли возможность из CRM отправлять сетевые запросы, к сторонним сервисам?

"Задание сценарий" в бизнес процессах - это оно? 

Если это оно: то в MS Visual Studio я пишу некий код для отправки, а потом вставляю его в "Задание сценарий".

Собственно интересует общая последовательность действий.

Буду признателен за ответ.

 

Нравится

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

Да, есть. В "Задание сценарий" вставляете любой C# код (однако имейте ввиду, что выполняться всё будет в iis-е на сервере). Плюс, если надо подключить using - это в параметрах процесса (сбросить фокус с элементов бп, справа синяя полоса, 3 вкладка)

Варфоломеев Данила,

Спасибо вроде все получилось

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

Нужно создать обычную страницу с 9 полями.

В дизайнере системы сделаю кнопку и посылку на новую страницу(по примеру)

Обычная страница редактирования строки из таблицы, что бы выбирало только одну запись уже добавил фильтрацию в процессе страницы(ясли я по правильному пути пошел)

Теперь нужно отобразить эту страницу и я что то не могу это сделать, инфы я не нашел нигде!

Нравится

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

Кто-нибудь создавал обычную страницу с формой обратной связи?

Чтобы эта страница была доступна всем, даже не залогинившимся пользователям.

Добрый день!

Вы же можете настроить преднастроенную страницу и вызвать ее при нажатии в рамках БП (https://academy.terrasoft.ru/documents/technic-sdk/7-11/zapusk-processa-iz-klientskogo-modulya)

Вам только необходимо создать свою клиентскую схему с необходимой логикой (https://academy.terrasoft.ru/documents/technic-sdk/7-11/sozdanie-klientskoy-shemy).

Vladimir Kov пишет:

Кто-нибудь создавал обычную страницу с формой обратной связи?

Чтобы эта страница была доступна всем, даже не залогинившимся пользователям.

Владимир, здравствуйте!

Для примера можете воспользоваться функционалом выставление оценки по обращению (CaseRatingManagementService). 

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

Добрый день!

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

Часто возникают ситуации, когда обновление прошло успешно, НО в процессе работы возникают ошибки, критически влияющие на работу менеджера в bpm.

Нравится

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

Александр, добрый вечер!

Вы используете систему on-site, т.е. развернута она на серверах Вашей компании, следовательно, обновление выполняет Ваш администратор, поэтому Вам необходимо адресовать данную просьбу именно ему.

Если я неверно понял Ваш вопрос, уточните, пожалуйста. Спасибо.

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

Добрый день.

Заместил схемку LeadAccountProfileSchema - вызываю метод FindSimilar при получение сообщения от карточки лида. В методе реализован Terrasoft.chain, чтобы убрать ассинхронность запроса в initSimilarEntityRecordsCollection. Но в chain почему-отрабатывает только первая функция, а onSimilarButtonClick не работает. Почему?

 

 

 

define("LeadAccountProfileSchema", ["LeadAccountProfileSchemaResources", "LeadSimilarEntitiesProfileSchemaUtilities"],
	function(resources) {
		return {
			entitySchemaName: "Account",
			mixins: {},
			attributes: {},
			messages: {
			"FindSimilarAccount": {
			mode: this.Terrasoft.MessageMode.PTP,
			direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE
			}
			},
			methods: {
				initEntity: function() {
					this.callParent(arguments);
					this.sandbox.subscribe("FindSimilarAccount", this.FindSimilar, this, ["123"]);
				},
				FindSimilar: function() {
					this.Terrasoft.chain(
					this.initSimilarEntityRecordsCollection,
					this.onSimilarButtonClick,
					this)
				}
			},
			};
	});

 

Нравится

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

Метод, находящийся в chain должен принимать и вызывать после выполнения логики callback:

 

initSimilarEntityRecordsCollection: function(callback, scope) {
    // Logic
	if (callback) {
		callback.call(scope || this);
	}
},

 

Толмачев Дмитрий Юрьевич,

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

СД,

попробуйте примерно вот так через next:

Terrasoft.chain(
	function (next) {
		// какие-то действия
		next();
	},
	function(next) {
		// либо в callback
		var config = {
			isSilent: true,
			callback: next
		};
		this.save(config, false);
	}
}

 

СД,

Это просто пример. Вы же спросили почему у вас не выполняет вторая функция. Не выполняется, т.к. не вызывается. Вызвать можно через callback или next.

Конечно блок вызова callback-метода должен находиться в месте получения ответа от первой функции для реализации последовательного вызова.

  

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

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

Кейс:

Возникла потребность запуска "Действия процесса" (аналог элемента "Выполнить действие процесса") скриптом.

Речь идёт о действии FillEmailTemplateUserTask - обработать шаблон письма с макросами.

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

Необходимо:

1) Вызвать скриптом Обработку подготовленного шаблона, передавая в него необходимые параметры такие как:

RecordId

TemplateId

SysEntitySchemaId

2) Создать активность типа email.

В тело и тему подставить соответственно Subject и Body, обработанные FillEmailTemplateUserTask.

 

Пример выполняемого скрипта:

var userConnection = Get<UserConnection>("UserConnection");
 
var processEmailTemplateUserTask = new FillEmailTemplateUserTask(userConnection);
//передал Guid шаблона
    processEmailTemplateUserTask.TemplateId = new Guid("7EDBEDDE-9E1E-4D80-953D-B7652E6B5F97");
//get UId схемы объекта Изменение
    processEmailTemplateUserTask.SysEntitySchemaId = Get<Guid>("UsrSysShemaUId");
//get Id записи объекта Изменение
    processEmailTemplateUserTask.RecordId = cangeId;
    processEmailTemplateUserTask.Execute(context);
        
var activity = new Terrasoft.Configuration.Activity(userConnection);
    activity.SetDefColumnValues();
    activity.TypeId = Terrasoft.Configuration.ActivityConsts.EmailTypeUId;
    activity.Recepient = "testRecepient@yandex.ru";
    activity.Title = processEmailTemplateUserTask.Subject;
    activity.Body = processEmailTemplateUserTask.Body;
    activity.ChangeId = cangeId;
    activity.IsHtmlBody = true;
    activity.Sender = "testSender@yandex.ru";
    activity.Save();

Проблема:

Пытаюсь передать в создаваемую активность Title и Body после выполнения по идее элемента FillEmailTemplateUserTask.

Однако БП завершается с ошибкой: "Заголовок должен быть заполнен" (обязательная колонка). То есть На моменте создания активности я не получаю обработанной темы и тела письма шаблона с макросами.

 

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

Такое впечатление, что просто не правильно задаю Execute или чего-то не хватает.

 

Нравится

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

Добрый день!!

Элемент [Задание сценарий] не предназначен для запуска и обработки элементов процесса.

Попробуйте использовать связку [Выполнить действие процесса] + [Задание-сценарий]. В ScriptTask замапиться на параметры элемента [Выполнить действие процесса - > Обработать шаблон письма с макросами].

Зарицкий Олег,

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

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

Всем привет, просветите пожалуйста.

Задача отправить некоторое сообщение из LeadPage в LeadSection.

Lead Page:
         messages: {
 
            "MESSAGE": {
                mode: Terrasoft.MessageMode.PTP,
                direction: Terrasoft.MessageDirectionType.PUBLISH
            }
        },
		methods: {
                 onEntityInitialized : function(){
		      	 this.callParent();
 
 
		         window.console.log("onEntityInitialized");
 
		         this.sandbox.publish("MESSAGE", { test: "param anything" }, [this.sandbox.id]);
                 console.log("MESSAGE IS PUBLISH...");
 
 
			}
        }

Вопрос в том как динамически перехватить это сообщение в LeadSection?

Т.е как организовать слушателя событий на стороне LeadSection?

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

LeadSection	  
 
       messages: {
 
            "MESSAGE": {
                mode: Terrasoft.MessageMode.PTP,
                direction: Terrasoft.MessageDirectionType.PUBLISH
            }
        },
 
         methods: {
		 initMessage: function() {
	      console.log("initMessage");
 
                this.sandbox.subscribe("MESSAGE", function(arg) {
                    console.log("test " + arg.test);
                }, this, [this.getSenderSandboxId()]);
 
            }
         }

 

Нравится

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

Все почти верно, кроме

LeadSection =&gt; 
    messages: {
"MESSAGE": {
        direction: Terrasoft.MessageDirectionType.SUBSCRIBE,
         mode: Terrasoft.MessageMode.PTP
    }
}

Ключевое - direction: Terrasoft.MessageDirectionType.SUBSCRIBE для сообщения на LeadSection

Соротюк Татьяна,

Спасибо)

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