При настройке раздела "Активности" основного рабочего места в мобильном приложении получаю ошибку при попытке открыть активность на просмотр в мобильном приложении. Когда там было 27 полей тогда выдавало ошибку что в сегменте не может быть больше 21 поля, после изменения до 21 поля пишет что не больше 13. так все же сколько можно использовать молей для активности (при этом в других разделах указывает ограничение 15 полей и с 15 полями все работает без ошибок). При этом в рабочем месте "Полевый продажи" мобильного приложения такого ограничения нет и там без ошибок отображается 27 полей.

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

 

Нравится

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

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

Данное сообщение означает что на карточку выведено 13 и более справочных полей.

К сожалению, протокол ODATA который используется для обмена данными между мобильным приложением и bpm'online накладывает такое ограничение.

Необходимо уменьшить количество справочных полей на карточке до 12. 

 

Гриценко Игорь,

А как реализовано это в полевых продажах? Если зайти на рабочее место полевых продаж в мобильном приложении - там все поля (больше 15) отображаются без ошибки.

Уменьшил до 12 полей - ошибка та же, при этом только в разделе "Активности" такая ошибка

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

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

По ссылке - https://community.terrasoft.ua/articles/kak-sdelat-filtraciu-pola-po-ex… - хорошая инструкция как задать фильтр для поиска всех записей объекта Account для которых в объекте AccountCommunication значение колонки SearchNumber равно searchValue.

А можно ли отфильтровать список всех записей объекта Account для которых нет ни одной записи в AccountCommunication?

NOT_EQUAL, createColumnIsNullFilter - не работают, т.к. поиск идёт среди существующих записей, а нужно найти все, кроме тех, которые существуют.

Нравится

6 комментариев
Лучший ответ

Смородинов Денис,

В таких случаях всегда нужно сначала написать запрос на sql. Насколько понимаю, Вы хотите получить такую выборку:

select *

from Account A

where not exists (select * from AccountCommunication AC

                    where AC.AccountId = A.Id)

Такой запрос можно построить с помощью createNotExistsFilter.

Используйте агрегатные функции, например количество для вашего фильтра, те возьмите тех контрагентов для которых средств коммуникации 0

а есть примеры использования?

Интересует только клиентская часть, т.е. ESQ-фильтр https://academy.terrasoft.ru/documents/technic-sdk/7-13/rabota-s-filtra…

Примерно так

var esq = this.Ext.create(Terrasoft.EntitySchemaQuery, {
    rootSchemaName: "Activity"
});
esq.addAggregationSchemaColumn("DurationInMinutes", Terrasoft.AggregationType.COUNT, "UniqueActivitiesCount", Terrasoft.AggregationEvalType.DISTINCT);

Подробнее олисано тут

Всё равно до конца не понимаю. Это же расчёт суммы или количества.

Я могу посчитать количество средств коммуникации для конкретного контрагента. Т.е. чтобы отобрать контрагентов, у которых кол-во средств == 0, нужно перебрать значения количества для всех контрагентов по списку?

А если их тысячи?

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

Смородинов Денис,

В таких случаях всегда нужно сначала написать запрос на sql. Насколько понимаю, Вы хотите получить такую выборку:

select *

from Account A

where not exists (select * from AccountCommunication AC

                    where AC.AccountId = A.Id)

Такой запрос можно построить с помощью createNotExistsFilter.

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

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

Вопрос такой - в какой момент происходит добавление в список selectedRows при выборе в справочном окне с множественным выбором? Как нибудь можно его перехватить (по сути - какая функция вызывается при клике по строке/отметке чекбокса)?

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

Есть пункты, которые должны быть видны в списке, но их нельзя выбирать.

Нравится

4 комментария
Лучший ответ

Это нелогично, Вы пользователю показываете список выбора, а потом оказывается, что что-то он выбрать не может. Правильно, не отображать в списке то, что выбрать нельзя и это проще реализовать с помощью фильтрации данных.

Посмотрите на метод isAnySelected

Это нелогично, Вы пользователю показываете список выбора, а потом оказывается, что что-то он выбрать не может. Правильно, не отображать в списке то, что выбрать нельзя и это проще реализовать с помощью фильтрации данных.

и тем не менее, пожелания клиента.

Там список с ценами, хотят видеть всё, но чтобы выбрать можно было только те, на которые хватает денег.

Нужно смотреть в LookupPageViewModelGenerator, который генерирует такую страницу. Случайно не оно?

/**
 * Subscribe to changes selectedRows.
 * @private
 */
_subscribeOnSelectedRowsChange: function() {
	this.on("change:selectedRows", this.onSelectedRowsChange, this);
},
/**
 * Handles selected rows change event.
 */
onSelectedRowsChange: function() {
	if (!this.isMultiSelect()) {
		return;
	}
	let selectedRowsCount = 0;
	if (this.get("SelectAllMode") && this.get("usingMultiAddMixin")) {
		var filteredRowsCount = this.get("filteredRowsCount");
		if (filteredRowsCount) {
var unselectedItems = this.getUnselectedItems();
selectedRowsCount = filteredRowsCount - unselectedItems.length;
		}
	} else {
		selectedRowsCount = this.getSelectedRecords().length;
	}
	this.set("selectedRowsCount", selectedRowsCount);
},

 

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

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

Не нашёл чего-то - есть ли возможность вызвать веб-сервис (такой https://academy.terrasoft.ru/documents/administration/7-13/integraciya-…) из клиентской схемы?

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

Нравится

1 комментарий
Лучший ответ

Вы можете вызвать сервис реализованный на C# так:

ServiceHelper.callService("UsrSaveProcedure", "ProcedureSql",
 
                function(response) {
 
                    console.log(response.ProcedureSqlResult);
 
                }, {CardId: this.get("Id")}, this);

А через вызванный сервис на клиенте, но уже на серверной части можете вызывать любые внешние веб-сервисы.

Или вы имеете ввиду, что-то иное?

Вы можете вызвать сервис реализованный на C# так:

ServiceHelper.callService("UsrSaveProcedure", "ProcedureSql",
 
                function(response) {
 
                    console.log(response.ProcedureSqlResult);
 
                }, {CardId: this.get("Id")}, this);

А через вызванный сервис на клиенте, но уже на серверной части можете вызывать любые внешние веб-сервисы.

Или вы имеете ввиду, что-то иное?

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

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

Есть справочник "Объекты администрирования" и есть одно из его представлений - "Роли". А можно ли отфильтровать только организационные роли?

Нравится

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

SELECT *

  FROM SysAdminUnit

 where sysadminUnittypeValue =0

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

Информация есть на Академии (https://academy.terrasoft.ru/documents/base/7-13/chasto-zadavaemye-vopr…):

В этом объекте содержится организационная структура компании: пользователи, организационные и функциональные роли. Каждая запись в таблице относится к определенному типу, для которого указывается цифра (“SysAdminUnitTypeValue”). Например, организационной роли соответствует цифра “1”, роли руководителей — цифра “2”, а пользователям — цифра “4”.

Также пример фильтрации ниже:

 Рис. 1

Рис. 2

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

Например, организационной роли соответствует цифра “1”, роли руководителей — цифра “2”, а пользователям — цифра “4”.

Дмитрий, а почему в системе:



с "1" только "System administrators",

а с "0" - "Sales Department", "All portal users", "Accounting Department" и "All employees"



Хотя, в списке организационных полей есть и те, и другие

Владимир Соколов,

по моему, там ещё есть разница между понятиями Организация и Подразделение.

У меня в итоге всё что мне нужно фильтруется вот таким образом:

var typeFilter = Terrasoft.createFilterGroup();
typeFilter.setLogicalOperation(1);
typeFilter.add("ManagerFilter", Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "SysAdminUnitTypeValue", 2));
typeFilter.add("DivFilter", Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "SysAdminUnitTypeValue", 1));
typeFilter.add("OrgFilter", Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "SysAdminUnitTypeValue", 0));
filterGroup.add("typeFilter", typeFilter);

 

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

добрый день.

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

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

основы JavaScript известны. А вот структура и принципы формирования страниц и их редактирование в версии ВРМ мягко говоря плохо понятны. Где что находится и как это редактировать-исправлять. На сайте ничего такого не нашел.Там вообще сложно хоть что-то найти даже если оно там есть.

Как вы сами изучали ? Методом научного тыка ?

P/S.

помимо ниже следующего ещё что-то есть ?

https://academy.terrasoft.ru/api/jscoreapi/7.12.0/

https://academy.terrasoft.ru/documents/technic-sdk/7-13/sozdanie-web-ca…

https://academy.terrasoft.ru/documents/technic-sdk/7-13/opisanie-platfo…

https://academy.terrasoft.ru/documents/technic-sdk/7-13/integraciya-sto…

https://academy.terrasoft.ru/documents/technic-sdk/7-13/otladka-klients…

https://academy.terrasoft.ru/documents/technic-sdk/7-13/sozdanie-klient…

https://academy.terrasoft.ru/documents/technic-sdk/7-13/kak-sozdat-polz…

https://academy.terrasoft.ru/documents/technic-sdk/7-13/ispolzovanie-en…

https://academy.terrasoft.ru/documents/technic-sdk/7-13/web-object-ispo…

Нравится

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

При вводе части строки в справочное поле получаем не только предложения для значений из bpm'online, но еще и от браузера.



Как их отключить? Возможно ли как-то улучшить эту ситуацию глобально, а не на каждом браузере пользователя?Изображение удалено.

Нравится

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

Добрый день,  Владимир.

Данная проблема нам известна, она связана с обновлением браузера Chrome. 

Как их отключить?

Рекомендуем Вам отключить настройку  "Адреса и другая информация" в браузера Chrome.



После этого подсказки выпадать списком не будут.

 Возможно ли как-то улучшить эту ситуацию глобально?

 Проблема исправлена в версии 7.13.2.

Спасибо, Илья!

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

Мотков Илья,

И проблема снова появилась в 7.16

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

 

В этот раз её рекомендуют отключить в настройках, см. скриншот выше, или в более новой версии так:

Пока Google не сделал отключение  только для определенных сайтов, надеемся, что Terrasoft исправит эту ситуацию внутри

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

В версии 7.16.2 должно исправиться.

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

Добрый день. Возникла проблема при установке пакета. Лог ошибки: 2019-01-28 08:28:22,238 System.Data.SqlClient.SqlException (0x80131904): The INSERT statement conflicted with the FOREIGN KEY constraint "FKjAq0FkyoI98D9WOxx46aiDCFY". The conflict occurred in database "rvvz_anonymous", table "dbo.SysCulture", column 'Id'. The statement has been terminated. На дев-стенде таблица SysCulture содержит 7 значений. На тестовом стенде 2 значения. Как можно обойти эту ошибку при установке пакета?

Нравится

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

прикрепите на закладке "данные" отсутствущие культуры к пакету, поставьте тип установки данных на странице привязки "Первоначальная установка" и будет Вам счастье :)

Проблема была решена после перезагрузки редиса.

C наполнением SysCulture нужно быть осторожным. Если туда залить что-то не то, сайт упадёт, причём вместе со страницей логина.

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

На странице академии есть пример создания кнопки в совмещенном режиме https://academy.terrasoft.ru/documents/technic-sdk/7-12/kak-dobavit-kno… , но не написано что для того что бы работа этот пример нужно что бы колонка основного контакта была выведена в списке контрагентов. По этой причине если пользователь сменит набор колонов - работать такой пример не будет.

Вопрос в том как заставить работать эту кнопку если в списке контрагентов нет колонки основного контакта?

Нравится

3 комментария
            getGridDataColumns: function() {
                var baseGridDataColumns = this.callParent(arguments);
                var gridDataColumns = {
                    "PrimaryContact": {path: "PrimaryContact"},
                    "Contact": {path: "Contact"},
                    //...
                    "ProcessElementId": {
                        path: "ProcessElementId",
                        dataValueType: 0
                    }
                };
                return Ext.apply(baseGridDataColumns, gridDataColumns);

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

Дмитрий А.,

вопрос о страние редактирования а не о реестре или детали с реестром, этот способ не годится для страниц редактирования

Видимо идей не укого нет

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

Добрый день!

Подскажите пожалуйста, как получить доступ к полям обьекта из кода с# если нам известен ID обьекта?

лезть в БД и тянуть селектом или есть какая-нибудь функция типа GetObjectByID ?

Нравится

5 комментариев
Лучший ответ

Зверев Александр,

Можно слегка упростить синтаксис :)

var _caseFile = new Terrasoft.Configuration.CaseFile(UserConnection);
_caseFile.FetchFromDB(recordId); 
var typeId = _caseFile.GetColumnValue("TypeId");
var name = _caseFile.GetColumnValue("Name");

 

В 5.Х была готовая функция для этой цели. Можно было указать объект, колонку и запись, получить в ответ значение колонки. Если в 7.Х нет, можно скопировать:

public static T GetEntityTypedColumnValue<T>(UserConnection userConnection, string schemaName, string columnName, Guid id) {	
	var schema = userConnection.EntitySchemaManager.GetInstanceByName(schemaName);
	var esq = new EntitySchemaQuery(schema);
	var queryColumnName = esq.AddColumn(columnName).Name;
	var filter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, schema.PrimaryColumn.Name, id);
	esq.Filters.Add(filter);
	var entities = esq.GetEntityCollection(userConnection);
	foreach (var entity in entities) {
return entity.GetTypedColumnValue<T>(queryColumnName);
	}
	return default(T);
}

Пример вызова в коде:

accountId = Terrasoft.Configuration.MsgServiceUtilities.GetEntityTypedColumnValue<Guid>(UserConnection, "Contact", "Account.Id", singleContactId);

 

Зверев Александр,

Можно слегка упростить синтаксис :)

var _caseFile = new Terrasoft.Configuration.CaseFile(UserConnection);
_caseFile.FetchFromDB(recordId); 
var typeId = _caseFile.GetColumnValue("TypeId");
var name = _caseFile.GetColumnValue("Name");

 

Григорий, скорее всего, так вытянутся все колонки объекта, что может быть излишним.

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

 

Григорий Чех,

 и вам спасибо за вариант !!! ситуации бывают разные  :))) это тоже пригодится

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