Доброго дня,

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.

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

 

 

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

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

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

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

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

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

Добрый день!

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

Подскажите как сделать.

Нравится

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

В нужном Вам Section (если для всех разделов тогда BaseSectionV2) добавьте код:

 

getSectionActions: function() {
	var actionMenuItems = this.callParent(arguments);
	actionMenuItems.addItem(this.getButtonMenuItem({
		Type: "Terrasoft.MenuSeparator", // Добавление разделителя
		Caption: ""
	}));
	actionMenuItems.addItem(this.getButtonMenuItem({
		"Click": {"bindTo": "Функция что выполняется при нажатии на кнопку"},
		"Caption": {"bindTo": "Видимое название кнопки. Рекомендовано локализированная строка"},
		"Enabled": {"bindTo": "Активность кнопки: значение true или false"},
		"Visible": {"bindTo": "Видимость кнопки: значение true или false"},
		"ImageConfig": this.get("Иконка кнопки. Не обязательно"),
		"IsEnabledForSelectedAll": true // Видна ли кнопка при выборе нескольких записей
	}));
	actionMenuItems.addItem(this.getButtonMenuItem({
		Type: "Terrasoft.MenuSeparator", // Добавление разделителя
		Caption: ""
	}));
	return actionMenuItems;
}

 

В нужном Вам Section (если для всех разделов тогда BaseSectionV2) добавьте код:

 

getSectionActions: function() {
	var actionMenuItems = this.callParent(arguments);
	actionMenuItems.addItem(this.getButtonMenuItem({
		Type: "Terrasoft.MenuSeparator", // Добавление разделителя
		Caption: ""
	}));
	actionMenuItems.addItem(this.getButtonMenuItem({
		"Click": {"bindTo": "Функция что выполняется при нажатии на кнопку"},
		"Caption": {"bindTo": "Видимое название кнопки. Рекомендовано локализированная строка"},
		"Enabled": {"bindTo": "Активность кнопки: значение true или false"},
		"Visible": {"bindTo": "Видимость кнопки: значение true или false"},
		"ImageConfig": this.get("Иконка кнопки. Не обязательно"),
		"IsEnabledForSelectedAll": true // Видна ли кнопка при выборе нескольких записей
	}));
	actionMenuItems.addItem(this.getButtonMenuItem({
		Type: "Terrasoft.MenuSeparator", // Добавление разделителя
		Caption: ""
	}));
	return actionMenuItems;
}

 

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

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

Нравится

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; // возвращаем список уже без вью которую убоали из списка
	}
}

 

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

В разделе есть несколько типов страницы редактирования. Как установить условия на видимость кнопки добавления для одного из типов? В каком модуле определены данные кнопки? Заранее спасибо!

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

Нравится

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

В diff схемы реестра раздела добавляем 

{
            "operation": "merge",
            "name": "SeparateModeAddRecordButton",
            "parentName": "SeparateModeActionButtonsLeftContainer",
            "propertyName": "items",
            "values": {
                "itemType": Terrasoft.ViewItemType.BUTTON,
                "style": Terrasoft.controls.ButtonEnums.style.GREEN,
                "caption": {"bindTo": "AddRecordButtonCaption"},
                "click": false,
                "visible": {"bindTo": "IsAddRecordButtonVisible"},
                "classes": {
                    "textClass": ["actions-button-margin-right"],
                    "wrapperClass": ["actions-button-margin-right"]
                },
                "controlConfig": {
                    "menu": {
                        "items": {
                            "bindTo": "EditPages",
                            "bindConfig": {
                                "converter": function(editPages) {

                                    if (editPages.getCount() === 0) {
                                        return null;
                                    }
                                    var operationHash = {
                                        "38d26ca1-ab6a-474c-950d-f9ac9b630967": "CanAbilityToAdd1", //здесь guid это id справочника по которому определяется страница редактирования
                                        "2495b17d-2465-41cb-b625-ac36d9aef931": "CanAbilityToAdd2"
                                    };
                                    
                                    var allowedPages = [];
                                    
                                    if (this.get("CanAbilityToAdd1")) {
                                        allowedPages.push("CanAbilityToAdd1");
                                    }
                                    
                                    if (this.get("CanAbilityToAdd2")) {
                                        allowedPages.push("CanAbilityToAdd2");
                                    }

                                    for (var key in operationHash) {
                                        var hashItem = departmentToOperationHash[key];
                                        if (allowedPages.indexOf(hashItem) === -1) {
                                            editPages.collection.remove(editPages.collection.getByKey(key));
                                        }
                                    }
                                    return editPages;
                                }
                            }
                        }
                    }
                }
            }
        }
}

 

В init добавляем к примеру проверку на доступ по операции, либо другую функциональность

initCanAbilityToAdd1: function() {
                RightUtilities.checkCanExecuteOperation({
                    operation: "CanAbilityToAdd1"
                }, function(result) {
                    this.set("CanAbilityToAdd1", result);
                }, this);
            },

Добрый вечер.

Кнопки для добавления разных типов записей генерируются автоматически в зависимости от информации в таблице SysModuleEdit и поля TypeColumnValue в этой таблице.

Названия пунктов меню для разных страниц редактирования берутся из поля ActionKindCaption.

Более подробную информацию посмотрите в этом посте.

Пользовательскими настройками (без внесения дополнительных изменений в программный код) настроить видимость пункта меню в кнопке [Добавить] этого сделать не получится.

Базовая логика добавления пунктов меню для кнопки [Добавить] раздела реализована в схеме 'BaseDataView' пакета NUI.

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

Надежда, ещё есть радикальный пользовательский способ: включить администрирование по записям для объекта справочника типов этого раздела и убрать у ненужного типа права на чтение для всех (кроме администраторов). Так нельзя будет выбрать этот тип при создании записи в разделе. Но нужно убедиться, корректно ли в этом случае будут видимы существующие записи с этим типом в разделе.

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

Не уверенна, что разграничение прав доступа, как-то повлияет на видимость пункта меню кнопки [Добавить] для этого типа.

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

В diff схемы реестра раздела добавляем 

{
            "operation": "merge",
            "name": "SeparateModeAddRecordButton",
            "parentName": "SeparateModeActionButtonsLeftContainer",
            "propertyName": "items",
            "values": {
                "itemType": Terrasoft.ViewItemType.BUTTON,
                "style": Terrasoft.controls.ButtonEnums.style.GREEN,
                "caption": {"bindTo": "AddRecordButtonCaption"},
                "click": false,
                "visible": {"bindTo": "IsAddRecordButtonVisible"},
                "classes": {
                    "textClass": ["actions-button-margin-right"],
                    "wrapperClass": ["actions-button-margin-right"]
                },
                "controlConfig": {
                    "menu": {
                        "items": {
                            "bindTo": "EditPages",
                            "bindConfig": {
                                "converter": function(editPages) {

                                    if (editPages.getCount() === 0) {
                                        return null;
                                    }
                                    var operationHash = {
                                        "38d26ca1-ab6a-474c-950d-f9ac9b630967": "CanAbilityToAdd1", //здесь guid это id справочника по которому определяется страница редактирования
                                        "2495b17d-2465-41cb-b625-ac36d9aef931": "CanAbilityToAdd2"
                                    };
                                    
                                    var allowedPages = [];
                                    
                                    if (this.get("CanAbilityToAdd1")) {
                                        allowedPages.push("CanAbilityToAdd1");
                                    }
                                    
                                    if (this.get("CanAbilityToAdd2")) {
                                        allowedPages.push("CanAbilityToAdd2");
                                    }

                                    for (var key in operationHash) {
                                        var hashItem = departmentToOperationHash[key];
                                        if (allowedPages.indexOf(hashItem) === -1) {
                                            editPages.collection.remove(editPages.collection.getByKey(key));
                                        }
                                    }
                                    return editPages;
                                }
                            }
                        }
                    }
                }
            }
        }
}

 

В init добавляем к примеру проверку на доступ по операции, либо другую функциональность

initCanAbilityToAdd1: function() {
                RightUtilities.checkCanExecuteOperation({
                    operation: "CanAbilityToAdd1"
                }, function(result) {
                    this.set("CanAbilityToAdd1", result);
                }, this);
            },

Да, Алла права, похоже, права на запись в справочнике типов не влияют, ведь выпадающий список формируется по объекту «Страница редактирования». А он общий для всех разделов. В таком случае лучше воспользоваться доработкой по предложению Евгения.

 

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

Полозюков Евгений Петрович,

 пытаюсь сделать что-то подобное, все проверила 10 раз, но отладчик выдает:

Uncaught (in promise) TypeError: RightUtilities.checkCanExecuteOperation is not a function

А Вы добавили в начале в квадратных скобках и параметрах ссылку на RightUtilities? Посмотреть, как это сделано, можно в других схемах, где её используют:

define("SysOperationAuditSectionV2", ["BaseFiltersGenerateModule", "SysOperationAudit", "SysOperationAuditArch",
	"RightUtilities"],
function(BaseFiltersGenerateModule, SysOperationAudit, SysOperationAuditArch, RightUtilities) {
	return {

 

Зверев Александр, да, была проблема с последовательностью схем и параметров, передаваемых в схему)

Алла Савельева,

 

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

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

define("ActivitySectionV2", ["ConfigurationConstants","RightUtilities","ProcessModuleUtilities","BaseDataView"],
function(ConfigurationConstants,RightUtilities,ProcessModuleUtilities) {
	return {
		entitySchemaName: "Activity",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		attributes: 
		{ 
			"UsrCanManageItTask": {
				dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
				type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				value: false
			}
		},
		diff: /**SCHEMA_DIFF*/[
 
			]/**SCHEMA_DIFF*/,
		methods: {
			init: function()
			{
					this.getUserSettingsOperationRight();
					window.console.log("Инициализация");
					this.callParent(arguments);
					window.console.log("Права");
 
			},
 
			initEditPages: function() {
				window.console.log("Определение кнопок начало");
 
				var enabledEditPages = new this.Terrasoft.Collection();
 
					this.callParent(arguments);
					var editPages = this.get("EditPages");
 
					window.console.log("Получение страниц");
					var flag = this.get("UsrCanManageItTask");
					this.Terrasoft.each(editPages.getItems(), function(item) {
						window.console.log("Проверка типа");
						window.console.log(item.get("Id"));
						//window.console.log(ConfigurationConstants.Activity.Type.Email);ConfigurationConstants.Activity.Type.Call
						if (item.get("Id") !== "e2831dec-cfc0-df11-b00f-001d60e938c6" &&
							item.get("Id") !== "e1831dec-cfc0-df11-b00f-001d60e938c6") {
 
							if (item.get("Id") !== "f5921924-3e81-4a5f-ae4c-5a6f1b6e7661")
							{
								enabledEditPages.add(item);
								//window.console.log("ок");
							}
							else { 
								if (flag)
								{
										enabledEditPages.add(item);
										//window.console.log("ок");
								}
							}
						}
					});
					window.console.log("Проверка типа конец");
					this.set("EnabledEditPages", enabledEditPages);
 
					window.console.log("Определение кнопок конец");
			},
 
			getFilters: function() {
						window.console.log("Добавление фильтра");
						var filters = this.callParent(arguments);
						if (!this.get("UsrCanManageItTask"))
						{
							filters.add("NotItTask", this.Terrasoft.createColumnFilterWithParameter(
							this.Terrasoft.ComparisonType.NOT_EQUAL, "Type", "f5921924-3e81-4a5f-ae4c-5a6f1b6e7661"
							));
							window.console.log("Добавление фильтра");
						}
						return filters;
			},
 
			getUserSettingsOperationRight: function() {
				//debugger;
				var operationsToRequest = ["UsrCanManageItTask"];
				//operationsToRequest.push("UsrCanManageItTask");
				window.console.log("Права");
 
				RightUtilities.checkCanExecuteOperations(operationsToRequest, function(result) {
					if (result) {
						this.set("UsrCanManageItTask", result.UsrCanManageItTask);
						window.console.log("Права на ит-задачи: "+result.UsrCanManageItTask);
					}
				}, this);
			}
		}
 
	};
});

 

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