Можно ли сделать что бы в разделе при просмотре списка записей можно было просматривать только записи в группах?

Допустим руководитель входит в раздел, у него есть группа по его филиалу, и он видит только свой филиал так как может просматривать только эту группу.

Знаю что можно через настройки "Прав доступа", но там есть нюанс по которой эта настройка не дает возможности сделать нужное, а вот с группами выходит как нужно, но вот вопрос по видимости

Нравится

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

Александр Тыра,

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

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

Уточните, какой нюанс мешает настроить доступ через права доступа?

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

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

Кроме жирного курсива можно ещё КАПСОМ писать, чтобы заметнее было.wink

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

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

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

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

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

вот и я не вижу, жалко

Александр Тыра,

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

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

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

в правах доступа вижу сколько настройки доступа только по колонке "кто создал" и "кому дано право". Если имеете введу " доступ по объектам в конфигураторе.

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

Конфигуратор тут не нужен, права на конкретную запись настраиваются по действию в карточке.

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

но это руками нужно править

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

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

​​​​​​это заказчик). Хотят что бы сразу все

Если хотят, чтобы видели сразу все, пусть добавят доступ группе «Все пользователи». Если хотят ограничивать, нужно выдавать другие права доступа на записи. Их можно выдавать либо вручную из интерфейса, либо различными способами программно.

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

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

Нравится

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

Недавно вопрос рассматривался здесь. Стандартными нельзя, по ссылке есть примеры доработок.

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

Коллеги, доброго дня!
Возможно, кто-то сталкивался с необходимостью скрывать/отображать кнопки в реестре по условию? Пример из документации 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*/
        };
    }
);

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

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

Не работают свойства Enabled и Visible для действий в комбинированном режиме. Версия 7.6

Пример реализации, который работал в 7.5, но не работает в 7.6

          onEntityInitialized: function() {
                this.set("isOutsideSupply", true);
                this.callParent(arguments);
            },
            getActions: function() {
                var actionMenuItems = this.callParent(arguments);
                actionMenuItems.addItem(this.getActionsMenuItem({
                    "Caption": "Спецификация Teleton",
                    "Tag": "specificationTeleton",
                    "Visible": {"bindTo": "isOutsideSupply"}
                }));
                return actionMenuItems;
            },

            initCardActionHandler: function() {
                this.callParent(arguments);
                var propertyNames = [
                    "isOutsideSupply, isInsideSupply", "SxAmountCaption"
                ];
                this.Terrasoft.each(propertyNames, function(propertyName) {
                    this.on("change:" + propertyName, function(model, value) {
                        this.sandbox.publish("CardChanged", {
                            key: propertyName,
                            value: value
                        }, [this.sandbox.id]);
                    }, this);
                }, this);
            },

Также пробовал биндить на метод. Результат тот же.

Нравится

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

На сколько я могу судить, код вполне работоспособен на версии 7.6, в зависимости от того, конечно, какую задачу вы им хотите решить.
Функции initCardActionHandler и onEntityInitialized это функции BasePageV2, следовательно переопределяете их вы в схеме страницы.

Что вы делаете:
1. Объявляете свойство, (без разницы, где вы его на странице и в каком методе будете менять, я для теста буду его менять по нажатию кнопки).
2. Добавляете Action "Спецификация Teleton" на страницу и биндите его видимость на свойство.
3. Публикуете сообщение для схемы секции, которое будет срабатывать по изменению вашего свойства.

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

methods: {
	    testClick: function() {
	        this.set("isOutsideSupply", true);
	    },
 
	    onEntityInitialized: function() {
                this.set("isOutsideSupply", false);
                this.callParent(arguments);
            },
            getActions: function() {
                var actionMenuItems = this.callParent(arguments);
                actionMenuItems.addItem(this.getActionsMenuItem({
                    "Caption": "Спецификация Teleton",
                    "Tag": "specificationTeleton",
                    "Visible": {"bindTo": "isOutsideSupply"}
                }));
                return actionMenuItems;
            },
 
            initCardActionHandler: function() {
                this.callParent(arguments);
                var propertyNames = [
                    "isOutsideSupply"
                ];
                this.Terrasoft.each(propertyNames, function(propertyName) {
                    this.on("change:" + propertyName, function(model, value) {
                        this.sandbox.publish("CardChanged", {
                            key: propertyName,
                            value: value
                        }, [this.sandbox.id]);
                    }, this);
                }, this);
            },
},

Добавил кнопку которая будем менять значение:

{
		"operation": "insert",
		"name": "Test",
		"parentName": "Header",
		"propertyName": "items",
		"values": {
			"itemType": Terrasoft.ViewItemType.BUTTON,
			"caption": "Test",
			"click": {"bindTo": "testClick"},
			"layout": {"column": 0, "row": 4, "colSpan": 12}
		}
},

При загрузке страницы вижу что экшена в списке нет, т.к. по умолчанию я прописал ему "this.set("isOutsideSupply", false);"
После же нажатия кнопки он появляется. Бинд на видимость работает.

Так же, в то же время в результате публикации сообщения CardChanged, срабатывает прослушка сообщения в BaseSectionV2:

Абсолютно все, что написано в вашем коде, делает то, что и должно делать.

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