define("ZbsTourOffers1Page", ["ZbsTourOffers1PageResources", "ProcessModuleUtilities"], 
       function(Resources, ProcessModuleUtilities) {

...

            getActions: function() {
                   var actionMenuItems = this.callParent(arguments);
                
                // Добавление линии-разделителя.
                actionMenuItems.addItem(this.getButtonMenuItem({
                    Type: "Terrasoft.MenuSeparator",
                    Caption: ""
                }));
                
                // Добавление пункта меню в список действий раздела.
                actionMenuItems.addItem(this.getButtonMenuItem({
                    // Привязка заголовка пункта меню к локализуемой строке
                    // схемы.
                      Click: {bindTo: "createTreatSessions"},
                    // Привязка метода-обработчика действия.
                    Caption: {bindTo: "Resources.Strings.CreateTreatSessionsCaption"}                                        
                }));
                
                 // Возврат дополненной коллекции действий раздела.
                return actionMenuItems;
            },                        
 

Нравится

Поделиться

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

Добавьте ещё и в схему раздела

Владимир Соколов, спасибо!

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

Была изменена entitySchema у всего раздела Emails на "Activity". Записи появились из объекта активити - с этим все ок.

Но раздел при переходе в меню разделов выделяется Активности при клике на Emails. И заголовок страницы также пишет - Активности.

Вижу 2а варианта решения:

1) Вернуть старый entitySchema, и подпиливать "Activity" только в функции запроса данных. Тогда вопрос - как называется эта функция?

2) Принудительно прописать старый entitySchema в функции выделения раздела и функции запроса названия раздела. Тогда вопрос в том - как называется функция выделения раздела?

 

 

Нравится

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

Какую задачу Вы преследуете? И еще - раздел "Email", это маркетинговые рассылки Вы модифицировали или это какой-то кастомный раздел?

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

Доброго дня,

Creatio має вбудований функціонал, який розрізняє основні проекти і під-проекти (робота) і відкриває для них різні сторінки редагування з різними схемами, як сказано тут:

Питання, чи можна зробити так, щоб і для робота і проект використовували однакову схему.

Нравится

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

Делал такое через обновление данных в напрямую в БД. Таблица SysModuleEdit

Делал такое через обновление данных в напрямую в БД. Таблица SysModuleEdit

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

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

Появилась ошибка валидации лицензий при добавлении записи на кастомный раздел.
Был создан кастомный раздел и установлен на прод систему. Сначала раздел не появлялся в системе, поэтому пришлось привязать данный через БД. Потом, когда раздел появился, была найдена ещё одна ошибка связанная с лицензиями. На дев системе никаких проблем не было. Генерировать исходный код и обновлять БД пробовал, переустановку пакета тоже, также пробовал настраивать доступ по объектам, по операциям и пользователей - ничего не помогло.
Может кто-нибудь сталкивался с похожим или знает в чём проблема.

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

Прикрепленные файлы

Нравится

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

Тут лучше в поддержку обратиться. Возможно название объекта раздела как-то совпало с названием объекта из платного дополнения. У террасофта есть список "платных" разделов, которые они проверяют по названию объекта и если нет лицензии, то появляется такое предупреждение. Если dev среда без лицензий (с ограничением в 1000 записей), то там проверка лицензий не запускается.

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

Проверьте название Объекта раздела, который требует лицензию.
Возможно у него нет префикса и система считает его лицензируемым объектом базового приложения или какого-то решения.
Проверьте лицензируемый ли сам объект в SysLicPackage. Возможно, он содержится в Operations лицензионного продукта в списке LicEntities. 
Если это так, проверьте есть ли на объект права в лицензии, в Operations. Например, Case.Full, Lead.Read.

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

Добрый день!
Как сделать фильтр в разделе заказы, который будет фильтровать по контрагенту. Фильтр как поле с не всплывающим окном. Типа как если нажали на обычный фильтр и выбрали поле контрагент для фильтрации и в этом поле вводим текст оно в выпадающем списке предлагает варианты
При открытии карточки, чтобы не исчезал фильтр в поле, после закрытия карточки.

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

Нравится

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

Мы подобным образом делали поиск лидов в LeadSectionV2 по многим полям

 

		attributes: {
			"UseSearchFilter": {
				dataValueType: Terrasoft.DataValueType.BOOLEAN,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				value: false
			},
			"SearchFilter": {
				dataValueType: Terrasoft.DataValueType.TEXT,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
			}
		},
			initQueryFilters: function(esq) {
				this.callParent(arguments);
				var useSearchFilter = this.get("UseSearchFilter");
				var searchFilter = this.get("SearchFilter");
				if (!useSearchFilter || !searchFilter) {
					esq.filters.removeByKey("FilterContactCommunication");
				}
				else {
					var filterGroup = new Terrasoft.createFilterGroup();
					filterGroup.logicalOperation = Terrasoft.LogicalOperatorType.OR;
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].Contact", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].Account", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].BusinesPhone", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].MobilePhone", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].Email", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].Website", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].QualifiedAccount.Name", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].QualifiedContact.Name", searchFilter));
						filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[ContactCommunication:Contact:QualifiedContact].SearchNumber", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[ContactCommunication:Contact:QualifiedContact].Number", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[AccountCommunication:Account:QualifiedAccount].SearchNumber", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[AccountCommunication:Account:QualifiedAccount].Number", searchFilter));
					esq.filters.add("FilterCommunication", filterGroup);
				}
			},
			searchFilter: function() {
				this.reloadGridData();
			},
			enableSearchFilter: function() {
				this.set("UseSearchFilter", true);
			},
			disableSearchFilter: function() {
				this.set("UseSearchFilter", false);
				this.reloadGridData();
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "FilterSearchContainer",
				"parentName": "FiltersContainer",
				"propertyName": "items",
				"index": 0,
				"values": {
					"id": "FilterSearchContainer",
					"selectors": { wrapEl: "#FilterSearchContainer" },
					"itemType": Terrasoft.ViewItemType.CONTAINER,
					"wrapClass": ["quick-filter-module-container-wrapClass", "custom-filter-container"],
					"items": []
				}
			},
			{
				"operation": "insert",
				"parentName": "FilterSearchContainer",
				"propertyName": "items",
				"name": "EnableSearchFilter",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
					"click": {"bindTo": "enableSearchFilter"},
					"caption": "Search"
				}
			},
			{
				"operation": "insert",
				"parentName": "FilterSearchContainer",
				"propertyName": "items",
				"name": "SearchFilter",
				"values": {
					"bindTo": "SearchFilter",
					"visible": {"bindTo": "UseSearchFilter"},
					"labelConfig": {
						"visible": false
					},
					"controlConfig": {
						"className": "Terrasoft.TextEdit"
					},
					"textSize": "Small"
				}
			},
			{
				"operation": "insert",
				"parentName": "FilterSearchContainer",
				"propertyName": "items",
				"name": "UseSearchFilter",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"style": Terrasoft.controls.ButtonEnums.style.BLUE,
					"click": {"bindTo": "searchFilter"},
					"visible": {"bindTo": "UseSearchFilter"},
					"markerValue": "applyButton",
					"imageConfig": {"bindTo": "Resources.Images.ApplyButtonImageNew"}
				}
			},
			{
				"operation": "insert",
				"parentName": "FilterSearchContainer",
				"propertyName": "items",
				"name": "DisableSearchFilter",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"click": {"bindTo": "disableSearchFilter"},
					"visible": {"bindTo": "UseSearchFilter"},
					"markerValue": "cancelButton",
					"imageConfig": {"bindTo": "Resources.Images.CancelButtonImageNew"}
				}
			}
   }

 

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

Спасибо, попробуем

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

При открытии карточки фильтр очищается :(( а нам нужно, чтобы  хранился, пока не отменим

 

Тогда надо сохранять значение фильтра в профиле. Что-то похожее здесь обсуждалось - 

https://community.terrasoft.ru/questions/polzovatelskiy-fiksirovannyy-f…

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

После редактирования страницы и нажатия на пользовательскую кнопку, я передаю её guid (точнее, ид создаваемого в ней объекта) в бизнес-процесс. Но так как  перед вызовом не было нажато "сохранить", объекта с этим guid нет. Я могу эмулировать действие нажатия кнопки "сохранить" из кода? Не хочется вручную создавать объект по данным из страницы, так как пользователь может потом нажать "сохранить". И да, можно ли как-то убрать эту кнопку насовсем, или перехватить вызываемый ей метод, чтобы в коде при определённых обстоятельствах просто не вызывать this.CallParent?

Нравится

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

Думаю, можете вызвать тихое сохранение при нажатии на пользовательскую кнопку: 

this.save({isSilent: true});

 

Думаю, можете вызвать тихое сохранение при нажатии на пользовательскую кнопку: 

this.save({isSilent: true});

 

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

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

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

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

Нравится

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

на страницу, в секцию атрибутов добавить, если надо вкл/выкл по условию

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

Вызов функции на кнопке

  onButtonClick: function(){ 
                this.SomeFunc();

Сама кнопка в DIFF            

    {
                "operation": "insert",
                "name": "Button",
                "values": {
                    "itemType": 5,
                    "caption": {
                        "bindTo": "Resources.Strings.ButtonCaption"
                    },
                    "click": {
                        "bindTo": "onButtonClick"
                    },
                    "style": "blue",
                    "enabled": {
                        "bindTo": "ButtonEnabled"
                    },
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 0,
                        "layoutName": "Tab72b43268TabLabelGridLayoutfb645753"
                    }
                },
                "parentName": "Tab72b43268TabLabelGridLayoutfb645753",
                "propertyName": "items",
                "index": 0
            },

В LocalizableString
ButtonCaption    - Текст на кнопке

Если расположение кнопки не имеет значения, то можно использовать меню в "Действиях" 

 

			getActions: function() {
				var actionMenuItems = this.callParent(arguments);
				actionMenuItems.addItem(this.getButtonMenuItem({
					"Caption": {"bindTo": "Resources.Strings.MyButtonCaption"},
					"Click": {"bindTo": "onMyButtonClick"}
				}));
				return actionMenuItems;
			},

 

на страницу, в секцию атрибутов добавить, если надо вкл/выкл по условию

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

Вызов функции на кнопке

  onButtonClick: function(){ 
                this.SomeFunc();

Сама кнопка в DIFF            

    {
                "operation": "insert",
                "name": "Button",
                "values": {
                    "itemType": 5,
                    "caption": {
                        "bindTo": "Resources.Strings.ButtonCaption"
                    },
                    "click": {
                        "bindTo": "onButtonClick"
                    },
                    "style": "blue",
                    "enabled": {
                        "bindTo": "ButtonEnabled"
                    },
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 0,
                        "layoutName": "Tab72b43268TabLabelGridLayoutfb645753"
                    }
                },
                "parentName": "Tab72b43268TabLabelGridLayoutfb645753",
                "propertyName": "items",
                "index": 0
            },

В LocalizableString
ButtonCaption    - Текст на кнопке

Oleg,

Кнопка добавилась, и даже отображается в инспекторе, но при этом она  абсолютно невидима. В enabled установлено true.
В вашем коде изменил только родительский контейнер и, соответственно, layoutName. У других элементов на странице тот же родитель

Гусейн Гулиев,

В LocalizableStrings добавили? 

Oleg,

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

{
	"operation": "insert",
	"name": "Button",
	"values": {
		"itemType": 5,
		"caption": {// Правильно: "caption" :"Check out",
			"bindTo": "Check out" // неправильное использование bindTo
		},
		"click": {
			"bindTo": "onButtonClick"
		},
		"style": "blue",
		"enabled": true,
		"layout": {
			"colSpan": 8,
			"rowSpan": 1,
			"column": 16,
			"row": 6,
			"layoutName": "Tab84fbfd75TabLabelGridLayout489fb6f3"
		}
	},
	"parentName": "Tab84fbfd75TabLabelGridLayout489fb6f3",
	"propertyName": "items",
	"index": 6
},

 

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

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

 

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

 

Пробую прописать вот так (прилагаю), но фильтр не срабатывает. Скорее всего я не правильно пытаюсь узнать, к какому департаменту относится текущий пользователь, посредством EntitySchemaQuery. Информация о департаменте содержится в объекте Contact.

 

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

Как это более правильно сделать, подскажите, пожалуйста?

 

 

Прикрепленные файлы

Нравится

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

Там идет асинхронный запуск, потому Ваш "return" не попадает в него. Вам необходимо сделать Join в колонке по которой делаете фильтр. Если напишите какие колонки в объекте этого раздела, то могу помочь верно сделать фильтр

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

Добрый день!

 

Столкнулся с такой задачей: создаю новое поле и добавляю в мастер раздела.

Систему обновлял, компилил, генерировал исходный код (Сделал все что можно было)

Но поле не появляется. Хотя в редакторе оно отображается.

В консоле говорит что не может найти данные колонки.

В чем может быть проблема?

Нравится

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

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

 

Что стоит проверить:

- добавлены ли в объекте данные колонки;

-  значение в системной настройке "Текущий пакет". Затем проверьте, что у вас все зависимости пакета правильно проставлены

- переопубликовать объект в котором есть данные колонки

- пересохраните, пожалуйста, схему %PageV2.

- проверить работу в режиме инкогнито браузера.

 

 

Вильшанский Дмитрий,

Ничего из этого не помогло. Что еще может быть?

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

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

Изменялся ли объект напрямую в конфигурации? Если да, то была ли выполнена публикация?

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

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

Нравится

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

Решение нашел такое, во разделе в Section (например OpportunitySectionV2):

 

methods: {
	getActiveViewName: function() {
		//let activeViewName = this.get("GridDataViewName"); // это прописанная вью по умолчанию, это наш грид (таблица)
		let activeViewName = this.get("AnalyticsDataViewName"); // Заменяем на вью с аналитикой
		const dataViews = this.get("DataViews");
		if (dataViews) {
			dataViews.each(function(dataView) {
				if (dataView.active) {
					activeViewName = dataView.name;
				}
			}, this);
		}
		return activeViewName;
	},
	getDefaultDataViews: function() {
		var dataView = this.callParent(); // получаем стандартный список вьюшек
		delete dataView.GridDataView; // Удаляем из списка GridDataView - грид (таблицу) что бы оно исчесло из раздела
		return dataView; // возвращаем список уже без вью которую убоали из списка
	}
}

 

В BaseDataView есть функция initDataViews, в BaseSectionV2 есть функция getDefaultDataViews.

Полозюков Евгений Петрович, GridDataView прописана как вью по умолчанию, потому исключение из getDefaultDataViews  вызовет ошибку

Решение нашел такое, во разделе в Section (например OpportunitySectionV2):

 

methods: {
	getActiveViewName: function() {
		//let activeViewName = this.get("GridDataViewName"); // это прописанная вью по умолчанию, это наш грид (таблица)
		let activeViewName = this.get("AnalyticsDataViewName"); // Заменяем на вью с аналитикой
		const dataViews = this.get("DataViews");
		if (dataViews) {
			dataViews.each(function(dataView) {
				if (dataView.active) {
					activeViewName = dataView.name;
				}
			}, this);
		}
		return activeViewName;
	},
	getDefaultDataViews: function() {
		var dataView = this.callParent(); // получаем стандартный список вьюшек
		delete dataView.GridDataView; // Удаляем из списка GridDataView - грид (таблицу) что бы оно исчесло из раздела
		return dataView; // возвращаем список уже без вью которую убоали из списка
	}
}

 

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