Вопрос

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

 

Имеется ли в системе какой-то инструмент, который позволит узнать имя объектов. 

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

В интерфейсе не нашёл информацию по данному меню. 

В реестре прав доступа не могу понять как называется объект. 

У меня такой же вопрос

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

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

Это меню реализовано в модуле LeftPanelTopMenuModule.

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

Алла Савельева, я правильно понимаю, что под модулем Вы понимаете "пакет" ? 

Sunrise challenge,

Не, пакет - это пакет, а модуль - это модуль. Модуль - это ClientUnitSchemaManager, скриншот ниже:

Алла Савельева, волей-неволей вспоминается - "стою на асфальте, в лыжи обутый...". Не нахожу его 

Sunrise challenge,

Проверьте, не включена ли фильтрация в нижней панели окна сервисов (на скриншоте выделила красным):

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

Вы оказались правы. Как-то не очевидно, что он установлен. 

Метод я нашёл, но сохранить изменения он не даёт: 

"Невозможно сохранить изменения элемента "LeftPanelTopMenuModule", так как он создан сторонним издателем или установлен из файлового архива"

Sunrise challenge,

Вам нужно заместить модуль LeftPanelTopMenuModule.

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

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

Спасибо за подсказки. В дополнение - есть ли более простой способ скрыть данное всплывающее меню или убрать из списка "Дизайнер системы"  ? 

Sunrise challenge,

Я не нашла никакой системной настройки, с помощью которой можно было бы управлять этой функциональностью.

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

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

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

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

Зверев Александр пишет:
Вообще, если бы такое настраивалось, то не в системных настройках, а в правах доступа на операции.

Это была описка - речь шла о правах доступа на операции.

Зверев Александр пишет:
Да, было бы логично иметь там право на просмотр дизайнера системы. Если и дорабатывать, то в таком ключе. Добавить новое право и при отображении пунктов меню и главной страницы проверять его наличие у текущего пользователя и если нет, то этот пункт не отображать.

Саша, а ты можешь это внести в список пожеланий от клиента? Я на 100% согласна, что такая настройка должна быть в базовой версии. 

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

В детали я добавляю свои пункты меню в функции addToolsButtonMenuItems, делаю пункты

this.getButtonMenuItem({
   Caption: item.Name,
   Click: {"bindTo": "OnTypeMenuClick"},
   tag: item.Id
})

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

У меня такой же вопрос

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

"этот метод не передается" - that's where you're wrong, kiddo.

Передаётся tag. Мало того в tag теоретически можно кинуть объект. типа такого

this.getButtonMenuItem({
   Caption: item.Name,
   Click: {"bindTo": "OnTypeMenuClick"},
   tag: {id: item.Id, typeId:item.UsrType.value}
})

 

Варфоломеев Данила,опытным путем удалось выяснить, что Tag надо писать с большой буквы.

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

Добавляю в кнопку "Действие" свой пункт, все по фэн-шую, то есть SDK.
Вот фрагмент:

actionMenuItems.addItem(this.getActionsMenuItem({
        Type : "Terrasoft.MenuSeparator",
        Caption : ""
}));
// Добавление пункта меню [Проверить заказ] в список действий страницы редактирования.
actionMenuItems.addItem(this.getActionsMenuItem({
// Привязка заголовка пункта меню к локализуемой строке схемы.
        "Caption" : {
        bindTo : "Resources.Strings.UsrCheckOrder"
},

Неожиданная проблема в том, что при первом запуске виден текст локализованной строки "Проверить заказ", а после отрабатывания процесса, или закрытии-открытии окна с заказами, текст пропадает, но пункт в меню все равно есть, и по нажатию на него отрабатывает процесс.
А текста не видно.. что нужно проверить? :(

У меня такой же вопрос

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

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

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

Пожалуйста..

define("OrderPageV2", ["OrderPageV2Resources", "GeneralDetails", "ProcessModuleUtilities", "NotificationsModule"],
	function(resources, GeneralDetails, ProcessModuleUtilities, NotificationsModule) {
	return {
		entitySchemaName : "Order",
		details: /**SCHEMA_DETAILS*/{},/**SCHEMA_DETAILS*/
		diff: /**SCHEMA_DIFF*/[],/**SCHEMA_DIFF*/
		attributes: {},
		methods: {
			getActions : function() {
				// Вызывается родительская реализация метода для получения
				// коллекции проинициализированных действий базовой страницы.
				var actionMenuItems = this.callParent(arguments);
				// Добавление линии сепаратора для визуального отделения пользовательского действия от списка
				// действий базовой страницы.
				actionMenuItems.addItem(this.getActionsMenuItem({
						Type : "Terrasoft.MenuSeparator",
						Caption : ""
					}));
				// Добавление пункта меню [Проверить заказ] в список действий страницы редактирования.
				actionMenuItems.addItem(this.getActionsMenuItem({
						// Привязка заголовка пункта меню к локализуемой строке схемы.
						"Caption" : {
							bindTo : "Resources.Strings.UsrCheckOrder"
						},
						// Привязка метода обработчика действия.
						"Tag" : "CheckOrderPay"
						// Привязка свойства видимости пункта меню к значению, которое возвращает метод isAccountPrimaryContactSet.
						//"Visible": { bindTo: "isAccountPrimaryContactSet" }
					}));
				actionMenuItems.addItem(this.getActionsMenuItem({
						Type : "Terrasoft.MenuSeparator",
						Caption : ""
					}));
				return actionMenuItems;
 
			},
			// Метод-обработчик выбора действия.
			CheckOrderPay : function() {
				// Получение идентификатора заказа.
				var OrderId = this.get("Id");
				// Объект, который будет передан в качестве аргумента в метод executeProcess.
				var args = {
					// Имя процесса, который необходимо запустить.
					sysProcessName : "UsrCheckOrder",
					// Объект со значением входящего параметра для процесса.
					parameters : {
						idOrder : OrderId
					}
				};
				// Запуск пользовательского бизнес-процесса.
				ProcessModuleUtilities.executeProcess(args);
				//Terrasoft.configuration.NotificationsModule.onShowNewNotificationClick();
				//this.Location.Reload(false);
			}
		},
		rules : {},
		userCode : {}
	};
});

В Resources.Strings.UsrCheckOrder Заголовок и значение одинаковы, Проверить заказ
Строчка с Visible закоментирована в точности как указано, но функции, указанной там, в теле схемы нет..

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

Мы проанализировали Ваш код. Данное поведение возникает у Вас, по причине того, что используя статью http://academy.terrasoft.ru/documents/docs/technic/SDK/7.7.0/AddActionT… Вы не выполнили пункты начиная с 6-го. После добавления локализированной строки в OrderSectionV2 данная проблема возникать не будет.

Спасибо за анализ, но я не повторяю типовое задание, а делаю свое, и у меня нет необходимости контролировать видимость пункта в зависимости от статуса заказа.
При любом статусе кнопка видна, по задумке.
Сейчас ситуация такова:
1. Ctrl+F5
2. Создаю заказ. Текст пункта виден.
3. Сохраняю заказ.
4. Открываю на редактирование только что созданный заказ - текст не виден.
5. Ctrl+F5 и открываю заказ опять - текст виден.
6. Закрываю заказ кнопкой "Закрыть".
7. Открываю заказ, текст пункта не виден.

Я понимаю, что, возможно, я где-то что-то не так сделал. Мне интересно что делать дальше?
Сейчас вот подумалось, что надо сделать новую локализуемую строку и попробовать ее назначить вместо прежней. Сделаю, отпишусь.

Увы, ситуация не изменилась, текст пропадает.
data-item-marker и текст, с ним совпадающий, показывается только в первый раз после полной перезагрузки.
Попробую пересоздать замещающую схему.

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

Копирую Ваш код предварительно изменив его для ContactPageV2 и добавляю локализированную строку.

Результат:
При создании контакта элемент виден.

При открытии контакта элемент отсутствует.

Добавляем замещающую схему раздела с такой же локализированной строкой.

В результате элемент не пропадает.

Сергей, Спасибо! Урок усвоен :redface:

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

Добрый день!

Необходимо добавить свой пункт в меню "Действия" карточки задачи и написать обработчик события нажатия. Как это можно сделать?

P.S.: информацию по добавлению действия в раздел кое какую нашел, а вот в карточку - нет.

У меня такой же вопрос

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

Александр, здравствуйте.

В приложении инструкция по созданию действия для стандартного раздела.

Елена, ну я же специально уточнил и скриншот приложил: мне нужно добавить действие НЕ В РАЗДЕЛ, А В КАРТОЧКУ.

Александр,

Принцип добавления действия в карточку раздела аналогичен принципу добавления действия в раздел. Разница только в схемах, в которые добавляется код обработчика. Для добавления действия в раздел обработчик добавляется в схему [Название_объекта_раздела]Section. Если необходимо добавить действие в карточку раздела - изменяется схема [Название_объекта_раздела]Page.
В вашем случае необходимо создать замещающий модуль для страницы ActivityPage и добавить в него код обработчика.

В приложении инструкция по добавлению действия, в которой добавлено описание кейса по добавлению действия в карточку раздела.

Елена,

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

P.S.: данные с самой карточки получаются легко согласно статье, а вот для деталей аналогичного не нашел.

Александр,

через объект получить доступ к деталям не получится. Можно использовать select и получить данные из базы данных. Например так:

var selectFilevar = 
        new Select(UserConnection)
        .Column("Name")
        .From("ActivityFilel")
        .Where("ActivityId").IsEqual(activity.Id)

Андрей,

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

this.methods.showAvtivityInfo = function() {
   var activityTitle = this.get("Id");
   var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
    rootSchemaName: 'ActivityFile'
   });
   esq.addColumn('Id');
   esq.addColumn('Name');
   esq.addColumn('ActivityId');
   /*var filters = esq.filters;
   var filterNameActivityId = 'ActivityId';
   var filterActivityId = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
    'ActivityId', activityTitle);
   filters.add(filterNameActivityId, filterActivityId);*/
   esq.getEntityCollection(function(result) {
    var collection = result.collection;
    if (collection && collection.collection.length > 0) {
     var item = collection.collection.items[0].values;
     this.showInformationDialog(activityTitle);
    }
   }, this);
  };

Exception выходит на строке

esq.addColumn('ActivityId');

Текст exception: [17:51:16.813] uncaught exception: -;5<5=B :>;;5:F88 A 8<5=5< ActivityId =5 =0945=

P.S.: Поля 'ID' и 'Name' отрабатывают корректно.

Александр, у Вас опечатка:

this.methods.showAvtivityInfo = function() {

Должно быть showActivityInfo.

Попробуйте использовать Select(UserConnection), как я описывал выше.

Андрей,

опечатка не существенна, потому что я вызывал функцию ниже именно по этому имени. Сейчас поменял - не помогло.
Вы описали Select(UserConnection), это применимо для C# кода, в JS коде получаем ожидаемую ошибку.
1. При сохранении (во вложении)
2. В консоли браузера:
[14:42:41.377] ReferenceError: Select is not defined @ http://stnd-bpm-02:88/0//configuration/30e6e6890bd6a8c10768d330b68949d4…

Александр,

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

Андрей,

файл во вложении.

Методом тыка и медитированя нашел решение:

esq.addColumn('Activity.Id');

Теперь вопрос в том, как вызвать свой серверный метод?
Видимо нужно использовать DLL либо .NET Managed Assemblies отсюда, но примеров нет:(

Александр, если я правильно понял, то нужно просто дописать

click: {
         bindTo: 'showActivityInfo'
        }

Андрей,
Уверен, Вы меня не правильно поняли. Я получил idшники файлов, круто. Теперь мне нужно вызвать метод, написанный на C#. На сколько я понимаю, мне для этого нужно:
1. Создать проект со сбокой dll в VisualStudio
2. Подключить сборку к dll. Как?
3. Вызвать из js-кода метод из сборки. Как?

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

То есть варианты DLL сборки и .Net Managed сборки не подходят?
Можно тогда инструкцию/пример по написанию сервиса и вызову его из js-кода в Террасофт?

Александр, веб-сервис пишется на любом языке программирования и регистрируется в IIS.
Потом через API сервиса вызывать его методы. Пример запроса к Google с помощью jQuery:

1) Подключить jQuery в зависимые модули нашей страницы редактирования (в примере ProductPage) модуль jQuery.
2) В коде страницы добавить define('ProductPage', ['ext-base', 'terrasoft', 'sandbox', 'jQuery' …..
function(Ext, Terrasoft, sandbox, jQuery ……
3) В обработчик нажатия кнопки добавить следующий код:
var geocodingAPI = "http://maps.googleapis.com/maps/api/geocode/json?address=Россия+Москва&sensor=true";
window.jQuery.getJSON(geocodingAPI, function (json) {
console.log('json : ', JSON.stringify(json));
});

Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Недавно столкнулась с задачей добавить в меню [Помощь] возможность просматривать информацию о версии программы (бинарных файлов). Реализуется это следующим образом:
1. Открыть сервис scr_Main. Перейти на закладку невизуальных компонентов. Выделить компонент amiHelp. Добавить для него новый ActionMenuItem. Заполнить свойства, аналогично скриншоту:
/system/files/3_17.png
2. Создать для добавленного компонента обработчик события OnExecute:
/system/files/4_11.png
В теле функции обработки события прописать код:

var FileVersion = Connector.Version;
MessageBox('Версия программы ' + FileVersion);

/system/files/5_10.png
3. Результат будет иметь вид:
/system/files/6_8.png

Поделиться

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

Как добавить в меню Файл новый пункт?

У меня такой же вопрос

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

В сервисе wnd_Main в меню amFile (невизуальный компонент) в пункт amiFile добавить новый подпункт и прописать обработчик.

а да разобралась, не успела закрыть тему, спс :)

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