NullOrEmptyException
Технические вопросы
7.x

Добавил несколько полей в чистую конфигурацию и вот что выбило:


Уже чистил кеш, перезаходил в систему и компилировал - не помогло.

Нравится

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

А в новых полях на Opportunity кто нибудь ссылается?
Еще redis можно сбросить попробовать

Opportunity такого поля нет, больше никаких доработок не было.

"Александр Кудряшов" написал:Еще redis можно сбросить попробовать


это где?

"Радчук Виталий Владимирович" написал:это где?

Версия у вас в облаке или локально развернута?
Если в облаке - пишите запрос в поддержку TS на очистку Redis для вашего сайта

"Радчук Виталий Владимирович" написал:

Opportunity такого поля нет, больше никаких доработок не было.


Речь о поле, которое у вас добавлено, и в нем ссылка на объект Продажа (Opportunity) - искать нужно начинать с него...
В других браузерах тоже кракозябры в тексте ошибки?

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

Пришлите пожалуйста скриншот ошибки из консоли браузера с помощью google Chrome
Т.к. в хроме текст ошибки будет корректно отображаться.

"Александр Кудряшов" написал:Речь о поле, которое у вас добавлено, и в нем ссылка на объект Продажа (Opportunity) - искать нужно начинать с него...

Нет таких ссылок..
"Липатов Юрий Сергеевич" написал:Пришлите пожалуйста скриншот ошибки из консоли браузера с помощью google Chrome
Т.к. в хроме текст ошибки будет корректно отображаться.

Спасибо за помощь, исправлено. Нужно было удалить с карточки заказа базовое поле "Продажа"

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

Добрый день!
Есть бизнес-процесс, который преобразует Объект недвижимости в Листинг. У Объекта недвижимости есть деталь Контакты. Нужно чтобы при преобразовании объекта недвижимости деталь добавлялась в Листинг. При этом, контактов у Объекта недвижимости может быть несколько. И нужно, чтобы переносились они все. Подскажите как это лучше сделать.

Нравится

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

Наталья,

Не совсем понятно что значит “Нужно чтобы при преобразовании объекта недвижимости деталь добавлялась в Листинг.”
Условно - есть деталь [Контакты в об. недв.] в разделе Объект недвижимости. Есть деталь [Контакты в листинге] в разделе Листинги.
Для того, чтобы перенести записи с одной детали в другую следует использовать элемент “Добавить данные”.
В элементе указать “Добавить результат выборки” по объекту [Контакты в об. недв.] с фильтром по Id объекта недвижимости.
Добавлять данные в объект [Контакты в листинге]. Поле Контакт = Результат выборки. Контакт.

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

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

Версия 7.6.0.1265

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

При редактирование через мастер деталей там отображаються контейнеры, а не контролы. При замещение объекта Relationship(Взаимосвязь) - у полей RelationType и ReverseRelationType признак Список не доступен для редактирования (скриншот в приложении).

Подскажите как реализовать данную задачу.

Нравится

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

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

Это возможно сделать через мастер деталей.
Откройте настройки детали:
и измените поле справочника как показано на скриншоте

Показать все комментарии
видимость
грид
кнопка
реестр
Технические вопросы
7.x

Коллеги, доброго дня!
Возможно, кто-то сталкивался с необходимостью скрывать/отображать кнопки в реестре по условию? Пример из документации SDK не получилось адаптировать:

isCategory: function() {
        var activeRow = this.get("ActiveRow");
        if (activeRow)
                    {
                        var cat = this.get("GridData").get(activeRow).get("Category");
                        return (cat == "ID_нужной_категории") ? true : false;
                    }
       return false;
}

Необходимо в зависимости от категории и состояния Активности скрывать и отображать различные кнопки

Нравится

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

Антон, у Вас в в переменной cat хранится объект с value и displayValue.
Для сравнения с "ID_нужной_категории" нужно брать cat.value.
Также важно, что если у вас не будет выведена колонка в реестр, то вы не сможете получить ее значение.
Для того, чтобы необходимая колонка всегда тянулась в ActiveRow можете переопределить следующий метод:

getGridDataColumns: function(){
                var gridDataColumns = this.callParent(arguments);
                gridDataColumns.Category= gridDataColumns.Category|| {path: "Category"};
                return gridDataColumns;
            }

Александр, спасибо, однако это не помогло, к сожалению. Как только делаю привязку свойства visible к функции isComplectationCategory, так сразу кнопка пропадает независимо от категории выбранной активности. Изменение условия проверки (с "==" на "!=") не помогает, кнопка в любом случае скрыта.

Вот полный код ActivitySectionV2:

define("ActivitySectionV2", ['ConfigurationConstants', 'ProcessModuleUtilities'],
	function(ConfigurationConstants, ProcessModuleUtilities) {
		return {
			entitySchemaName: "Activity",
			methods: {
						// добавляем новые пункты в меню "Действия"
				getSectionActions: function() {
					var actionMenuItems = this.callParent(arguments);
					actionMenuItems.addItem(this.getButtonMenuItem({
						Type: "Terrasoft.MenuSeparator",
						Caption: "Задачи на комплектацию"
					}));
					actionMenuItems.addItem(this.getActionsMenuItem({
						Caption: "Взять в работу",
						Click: {bindTo: "Get2Work"}
				}));
					return actionMenuItems;
				},
						// отработка нажатия пункта "Взять в работу" в "Действиях"
				Get2Work: function() {
					debugger;
					var processArgs = {
						sysProcessName: "UsrProcessGet2Work",
							parameters: {
							IncomingActivitiesList: this.getSelectedItems()
								}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// выбор функций для отработки нажатий кнопок в реестре
				onActiveRowAction: function(buttonTag, primaryColumnValue) {
					switch (buttonTag) {
						case "ComplectationFinished":
							this.ComplectationFinishedProcess(primaryColumnValue);
							break;
						case "Sended":
							this.SendedProcess(primaryColumnValue);
							break;
						case "SamplesReceived":
							this.SamplesReceivedProcess(primaryColumnValue);
							break;
						default:
							this.callParent(arguments);
							break;
					}
				},
						// отработка кнопки "Скомплектовано"
				ComplectationFinishedProcess: function(recordId) {
					debugger;
					var activeRow = this.get("ActiveRow");
					var processArgs = {
						sysProcessName: "UsrComplectationFinishedProcess",
							parameters: {
								recordId: activeRow
							}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// отработка кнопки "Отправлено"
				SendedProcess: function(recordId) {
					debugger;
					var activeRow = this.get("ActiveRow");
					var processArgs = {
						sysProcessName: "UsrSendedProcess",
							parameters: {
								recordId: activeRow
							}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// отработка кнопки "Образцы получены"
				SamplesReceivedProcess: function(recordId) {
					debugger;
					var activeRow = this.get("ActiveRow");
					var processArgs = {
						sysProcessName: "UsrSamplesReceivedProcess",
							parameters: {
								recordId: activeRow
							}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// установка видимости кнопки "Скомплектовано", если категория активности == "Комплектация"
				isComplectationCategory: function() {
					var activeRow = this.get("ActiveRow");
					if (activeRow) {
						var cat = this.get("GridData").get(activeRow).get("ActivityCategory");
						return (cat.value != "4b9497c0-e794-40bc-81e0-5f46c9bde343") ? true : false;	// 4b9497c0-e794-40bc-81e0-5f46c9bde343 категория "Комплектация"
					}
					return false;
				},
				getGridDataColumns: function() {
					var gridDataColumns = this.callParent(arguments);
					gridDataColumns.ActivityCategory= gridDataColumns.ActivityCategory|| { path: "ActivityCategory" };
					return gridDataColumns;
				}
			},
			diff: /**SCHEMA_DIFF*/[
						// вставка кнопки "Скомплектовано"
				{ 
					"operation": "insert",
					"name": "ComplectationFinishedAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"caption": "Скомплектовано",
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"tag": "ComplectationFinished",
						"visible": {"bindTo": "isComplectationCategory"}
					}
				},
						// ставка кнпоки "Отправлено"
				{ 
					"operation": "insert",
					"name": "SendedAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"caption": "Отправлено",
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"tag": "Sended"
					}
				},
						// вставка кнопки "Образцы отправлены"
				{ 
					"operation": "insert",
					"name": "SamplesReceivedAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"caption": "Образцы получены",
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"tag": "SamplesReceived"
					}
				}
			]/**SCHEMA_DIFF*/
		};
	}
);

При установке внутрь функции isComplectationCategory точек остановки или уведомлений ничего не происходит - ощущение, что при выборе текущей строки реестра эта функция не срабатывает. Может, что-то ещё упустил в коде?

И ещё бы весьма признателен за подсказку, как скрыть стандартные кнопки в реестре

Попробуйте создать атрибут и забиндить видимость на него. Изменять состояние атрибута можно при изменении активного столбца, например.
А какие именно стандартные кнопки нужно скрыть? Они либо в diff по названию удаляются,либо методы, которые их формируют нужно сделать пустыми.
В этой теме есть пример:
http://www.community.terrasoft.ru/forum/topic/15106

Снова не помогло:

define("ActivitySectionV2", ['ConfigurationConstants', 'ProcessModuleUtilities'],
	function(ConfigurationConstants, ProcessModuleUtilities) {
		return {
			entitySchemaName: "Activity",
			attributes: {
				'isComplectationCategoryAttribut': {
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					dataValueType: Terrasoft.DataValueType.BOOLEAN,
					dependencies: [{
						columns: ["ActivityCategory"],
						methodName: "isComplectationCategoryAttributSet"
					}]
				}
			},
			methods: {
						// добавляем новые пункты в меню "Действия"
				getSectionActions: function() {
					var actionMenuItems = this.callParent(arguments);
					actionMenuItems.addItem(this.getButtonMenuItem({
						Type: "Terrasoft.MenuSeparator",
						Caption: "Задачи на комплектацию"
					}));
					actionMenuItems.addItem(this.getActionsMenuItem({
						Caption: "Взять в работу",
						Click: {bindTo: "Get2Work"}
				}));
					return actionMenuItems;
				},
				isComplectationCategoryAttributSet: function() {
					var activeRow = this.get("ActiveRow");
					var cat = this.get("GridData").get(activeRow).get("ActivityCategory");
					this.set('isComplectationCategoryAttribut', cat.value === "4b9497c0-e794-40bc-81e0-5f46c9bde343")
					return true;	// 4b9497c0-e794-40bc-81e0-5f46c9bde343 категория "Комплектация"
				},
						// отработка нажатия пункта "Взять в работу" в "Действиях"
				Get2Work: function() {
					debugger;
					var processArgs = {
						sysProcessName: "UsrProcessGet2Work",
							parameters: {
							IncomingActivitiesList: this.getSelectedItems()
								}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// выбор функций для отработки нажатий кнопок в реестре
				onActiveRowAction: function(buttonTag, primaryColumnValue) {
					switch (buttonTag) {
						case "ComplectationFinished":
							this.ComplectationFinishedProcess(primaryColumnValue);
							break;
						case "Sended":
							this.SendedProcess(primaryColumnValue);
							break;
						case "SamplesReceived":
							this.SamplesReceivedProcess(primaryColumnValue);
							break;
						default:
							this.callParent(arguments);
							break;
					}
				},
						// отработка кнопки "Скомплектовано"
				ComplectationFinishedProcess: function(recordId) {
					debugger;
					var activeRow = this.get("ActiveRow");
					var processArgs = {
						sysProcessName: "UsrComplectationFinishedProcess",
							parameters: {
								recordId: activeRow
							}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// отработка кнопки "Отправлено"
				SendedProcess: function(recordId) {
					debugger;
					var activeRow = this.get("ActiveRow");
					var processArgs = {
						sysProcessName: "UsrSendedProcess",
							parameters: {
								recordId: activeRow
							}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// отработка кнопки "Образцы получены"
				SamplesReceivedProcess: function(recordId) {
					debugger;
					var activeRow = this.get("ActiveRow");
					var processArgs = {
						sysProcessName: "UsrSamplesReceivedProcess",
							parameters: {
								recordId: activeRow
							}
					};
					ProcessModuleUtilities.executeProcess(processArgs);
				},
						// установка видимости кнопки "Скомплектовано", если категория активности == "Комплектация"
				/*isComplectationCategory: function() {
					debugger;
					var activeRow = this.get("ActiveRow");
					debugger;
					if (activeRow) {
						var cat = this.get("GridData").get(activeRow).get("ActivityCategory");
						debugger;
						return (cat.value === "4b9497c0-e794-40bc-81e0-5f46c9bde343") ? true : false;	// 4b9497c0-e794-40bc-81e0-5f46c9bde343 категория "Комплектация"
					}
					return false;
				},*/
				getGridDataColumns: function() {
					var gridDataColumns = this.callParent(arguments);
					gridDataColumns.ActivityCategory= gridDataColumns.ActivityCategory|| { path: "ActivityCategory" };
					return gridDataColumns;
				}
			},
			diff: /**SCHEMA_DIFF*/[
						// вставка кнопки "Скомплектовано"
				{ 
					"operation": "insert",
					"name": "ComplectationFinishedAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"caption": "Скомплектовано",
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"tag": "ComplectationFinished",
						"visible": {"bindTo": "isComplectationCategoryAttribut"}
					}
				},
						// ставка кнпоки "Отправлено"
				{ 
					"operation": "insert",
					"name": "SendedAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"caption": "Отправлено",
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"tag": "Sended"
					}
				},
						// вставка кнопки "Образцы отправлены"
				{ 
					"operation": "insert",
					"name": "SamplesReceivedAction",
					"parentName": "DataGrid",
					"propertyName": "activeRowActions",
					"values": {
						"className": "Terrasoft.Button",
						"caption": "Образцы получены",
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"tag": "SamplesReceived"
					}
				}
			]/**SCHEMA_DIFF*/
		};
	}
);

Кнопка теперь всегда скрыта. Подозреваю, что для Section некорректно писать type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN, или вообще где-то глобально ошибаюсь?

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

{
				"operation": "remove",
				"name": "DataGridActiveRowDeleteAction"
}

где "DataGridActiveRowDeleteAction" это название кнопки, взятое из BaseSectionV2

Антон, для наглядности оставил только 1 кнопку и соответствующие методы.
Обратите внимание на метод addColumnLink. Без него зависимость видимости не срабатывает.
Пример найден в LeadSectionV2.

define("ActivitySectionV2", ["terrasoft",'ConfigurationConstants', 'ProcessModuleUtilities'],
    function(Terrasoft,ConfigurationConstants, ProcessModuleUtilities) {
        return {
            entitySchemaName: "Activity",
            attributes: {},
            methods: {
 
                addColumnLink: function(item) {
                    var self = this;
                    item.isComplectationCategoryAttributSet= function() {
                        return self.isComplectationCategoryAttributSet.call(self, this.get(this.primaryColumnName));
                    };
                    return this.callParent(arguments);
                },
 
                isComplectationCategoryAttributSet: function(activeRow) {
                    if (!activeRow) return true;
                    var cat = this.get("GridData").get(activeRow).get("ActivityCategory");
                    return cat&&cat.value === "f51c4643-58e6-df11-971b-001d60e938c6"; //категория = выполнить. Для теста
                    //return cat&&cat.value === "4b9497c0-e794-40bc-81e0-5f46c9bde343"; //категория "Комплектация"
 
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "insert",
                    "name": "ComplectationFinishedAction",
                    "parentName": "DataGrid",
                    "propertyName": "activeRowActions",
                    "values": {
                        "className": "Terrasoft.Button",
                        "caption": "Скомплектовано",
                        "style": Terrasoft.controls.ButtonEnums.style.GREEN,
                        "tag": "ComplectationFinished",
                        "visible": {"bindTo": "isComplectationCategoryAttributSet"}
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    }
);

Александр, прекрасно! Ваше решение работает, большое спасибо

Показать все комментарии
период
фильтр
Технические вопросы
7.x

Добрый день!

Как в bpm (7.6) создать свои периоды для фильтров?
Например "С начала текущего года по сегодняшнюю дату",
"С начала прошлого года по такую же дату в прошлом году",
"Последние 12 месяцев" и т.п.?

https://community.terrasoft.ua/system/files/period_0.png

Нравится

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

Здравствуйте, Владимир!
Привожу примеры с полем с типом "Дата"

  1. С начала текущего года и по сегодняшнюю дату
  2. С начала прошлого года по такую же дату в прошлом году
  3. Последние 12 месяцев

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

Спасибо! Действительно, всё легче, чем казалось.

Хотя, у меня такая конструкция работает хорошо:

Date<Previous Days365
Date=Previous Year

А такая плохо:

Date≤Previous Days365
Date=Previous Year
Показать все комментарии
Технические вопросы
7.x

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

Версия 7.7.0.2325

Создал объект UsrOrderType, унаследован от базового справочника, свои поля не добавлял. Через раздел Справочники зарегестрировал объект.

При открытии по кнопке Открыть наполнение, в консоли ошибка "Uncaught Terrasoft.ItemNotFoundException: Объект Terrasoft.UsrOrderType не найден".

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

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

Нравится

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

Добрый день.

Попробуйте пере сохранить одну любую клиентскую схему.

"Липатов Юрий Сергеевич" написал:

Добрый день.

Попробуйте пере сохранить одну любую клиентскую схему.

Помогло, спасибо.

Показать все комментарии
Фильтрация поля в мобильном приложении
Мобильное приложение
7.x

BPMonline 7.7.0.2326

Создала новое поле справочник UsrAgent (выбор из контактов). Возможно ли настроить фильтрацию этого поля в мобильном приложении, чтобы выбирались только контакты нашей компании с типом агент?
И в какой схеме это реализовывать?

Нравится

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

Здравствуте, Виктория!

Для решения данной задачи можно использовать бизнес правило фильтрации для мобильного приложения.

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

Terrasoft.sdk.Model.addBusinessRule("Invoice", {
    ruleType: Terrasoft.RuleTypes.Filtration,
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    triggeredByColumns: ["Account"],
    filteredColumn: "Contact",
    filters: Ext.create("Terrasoft.Filter", {
        property: "Account"
    })
});

Здравствуте, Виктория!

Для решения данной задачи можно использовать бизнес правило фильтрации для мобильного приложения.

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

Terrasoft.sdk.Model.addBusinessRule("Invoice", {
    ruleType: Terrasoft.RuleTypes.Filtration,
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    triggeredByColumns: ["Account"],
    filteredColumn: "Contact",
    filters: Ext.create("Terrasoft.Filter", {
        property: "Account"
    })
});

Здравствуйте!
Не поняла, где именно это реализовывать.
Я создала через мастер мобильного приложения свое рабочее место "Агенты" и поместила туда раздел Лиды.
В Лиде есть новое поле справочник UsrAgent (выбор из контактов). Хотела бы его отфильтровать, чтобы при выборе из справочника были только контакты нашей компании с типом агент, наподобие ответственного в любых карточка BPMonline.
Но обратила внимания, что поле ответственный, например, в документе в мобильном приложении не фильтруется (хотела посмотреть пример реализации).
Скажите, возможно ли фильтровать поле в мобильном приложении?
и в какой именно схеме нужно делать изменения?

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

Мне нужно сделать фильтрация для полей раздела Лид. Нашла MobileLeadModelConfig (но написана она, как исходный код).

Заместить я ее не могу, так как нет в списке замещения и новую создать точно такую же не могу, потому что пользовательские схемы должны начинаться с Usr.

И как мне быть? Получается, что это ошибка системы? Как выйти из этой ситуации?

Добрый день, Виктория
Для решения Вашей задачи необходимо:

  • Желательно создать отдельную схему с типом «Модуль»
    И назвать ее так «UsrMobileLeadModelConfig» (чтоб она соответствовала базовым стилям именования файлов).
  • Внутри нее поместить такой код:
    Terrasoft.sdk.Model.addBusinessRule("Lead", {
    	name: "UsrMobileLeadUsrAgentFilter",
    	ruleType: Terrasoft.RuleTypes.Filtration,
    	events: [Terrasoft.BusinessRuleEvents.Load],
    	triggeredByColumns: ["UsrAgent"],
    	filters: Ext.create("Terrasoft.Filter", {
    		name: "filterName",
    		type: Terrasoft.FilterTypes.Group,
    		logicalOperation: Terrasoft.FilterLogicalOperations.And,
    		subfilters: [
    			{
    				property: "Account",
    				value: 'айдишникнашейкомпании'
    			},
    			{
    				property: "Type",
    				value: 'айдишниктипаконтактаагент'
    			}
    		]
    	})
    });
  • Затем эту схему необходимо подключить в манифесте:
    - Создаем/Открываем схему UsrMobileApplicationManifestDefaultWorkplace
    - Добавляем в блок Models такой код:
    "Models": {
       "Lead": {
          "PagesExtensions": ["UsrMobileLeadModelConfig"]
       }
    }
  • Сохраняем
  • Синхронизируемся на девайсе

Здравствуйте!
Весь день пробую код, который вы написали.

Заметила, что если в блоке "Models" добавить в "PageExtensions", то при синхронизации возникает ошибка, поэтому (по примеру в коде) добавила в "ModelExtensions" и проверила на обязательности этого поля, все срабатывает.
Terrasoft.sdk.Model.addBusinessRule('Lead', {
ruleType: Terrasoft.RuleTypes.Requirement,
triggeredByColumns: ['UsrAgent']
});

Но фильтрация не работает, пустой список, пробовала и просто по Account и по двум, пустой список и все.
Почему не работает фильтрация?
Почему пустой список хотя в sql с этими id есть 2 записи и в приложении на компе тоже 2 записи, а в мобильном приложении пусто?
Значение name: "filterName" должно быть любым или определенным? Или в чем-то другом причина?

Получилось настроить фильтрацию по текстовому полю:

Terrasoft.sdk.Model.addBusinessRule("Lead", {
ruleType: Terrasoft.RuleTypes.Filtration,
triggeredByColumns: ["UsrAgent"],
filters: Ext.create("Terrasoft.Filter", {
compareType: Terrasoft.ComparisonTypes.Equal,
property: "Name",
value: "Агент 1",
name: "test123"
})
});

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

1)

"Чуплыгина Виктория Викторовна" написал:"PageExtensions", то при синхронизации возникает ошибка

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

2) Проверьте, что значения Id-шников указаны в нижнем регистре

{
   property: "Account",
   value: "e308b781-3c5b-4ecb-89ef-5c1ed4da488e"
},

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

1) Если получилось настроить обязательность и фильтрацию по текстовому полю, то, мне кажется, подключила я все верно.
Квадратные скобки я поставила.

2) да, в нижнем регистре.

Может, все-таки для фильтрации по справочнику нужно указать что-то еще?
Никак не могу понять, что именно.

Terrasoft.sdk.Model.addBusinessRule("Activity", {
ruleType: Terrasoft.RuleTypes.Filtration,
events: [Terrasoft.BusinessRuleEvents.Load],
triggeredByColumns: ["Owner"],
filters: Ext.create("Terrasoft.Filter", {
property: "Active",
modelName: "SysAdminUnit",
assocProperty: "Contact",
operation: Terrasoft.FilterOperations.Any,
name: "ActivityContact_SysAdminUnit_Filtration",
value: true
})
});

Фильтрация поля ответственный в разделе активности?
что означают свойства modelName и assocProperty?
modelName, наверно, там, где искать property?

Да, это она.
modelName - имя связанной таблицы.
assocProperty - имя колонки по которой связанная таблица ссылается на фильтруемую таблицу.

Это не обычный фильтр, а фильтр по обратным связям.
Он означает следующее: Берем всех контактов для которых существует запись в таблице SysAdminUnit которая ссылается на контакта через свое поле SysAdminUnit.Contact

Значение name: "filterName" может быть любым

Указанный пример должен работать.
Попробуйте еще такой пример:

Сначала с NotEqual

Terrasoft.sdk.Model.addBusinessRule("Lead", {
	ruleType: Terrasoft.RuleTypes.Filtration,
	triggeredByColumns: ["UsrAgent"],
	filters: Ext.create("Terrasoft.Filter", {
		compareType: Terrasoft.ComparisonTypes.NotEqual,
		property: "Id",
		value: "81d05412-d90c-440a-831a-03fc52489fa5",
		name: "name1"
	})
});

а затем с Equal

Похоже что данные по колонке Тип не забираются для таблицы "Контакт"
Добавьте в манифест колонку тип, примерно так:

"ModelDataImportConfig": [
{
	"Name": "Contact",
	"SyncColumns": [
		"Name",
		"Account",
		"Department",
		"JobTitle",
		"Photo",
		"Type"
	]
}
]

После чего лучше очистить кеш и пересинхронизироваться

Спасибо Вам большое!!!!!

Действительно данные по колонкам не забирались для таблицы контакт!

Показать все комментарии
Открытие карточки лида в мобильном приложении
Мобильное приложение
7.x

BPMonline 7.7.0.2326
В мобильном приложении будет всего 1 раздел Лиды.

Возможно ли при загрузке приложения сразу открывать карточку нового лида, а не реестр?
И в какой схеме это реализовывать?

Нравится

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

Виктория, здравствуйте!

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

loadData: function() {
                               this.callParent(arguments);
                               this.openEditPage();

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

Ext.define('ContactGridPage.Controller', {
                extend: 'Terrasoft.controller.BaseGridPage',
                statics: {
                               Model: Contact
                },
                config: {
                               refs: {
                                               view: '#ContactGridPage'
                               }
                },
 
               loadData: function() {
                               this.callParent(arguments);
                               this.openEditPage();
                }
 
});

Информацию по созданию кастомных страниц в приложении добавляю во вложение.

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

Создала модуль UsrMobileLeadGridPage:

/* globals Lead: false */
Terrasoft.LastLoadedPageData = {
controllerName: "UsrMobileLeadGridPage.Controller",
viewXType: "usrmobileleadgridpageview"
};

Ext.define("UsrMobileLeadGridPage.View", {
extend: "Terrasoft.view.BaseGridPage",
xtype: "usrmobileleadgridpageview",
config: {
id: "UsrMobileLeadGridPage"
}
});

Ext.define("UsrMobileLeadGridPage.Controller", {
extend: "Terrasoft.controller.BaseGridPage",
statics: {
Model: Lead
},
config: {
refs: {
view: "#UsrMobileLeadGridPage"
}
},

loadData: function() {
this.callParent(arguments);
this.openEditPage();
}
}
);

И модуль UsrMobileLeadEditPage:

/* globals Lead: false */
Terrasoft.LastLoadedPageData = {
controllerName: "UsrMobileLeadEditPage.Controller",
viewXType: "usrmobileleadeditpageview"
};

Ext.define("UsrMobileLeadEditPage.View", {
extend: "Terrasoft.view.BaseEditPage",
xtype: "usrmobileleadeditpageview",
config: {
id: "UsrMobileLeadEditPage"
}
});

Ext.define("UsrMobileLeadEditPage.Controller", {
extend: "Terrasoft.controller.BaseEditPage",

statics: {
Model: Lead
},

config: {
refs: {
view: "#UsrMobileLeadEditPage"
}
}

});

Добавила в UsrMobileApplicationManifestAgents в блоке Models:

"Lead": {
"Grid": "UsrMobileLeadGridPage",
"Edit": "UsrMobileLeadEditPage",
"RequiredModels": [
"Lead",
"LeadTypeStatus",
"QualifyStatus",
"LeadRegisterMethod",
"LeadType",
"Contact",
"UsrPlaceReceiptLead"
],
"ModelExtensions": [
"UsrMobileLeadModelConfig"
],
"PagesExtensions": [
"UsrMobileLeadActionsSettingsAgents",
"UsrMobileLeadGridPageSettingsAgents",
"UsrMobileLeadRecordPageSettingsAgents"
]
},

При синхронизации возникает ошибка:
Uncaught TypeError: Object prototype may only be an Object or null

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

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

Добрый день!
В процессе подключения к Вашей базе в рамках инцидента 0285053 были найдены некоторые недоработки:
UsrMobileLeadGridPage, там было несколько проблем:
1. В extend-е Вы указали Terrasoft.view.BaseGridPage, а нужно было Terrasoft.view.BaseGridPage.View.
2. Нужно было определить класс хранилища (UsrMobileLeadGridPage.Store).
3. При добавлении view нужно было указать гриду этот store.

Сейчас после синхронизации и запуска приложения открывается карточка редактирования Лида. Но у меня есть пара вопросов:
1. после сохранения Лида пользователь все-равно будет возвращаться в реестр и метод loadData снова сработает и карточка редактирования откроется снова. Так и задумывалось?
2. У Вас в Лидах настроена фильтрация по какому-то Id, соот-но, после добавления новой записи пользователь ее не увидит.

Вот этот фильтр не показывает записи Лидов:
Terrasoft.sdk.Module.addFilter("Lead", Ext.create("Terrasoft.Filter", {
compareType: Terrasoft.ComparisonTypes.Equal,
property: "Id",
value: "47e361ae-0000-0000-0000-9ec808adfee3"
}));

Спасибо Вам большое!!!!
Все заработало так, как надо!!!

1. Да, так и задумывалось, чтобы постоянно открывалась карточка при входе в реестр раздела Лиды.
2. Фильтрация настроена специально, чтобы пользователь не видел данных реестра.

Спасибо!!!

Показать все комментарии
WorkspaceConsole
Технические вопросы
7.x

Здравствуйте.
Версия 7.7.0.2293

При установке пакета изменений возникла ошибка при Обновление измененных схем конфигурации (Генерации исходного кода схемы) трех пользовательских деталей:
Элемент коллекции с идентификатором "{AE0E45CA-C495-4FE7-A39D-3AB7278E1617}" не найден
--- Exception info ---
Error: Элемент коллекции с идентификатором "{AE0E45CA-C495-4FE7-A39D-3AB7278E1617}" не найден
Source: Terrasoft.Core
StackTrace: at Terrasoft.Core.MetaItemCollection`1.GetByUId(Guid uid)
at Terrasoft.Core.Entities.EntitySchemaGenerator.WriteEntityColumns(GeneratorContext context, EntitySchema entitySchema)
at Terrasoft.Core.Entities.EntitySchemaGenerator.WriteEntityCode(GeneratorContext context, SchemaCodeGeneratorResource`1 resource)
at Terrasoft.Core.Entities.EntitySchemaGenerator.WriteSchemaClassBody(GeneratorContext context, SchemaCodeGeneratorResource`1 resource, GeneratorTokenVisibility sourceVisibility)
at Terrasoft.Core.CodeGeneration.SchemaCodeGenerator`1.GenerateSchemaSource(SchemaCodeGeneratorResource`1 resource, EntityCollection sourceCollection, String sourceFileName)
at Terrasoft.Core.CodeGeneration.SchemaCodeGenerator`1.GenerateSources(SchemaCodeGeneratorResource`1 resource)
at Terrasoft.Core.Entities.EntitySchemaGenerator.GenerateSources(SchemaCodeGeneratorResource`1 resource)
at Terrasoft.Core.SchemaManager`1.GetSchemaSources(TSchemaManagerSchema schema, Guid schemaId, UserConnection userConnection)
at Terrasoft.Core.SchemaManager`1.GenerateSchemaSources(TSchemaManagerSchema schema, Guid schemaId, UserConnection userConnection)
at Terrasoft.Core.SchemaManager`1.GenerateSchemaSources(Guid sysSchemaId, ISchemaManagerItem schemaManagerItem, UserConnection userConnection)
at Terrasoft.Core.Packages.PackageInstallUtilities.InternalInstallSchemasAssociatedData(Guid schemaId, Guid schemaUId, String managerName, Guid packageUId, Boolean continueIfError)

Три детали унасследованны от базового объекта.
Указанный идентификатор "{AE0E45CA-C495-4FE7-A39D-3AB7278E1617}" нашел в Базовом объекте это Uid колонки Id, этот Uid присутствует в исходном коде и метаданных Базового объекта, и в методанных трех объектов деталей.

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

Нравится

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

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

Для анализа вопроса направьте на support@terrasoft.ru

1. Пакеты которые необходимо установить
2. Логи работы Workspace Console
3. Копию БД

Показать все комментарии
кнопка
реестр
Технические вопросы
7.x

Добрый день.

У меня есть раздел "Материалов" в котором есть числовое поле "Количество пустых", его заполнение происходит через БП.
Иногда требуется обнуление поля "Количество пустых" для всех записей.
Я хочу добавить кнопку которая будет выполнять очистку данных, с подтверждением своего намерения очистить, дабы избежать случайного нажатия.
Подскажите, пожалуйста, как лучше реализовать эту задачу.

Нравится

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

Попыталась создать кнопку по статье http://www.community.terrasoft.ru/forum/topic/13848 , но у меня не получилось.
Делаю первый раз и потому не знаю как решить это, буду рада если подскажите как исправить и где можно еще почитать информацию.

define("UsrConsumablesSection1", ["GridUtilitiesV2"],
function() {
	return {
		entitySchemaName: "UsrConsumables",
		contextHelpId: "1001",
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"parentName": "UsrConsumable",
				"propertyName": "items",
				"name": "ResetSectionButton",
				"values": {
						itemType: Terrasoft.ViewItemType.BUTTON,
						caption: {bindTo: "Resources.Strings.ClearQuantityEmptyButtonCaption"},
						click: {bindTo: "onClearQuantityEmptyClick"},
						enabled: {bindTo: "isUsrConsumablesUsrQuantityEmpty"},
						"layout": {
							"column": 1,
							"row": 6,
							"colSpan": 1
						}
					}
				}
			]/**SCHEMA_DIFF*/,
			messages: {},
			methods: {
				onClearQuantityEmptyClick: function() {
					var activeRow = this.get("ActiveRow");
					if (activeRow) {
						var primaryID = this.get("GridData").get(activeRow).get("UsrConsumables").value;
					}
				},
				isUsrConsumablesUsrQuantityEmpty: function() {
					var activeRow = this.get("ActiveRow");
					if (activeRow) {
						var pc = this.get("GridDate").get(activeRow).get("UsrQuantityEmpty");
						return (pc || pc !== "") ? true : false;
					}
					return false,
					Page.UsrQuantityEmpty.Clear();
				}
			}
		};
});

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

Самый простой способ - через БП.
Реализация:
1) Начальный элемент - простой
2) Вопрос пользователю:
"Вы уверены, что хотите очистить значение поля для всех записей"
Ответ:
- Не очень. Отменить.
- Just do it!

Если выбран ответ "Не очень...", то идем на конец процесса.
Иначе:

3) Изменить данные в объекте UsrConsumable (указать надо его название) с фильтром Id заполнено (то есть всем записям).
Необходимо задать полю UsrQuantityEmpty значение default(int)

4) Конец процесса.

В свойствах процесса в блоке "Доступен в разделах" выберите нужный раздел.

ЗЫ. Page.UsrQuantityEmpty.Clear() не обращается к БД, поэтому очистка не происходит.

Добрый день.
Создала БП, в странице схемы прописала код, но возникла такая проблема, если я делаю замещающую сраницу с этим кодом (код ниже), страница раздела у меня не прорисовывается. Что мне нужно сделать, что бы исправить это?
Пример запуска БП брала из http://www.community.terrasoft.ru/forum/topic/10554#comment-47944 .

define("UsrConsumablesSection1", ["GridUtilitiesV2"],
function() {
	return {
		entitySchemaName: "UsrConsumables",
		contextHelpId: "1001",
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"parentName": "UsrConsumable",
				"propertyName": "items",
				"name": "ResetSectionButton",
				"values": {
						itemType: Terrasoft.ViewItemType.BUTTON,
						caption: {bindTo: "Resources.Strings.ClearQuantityEmptyButtonCaption"},
						click: {bindTo: "onClearQuantityEmptyClick"},
						enabled: {bindTo: "isUsrConsumablesUsrQuantityEmpty"},
						"layout": {
							"column": 1,
							"row": 6,
							"colSpan": 1
						}
					}
				}
			]/**SCHEMA_DIFF*/,
			messages: {},
			methods: {
				onClearQuantityEmptyClick: function() {
					var url = "https://" + document.domain + "/0/ServiceModel/ProcessEngineService.svc/UsrProcessEmpty";
					var request = null;
					request = new XMLHttpRequest();
					request.open("GET", url, true);
					request.send(null);
				}
			}
		};
});

Здравствуйте, Алеся!

Обратитесь к службе поддержки. Листинг кода корректный.

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