Нужно настроить видимость отчета в разделе где несколько страниц

Нужна видимость только в определенной странице.

что сделано:

в карточке и разделе:

attributes: {
			"VisibleExpenditure":
			{
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				"dataValueType": Terrasoft.DataValueType.BOOLEAN,
				"value": false
			}
		}

Преопределил функцию:

initCardPrintForms: function(callback, scope) {
                var reportsEsq = this.getModulePrintFormsESQ();
                reportsEsq.clientESQCacheParameters = {cacheItemName: this.getESQCacheName("CardPrintForms")};
                this.initCardPrintFormsEsqFilters(reportsEsq);
                reportsEsq.getEntityCollection(function(result) {
                    if (this.destroyed) {
                        return;
                    }
                    if (result.success && !result.collection.isEmpty()) {
                        var printFormsMenuCollection = result.collection;
                        this.preparePrintFormsMenuCollection(printFormsMenuCollection);
                        printFormsMenuCollection.each(function(item) {
                            item.set("Click", {bindTo: "generateCardPrintForm"});
                            if (item.get("Id") === "70ebac9d-d5ce-48c3-aee7-421dfcf0fe40") {
                                
                                item.set("visible",  {bindTo: "VisibleExpenditure"});
                            }
                        }, this);
                        var printMenuItems = this.preparePrintButtonCollection(this.moduleCardPrintFormsCollectionName);
                        printMenuItems.loadAll(printFormsMenuCollection);
                        this.set(this.moduleCardPrintFormsCollectionName, printMenuItems);
                        this.getCardPrintButtonVisible();
                    }
                    if (callback) {
                        callback.call(scope || this);
                    }
                }, this);
            }

потом в карточке прописал:

onEntityInitialized: function() {
				this.callParent(arguments);
				var visible = (this.get("WisType").value === "339a6b20-e26f-4f4a-8328-2b238c99e8bd");
				this.sandbox.publish("SetVisibleExpenditure", visible, ["SetVisibleExpenditure"]);
				this.set("VisibleExpenditure", visible);
			}

И разделе в разделе:

init: function() {
				this.callParent(arguments);
				var scope = this;
				this.sandbox.subscribe("SetVisibleExpenditure", function(arg) {
					scope.set("VisibleExpenditure",  arg);
					scope.initCardPrintForms();
				}, this, ["SetVisibleExpenditure"]);
			}

Видимость не работает!

При переходе по разным карточкам отчет активный всегда(

Нравится

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

Вопрос актуальный! Могу перефразировать: как обновлять выпадающие меню кнопки? Коллекцию изменил, но набор кнопок - тот же

Решил))) Нужно в функции initCardPrintForms прописать код:

	if (!this.get("VisibleExpenditure")) {
							printMenuItems.collection.removeAtKey("70ebac9d-d5ce-48c3-aee7-421dfcf0fe40");
						}

 

Показать все комментарии
7.13_()
sales

добрый день.

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

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

 

заранее благодарна за помощь.

Нравится

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

Добрый день, попробуйте посмотреть это видео.

Добрый день, попробуйте посмотреть это видео.

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

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



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

Нравится

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

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

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

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

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



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

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

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

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

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

Мотков Илья,

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

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

 

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

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

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

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

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

Добрый день. Возникла проблема при установке пакета. Лог ошибки: 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);

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

Дмитрий А.,

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

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

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

Добрый день.

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

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

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

Спасибо.

Нравится

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

Есть 2 разные воронки:

Блок итогов “Воронка продаж” следует отличать от блока итогов “График” с типом диаграммы “Воронка”. Блок итогов “График” описан в отдельной статье.

В мобильной версии поддерживается только вторая. 

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

Есть действие по множественному выбору в реестре. 

Проблема в том, что оно должно выполняться для большого кол-ва записей. Если я делаю Действия-Выбрать все, то он мне показывает, например, 4000 записей. Но когда я попадаю в метод обработки действия, то 

var selectedRows = this.get("SelectedRows");
this.showInformationDialog(selectedRows.length.toString());

возвращает кол-во записей, которые отображаются на странице в текущий момент, например, 30. Как мне поймать все записи?

Мне в конечном итоге надо будет передать их на сервер в БП или сервис. Возможно, можно на сервер передать фильтр, по которому этим записи отфильтровались и там выбрать коллекцию?

Есть пример реализации?

Нравится

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

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

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

Григорий Чех,это понятно.

Вопрос в том, как пробросить фильтр в запрос, который выбрал пользователь. Т.е. мне не тупо надо все записи в БД обработать, а те, которые выбраны. А до выбора они могут быть отфильтрованы.

Алексей-Карягин,

Тогда листать постранично по 30 записей и обрабатывать

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

4000 записей? нет уж, спасибо :)

Нужен другой способ.

Однако действие Delete в разделе работает не со страницей, а именно со всеми записями, кстати

 

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

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

Добрый день!



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

Нравится

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

Добрый день.

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

В loginmodule.js в onLoginButtonClick добавляю вызов аналогичный ..AuthService.svc/Login.

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

Анонимный сервис делал по аналогии https://academy.terrasoft.ru/documents/technic-sdk/7-13/kak-sozdat-anon…

Нравится

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

Скорее всего у вас не выполнен или выполнен с ошибками 4 пункт  руководства по созданию анонимного веб-сервиса а именно: Настройте доступ к WCF-сервиса для всех пользователей.

Возможно после окончания настройки сервиса вы не выполнили рестарт пула IIS

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

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

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

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

Для работы с веб-сервисом внешнему пользователю лицензия не нужна. Например, голосование за оценку по обращению в CaseRatingManagementService могут производить все, кто видят письмо со ссылками.

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

Почему для моего случая не работает?

Либо что-то неверно в коде, либо не так зарегистрирован в конфигах.

Может как-то влиять, что вызов моего сервиса происходит в callback сервиса авторизации? также в примере из академии пример не компилировался и я добавил наследование от BaseService. 

Сам сервис доступен без авторизации postman отправлять.

Также, если необходимо, могу привести пример клиент. кода loginmodule.js

Привожу пример моего сервиса:

[OperationContract]

        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,

        ResponseFormat = WebMessageFormat.Json)]

        public string GetMyService(string Name)

        {

            var returnObject = new

            {

                ResultCode = 0,

                ResponseText = ""

            };

            return JsonConvert.SerializeObject(returnObject);

        }

Возможно. Как вариант, сначала запускайте свой, а уже потом пытайтесь авторизироваться.

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

По логике мне нужно запустить свой сервис после сервиса авторизации.

Если авторизация уже прошла, то можно обычный сервис.

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

у пользователя может не быть лицензии, авторизация не пройдет полноценно, хотя AuthService возвращает OK, поэтому я рассчитывал настроить анонимный сервис

Все входы, в том числе и неуспешные, можно логировать:

 

scr_chapter_system_operations_log_system_setting.png

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

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

это усложняет задачу, через вызов сервиса никак нельзя?

Можно: 

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

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

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

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

Заметил интересную вещь о стандартным сервисом авторизации:

Запускаю его с клиента (у пользователя нет лицензии) в loginmodule.js и в колбэке еще раз его. Он отрабатывает и 401 ошибки нет. Как мне свой кастомный сервис также настроить?

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

А сервису авторизации не нужно знать, вошёл ранее или нет, он заменяет куки новыми.

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

Да, похоже на правду, есть пример реализации такого сервиса?

Сервис авторизации сделан на уровне ядра, в конфигурации его нет.

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

Хочу сделать сабж. Окошко выводится, но список пустой. Что я делаю не так?

Метод onPreparePaymentsList не вызывается, кстати. Ошибок в консоли нет.

define("UsrFlip1Page", ["ServiceHelper", "jQuery", "css!UsrFlip1PageCSS"], function(ServiceHelper, jQuery) {
	return {
		entitySchemaName: "UsrFlip",
		attributes: {
			"PaymentVList": {
				dataValueType: Terrasoft.DataValueType.COLLECTION,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				caption: "Платежи",
				name: "PaymentVList",
				isCollection: true
			}
		},
		details: /**SCHEMA_DETAILS*/{
		},
		diff: /**SCHEMA_DIFF*/[
		]/**SCHEMA_DIFF*/,
		methods: {
			init: function() {
				this.callParent(arguments);
				this.set("PaymentVList", this.Ext.create(Terrasoft.Collection));
			},
				
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.set("ActivePayments", null);
				var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "UsrPayment" });
				esq.addColumn("Id");
				esq.addColumn("UsrBillNumber");
				esq.addColumn("UsrPpNumber");
				esq.addColumn("UsrSum");
				esq.addColumn("UsrType.Name");
				esq.filters.add("filterAuto", this.Terrasoft.createColumnFilterWithParameter(
					this.Terrasoft.ComparisonType.EQUAL, "UsrAuto", this.get("UsrAutoId").value));
				esq.filters.add("filterStatus", this.Terrasoft.createColumnInFilterWithParameters("UsrStatus.Name",
					["Активный", "Не подтвержден"]));

				esq.getEntityCollection(function(result) {
					if (result.success) {
						var PaymentItems = {};
						result.collection.each(function(item) {
							PaymentItems[item.get("Id")] = {
								"value": item.get("Id"),
								"displayValue": item.get("UsrBillNumber") + " / " + item.get("UsrPpNumber") +
									" / " + item.get("UsrSum") + " / " + item.get("UsrType.Name")
							};
						}, this);

						var list = this.get("PaymentVList");
						list.loadAll(PaymentItems);
					}
				}, this);
			},
			
			getActions: function() {
				var actionMenuItems = this.callParent(arguments);
				actionMenuItems.addItem(this.getActionsMenuItem(
					{
						"Caption": "Уточнение назначения платежа",
						"Tag": "runPaymentCorrection"
					}
				));
				return actionMenuItems;
			},
			
			onPreparePaymentsList: function() {
				debugger;
			},
			
			runPaymentCorrection: function() {
				if (this.get("PaymentVList").getCount() === 0) {
					Terrasoft.showInformation("По данному авто нет активной оплаты!");
					return;
				}
				debugger;
				Terrasoft.showInputBox("Выберите п/п для уточнения", function(button) {
						Terrasoft.showInformation(button);
					}, ["ok", "cancel"], this, {
					name : {
						caption: "Платежи",
						dataValueType: Terrasoft.DataValueType.ENUM,
						className: "Terrasoft.ComboBoxEdit",
						list: {
							bindTo: "PaymentVList"
						},
						prepareList: {
							bindTo: "onPreparePaymentsList"
						},
						isRequired: true
					}
				},
				{
					defaultButton: 0
				});
			}
		},
		rules: {}
	};
});

 

Нравится

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

Алексей, вот кусок кода, который вы можете использовать для вашей задачи. Были рады помочь.

define("ActivityPageV2", [], function() {
return {
entitySchemaName: "Activity",
rules: {},
messages: {},
details: /*SCHEMA_DETAILS/{}/*SCHEMA_DETAILS/,
attributes: {},
methods: {

getActions: function() {
var actionMenuItems = this.callParent(arguments);
actionMenuItems.addItem(this.getActionsMenuItem(
{
"Caption": "Тестовое действие",
"Click":

{"bindTo": "statusInputBox"}
}
));
return actionMenuItems;
},

statusInputBox: function() {
var caption = "Выбор статуса";
this.set("StatusList", new Terrasoft.Collection());
var controls = {
"ActivityStatus": {
dataValueType: Terrasoft.DataValueType.ENUM,
isRequired: true,
caption: "Статус",
value:

{ bindTo: "ActivityStatus" }
,
customConfig: {
list:

{ bindTo: "StatusList" }
,
prepareList:

{ bindTo: "onPrepareStatusList" }
}
}
};
var statusInputBoxHandler = this.statusInputBoxHandler.bind(this);
Terrasoft.utils.inputBox(caption, statusInputBoxHandler,
[Terrasoft.MessageBoxButtons.OK, Terrasoft.MessageBoxButtons.CANCEL],
this, controls);
Terrasoft.each(Terrasoft.MessageBox.controlArray, function(item)

{ item.control.bind(this); }
, this);
},

onPrepareStatusList: function() {
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery",

{ rootSchemaName: "ActivityStatus" }
);
esq.addColumn("Id");
esq.addColumn("Name");
esq.filters.add("finish", Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "Finish", true));
esq.getEntityCollection(function(result) {
if (result.success) {
var items = {};
result.collection.each(function(item) {
items[item.get("Id")] =

{ "value": item.get("Id"), "displayValue": item.get("Name") }
;
}, this);
var list = this.get("StatusList");
list.loadAll(items);
}
}, this);
},

statusInputBoxHandler: function(tag, data) {
if (Terrasoft.MessageBoxButtons.OK.returnCode === tag) {
if (Ext.isEmpty(data.ActivityStatus.value)) {
this.showInformationDialog("Нужно что-то выбрать", function()

{ this.statusInputBox(); }
);
} else

{ this.showInformationDialog(data.ActivityStatus.value.displayValue); }
}
}

},
diff: /*SCHEMA_DIFF/[]/*SCHEMA_DIFF/
};
});

 

Маялся уже. Всю голову сломал. Лист не готовится, от вручную указанного кол-ва записей в листе ничего не зависит, "prepareList" не вызывается... Через час плюнул, сделал собственный модуль)

Делал что-то подобное, но через messageBox. Метод в prepareList вызывался (при попытке выбора), как и метод в change.

Тёскин Дмитрий Валерьевич,

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

Алексей-Карягин,

Примера кода, к сожалению, не осталось. Попробовал вчера на досуге ваш код поковырять - действительно не работает. Возможно я использовал какой-то кастомизированный messageBox. Единственное, что заметил - у меня ветки объекта prepareList и change были внутри customConfig.

Алексей, вот кусок кода, который вы можете использовать для вашей задачи. Были рады помочь.

define("ActivityPageV2", [], function() {
return {
entitySchemaName: "Activity",
rules: {},
messages: {},
details: /*SCHEMA_DETAILS/{}/*SCHEMA_DETAILS/,
attributes: {},
methods: {

getActions: function() {
var actionMenuItems = this.callParent(arguments);
actionMenuItems.addItem(this.getActionsMenuItem(
{
"Caption": "Тестовое действие",
"Click":

{"bindTo": "statusInputBox"}
}
));
return actionMenuItems;
},

statusInputBox: function() {
var caption = "Выбор статуса";
this.set("StatusList", new Terrasoft.Collection());
var controls = {
"ActivityStatus": {
dataValueType: Terrasoft.DataValueType.ENUM,
isRequired: true,
caption: "Статус",
value:

{ bindTo: "ActivityStatus" }
,
customConfig: {
list:

{ bindTo: "StatusList" }
,
prepareList:

{ bindTo: "onPrepareStatusList" }
}
}
};
var statusInputBoxHandler = this.statusInputBoxHandler.bind(this);
Terrasoft.utils.inputBox(caption, statusInputBoxHandler,
[Terrasoft.MessageBoxButtons.OK, Terrasoft.MessageBoxButtons.CANCEL],
this, controls);
Terrasoft.each(Terrasoft.MessageBox.controlArray, function(item)

{ item.control.bind(this); }
, this);
},

onPrepareStatusList: function() {
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery",

{ rootSchemaName: "ActivityStatus" }
);
esq.addColumn("Id");
esq.addColumn("Name");
esq.filters.add("finish", Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "Finish", true));
esq.getEntityCollection(function(result) {
if (result.success) {
var items = {};
result.collection.each(function(item) {
items[item.get("Id")] =

{ "value": item.get("Id"), "displayValue": item.get("Name") }
;
}, this);
var list = this.get("StatusList");
list.loadAll(items);
}
}, this);
},

statusInputBoxHandler: function(tag, data) {
if (Terrasoft.MessageBoxButtons.OK.returnCode === tag) {
if (Ext.isEmpty(data.ActivityStatus.value)) {
this.showInformationDialog("Нужно что-то выбрать", function()

{ this.statusInputBox(); }
);
} else

{ this.showInformationDialog(data.ActivityStatus.value.displayValue); }
}
}

},
diff: /*SCHEMA_DIFF/[]/*SCHEMA_DIFF/
};
});

 

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