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

Нравится

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

Добрый день!

Да, для добавления достаточно добавить в разделе "Доступ к операциям".

Алгоритм ее использования уже надо прописывать в коде.

Пример тут

Добрый день!

Да, для добавления достаточно добавить в разделе "Доступ к операциям".

Алгоритм ее использования уже надо прописывать в коде.

Пример тут

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

Всем привет!

Подскажите, пожалуйста, как предоставить или исключить для пользователя возможность экспорта аналитики в виде PDF/PNG файла? Иными словами, добавить кнопку "Скриншот" - http://joxi.ru/D2PexNvCqW7WjA

Нравится

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

Bakhanovich Aliaksei,

Кнопка добавляется в модуле DashboardBuilder. На видимость/доступность кнопки никаких дополнительных условий в виде справочника или сис. операции не накладывается

{
	caption: {bindTo: "Resources.Strings.ScreenshotButtonCaption"},
	click: {bindTo: "onScreenshotButtonClick"},
	markerValue: "SettingsButtonScreenshot",
	visible: !(Ext.isIE || Ext.isSafari),
	enabled: {bindTo: "getScreenshotButtonEnabled"}
}
 
getScreenshotButtonEnabled: function() {
	return !this.Ext.isEmpty(this.get("ActiveTabName"));
}

Поэтому предлагаю попытаться расширить данный модуль и предусмотреть свою логику на данную кнопку

Добрый день!

Видимость/активность кнопки для разных пользователей/ролей пользователей можно настроить с использованием системных операций.

Пример тут

Александр, спасибо!

Если не ошибаюсь, ранее было на уровне справочника или мастера раздела это вынесено.

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

Bakhanovich Aliaksei,

Кнопка добавляется в модуле DashboardBuilder. На видимость/доступность кнопки никаких дополнительных условий в виде справочника или сис. операции не накладывается

{
	caption: {bindTo: "Resources.Strings.ScreenshotButtonCaption"},
	click: {bindTo: "onScreenshotButtonClick"},
	markerValue: "SettingsButtonScreenshot",
	visible: !(Ext.isIE || Ext.isSafari),
	enabled: {bindTo: "getScreenshotButtonEnabled"}
}
 
getScreenshotButtonEnabled: function() {
	return !this.Ext.isEmpty(this.get("ActiveTabName"));
}

Поэтому предлагаю попытаться расширить данный модуль и предусмотреть свою логику на данную кнопку

Достаточно переопределить getScreenshotButtonEnabled, как то так

getScreenshotButtonEnabled: function() {

            return false;

        },

 

Так автору темы же нужно не всем запретить, а конкретному пользователю. Как раз и подойдёт вписать туда проверку наличия. Но делать невидимой — красивее.

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

Гм понять что имел автор под словом пользователь кого конкретного или всех сложно. Другой вопрос что все это не запретит делать скриншрты средствами ос и отправлять их куда угодно (Например в ставить в Word и сохранить в pdf) С точки зрения безопастности это ничего не даст.

Или вообще сфотографировать экран телефоном.wink

Аналогично, в версии Terrasoft 3.Х была настройка запрета кнопки выгрузки реестра в Excel, но при желании всегда можно было зайти под своим пользователем в Management Studio, подключиться к базе и делать какие угодно выборки с данными, к которым предоставлен доступ.

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

Кто знает как это решить?

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

Нравится

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

А что вы хотите решать? Там все ясно написано файл уже приатачен, перезаписать? Не хотите перезатерать создайте новый шаблон!

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

Так и не должно вас предупредили вы выбрали продолжить работу внесите правки в шаблон и загрузите его в bpm

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

Под каким пользователем пробуете? Под Supervisor пускает?Если да то добавьте вашего пользователя к системным администраторам!

 

Запускаю под системным администратором

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

Eduardas,

Причин такого поведения может быть несколько:

1) используемая версия MS Word не поддерживает работу с плагином bpm'online;

2) установленный плагин не поддерживает разрядность используемой ОС Windows;

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

Подробнее посмотрите в статье по установке плагина bpm'online для MS Word.

Алла Савельева пишет:

Eduardas,

Причин такого поведения может быть несколько:

1) используемая версия MS Word не поддерживает работу с плагином bpm'online;

2) установленный плагин не поддерживает разрядность используемой ОС Windows;

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

Подробнее посмотрите в статье по установке плагина bpm'online для MS Word.

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

 

Зверев Александр пишет:

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

Сам шаблон работает и загружается в bpm, но для изменений в Word'е уже не открывает 

 

Офис может обновляться без предупреждений попробуйте удалить плагин потом скачать (обратите внимание что для 32разрядной и 64 разрядной версии офиса свои инсталяторы. нужно определить разрядность офиса, скачать плагин и переустановить плагин и все необходимые для его работы пакеты (перечисленные в инструкции по установке).

Григорий Чех пишет:

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

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

Eduardas пишет:

Сам шаблон работает и загружается в bpm, но для изменений в Word'е уже не открывает 

Не открывается какой-то конкретный шаблон или такая ситуация по всем шаблонам? 

Алла Савельева пишет:

Eduardas пишет:

Сам шаблон работает и загружается в bpm, но для изменений в Word'е уже не открывает 

Не открывается какой-то конкретный шаблон или такая ситуация по всем шаблонам? 

Со всеми шаблонами, пробовал удалить плагин и установить заново не помогло.

Eduardas пишет:

Сам шаблон работает и загружается в bpm, но для изменений в Word'е уже не открывает 

Открыть можно не из плагина, а напрямую. Скачиваете файл и открываете в Word. 

Eduardas,

Тогда проблема может быть в софте на конкретном компьютере.

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

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

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

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

Все просто, этот продукт "https://marketplace.terrasoft.ru/app/ms-word-printables-setup-wizard" блокировал базовый функционал принт формы

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

Можно ли выгрузить из BPM'online все организационные и функциональные роли и связи между ними? Может быть, если кто-то такое уже делал, подскажите как?

Нравится

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

Все в таблице SysAdminUnit

Пример раскручивания тут

Все в таблице SysAdminUnit

Пример раскручивания тут

Больше о типах ролей, зашифрованных цифрами, есть тут.

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

Друзья, я начинающий разработчик. Прошу помощи в написании кода для детали.

ТЗ: необходимо присваивать категорию клиенту в зависимости от его оборота.

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



Есть ли возможность сделать изменение категории в детали моментально? Как в любом разделе делается. 

Допускаю, что есть непонимание в коде. 

define("UsrUsrPribilPoKvortalam1Page", [], function() {
	return {
		entitySchemaName: "UsrPribilPoKvortalam",
		attributes: {
			"UsrOborotPoLK": {
				dataValueType: Terrasoft.DataValueType.FLOAT,
				dependencies: [
				{
						columns: ["UsrOborot1"],
						methodName: "calcUsrOborotPoLK"
					}
				]
			},
		},
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.calcUsrOborotPoLK();
					},
					calcUsrOborotPoLK: function() {
					var slovo = this.get("UsrKategoriyaKlienta");
							if (this.get("UsrOborotPoLK") <= 30) {
								slovo = "до 30";
							}else if (this.get("UsrOborotPoLK") <= 50 && this.get("UsrOborotPoLK") > 30){
								slovo = "до 50";
							}else if (this.get("UsrOborotPoLK") <= 70 && this.get("UsrOborotPoLK") > 50){
								slovo = "до 70";
							}else if (this.get("UsrOborotPoLK") <= 100 && this.get("UsrOborotPoLK") > 70){
								slovo = "*";
							}else if (this.get("UsrOborotPoLK") <= 200 && this.get("UsrOborotPoLK") > 100){
								slovo = "**";	
							}else if (this.get("UsrOborotPoLK") <= 500 && this.get("UsrOborotPoLK") > 200){
								slovo = "***";
							}else if (this.get("UsrOborotPoLK") <= 1000 && this.get("UsrOborotPoLK") > 500){
								slovo = "****";
							}else if (this.get("UsrOborotPoLK") > 1000){
								slovo = "*****";
							}
					this.set("UsrKategoriyaKlienta", slovo);
					},
				},



 

Нравится

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

SavelyevOll,

Передавать нужно ссылку на функцию которая будет вызываться по изменению поля (в нашем случае this.calcUsrOborotPoLK),
те так: this.on("change:UsrOborotPoLK", this.calcUsrOborotPoLK, this); 

Те ф-ция init будет такой
init: function() {
this.callParent(arguments);
this.on("change:UsrOborotPoLK", this.calcUsrOborotPoLK, this);
},

Пример использования смотрите тут

Метод onEntityInitialized срабатывает только при загрузке детали, если я правильно понял, то вам нужно что бы по изменению оборота вычислялась категория. Тогда попробуйте использовать следующий код:

init: function() {
	this.callParent(arguments);
	this.on("change:UsrOborotPoLK", this.calcUsrOborotPoLK(), this);
}

 

Григорий Чех,

Спасибо! Я исправил код, но теперь даже после сохранения не происходит вычислений. Допускаю, что ошибка в вызове функции. Все ли здесь верно?

 
init: function() {
this.callParent(arguments);
this.on("change:UsrOborotPoLK", this.calcUsrOborotPoLK(), this);
	},
	calcUsrOborotPoLK: function(){
	var slovo = this.get("UsrKategoriyaKlienta");
	if (this.get("UsrOborotPoLK") &lt;= 30) {
		slovo = "до 30";
	}else if (this.get("UsrOborotPoLK") &lt;= 50 &amp;&amp; this.get("UsrOborotPoLK") &gt; 30){
		slovo = "до 50";
	}else if (this.get("UsrOborotPoLK") &lt;= 70 &amp;&amp; this.get("UsrOborotPoLK") &gt; 50){
		slovo = "до 70";
	}else if (this.get("UsrOborotPoLK") &lt;= 100 &amp;&amp; this.get("UsrOborotPoLK") &gt; 70){
		slovo = "*";
	}else if (this.get("UsrOborotPoLK") &lt;= 200 &amp;&amp; this.get("UsrOborotPoLK") &gt; 100){
		slovo = "**";	
	}else if (this.get("UsrOborotPoLK") &lt;= 500 &amp;&amp; this.get("UsrOborotPoLK") &gt; 200){
		slovo = "***";
	}else if (this.get("UsrOborotPoLK") &lt;= 1000 &amp;&amp; this.get("UsrOborotPoLK") &gt; 500){
		slovo = "****";
	}else if (this.get("UsrOborotPoLK") &gt; 1000){
		slovo = "*****";
	}
	this.set("UsrKategoriyaKlienta", slovo);
		},
		},

 

SavelyevOll,

Передавать нужно ссылку на функцию которая будет вызываться по изменению поля (в нашем случае this.calcUsrOborotPoLK),
те так: this.on("change:UsrOborotPoLK", this.calcUsrOborotPoLK, this); 

Те ф-ция init будет такой
init: function() {
this.callParent(arguments);
this.on("change:UsrOborotPoLK", this.calcUsrOborotPoLK, this);
},

Пример использования смотрите тут

Григорий Чех,

Спасибо большое! Все работает)

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

Всем добрый день! Столкнулся с проблемой, в замещенной схеме CtiPanel не работает UpdateQuery.

define("CtiPanel", [],
	function() {
		return {
			entitySchemaName: "Call",
			messages: {
				"WaSendCallDataToContact":{
					mode: Terrasoft.MessageMode.PTP,
					direction: Terrasoft.MessageDirectionType.PUBLISH
				},
				"WaSetDataToCall": {
					mode: Terrasoft.MessageMode.PTP,
					direction: Terrasoft.MessageDirectionType.SUBSCRIBE
				}
			},
			mixins: {},
			attributes: {
				WaRelationEntities: { dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT }
			},
			methods: {
				init: function() {
					this.callParent(arguments);
					this.processMessage();
				},
				onCallSavedEvent: function(call) {
					this.callParent(arguments);
					var relations = this.get("WaRelationEntities");
					if(relations && relations.length > 0) {
						var callId = call.databaseUId;
						this.getUpdateQueryCall(callId, relations);
						this.set("WaRelationEntities", null);
					}
					this.sandbox.publish("WaSendCallDataToContact", call, ["_WaSendCallDataToContact"]);
				},
 
				processMessage: function(){
					this.sandbox.subscribe("WaSetDataToCall", this.onMessageSubscribe.bind(this), this);
				},
 
				onMessageSubscribe: function(args) {
					this.set("WaRelationEntities", args);
					window.console.log("onMessageSubscribe(args): ", args);
				},
 
				getUpdateQueryCall: function (id, relations){
					debugger;
					var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
						rootSchemaName: this.entitySchemaName
					});
					var filters = updateQuery.filters;
					filters.addItem(this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "Id", id));
					for(var i = 0; i < relations.length; i++) {
						updateQuery.setParameterValue(relations[i].entitySchemaName, relations[i].value, relations[i].type);
					}
					updateQuery.exequte(this.updateQueryCallBack, this);
				},
				updateQueryCallBack: function(result) {
					if(!result.success) {
						window.console.error(result);
						return;
					}
				}
			},
			diff: []
		};
	}
);

ошибки следующие - http://prntscr.com/nh5uws

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

Нравится

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

Алексей,

у Вас же в консоли все написано: 

updateQuery.exequte is not a function

Нужно написать updateQuery.exeсute

 

Алексей,

у Вас же в консоли все написано: 

updateQuery.exequte is not a function

Нужно написать updateQuery.exeсute

 

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

)) Благодарю, переработал наверное, нужен отдых

странно все равно не сработало даже после изменения, http://prntscr.com/nh7lpa

http://prntscr.com/nh7opx

 

Подключены ли следующие модули "ext-base", "terrasoft", "sandbox" как Ext, Terrasoft, sandbox ?

//те в самом верху должно быть

define("CtiPanel", ["ext-base", "terrasoft", "sandbox"], function(Ext, Terrasoft, sandbox)

 

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

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

Имеется следующая проблема.

Для печатной формы MS WORD создано представление. Это представление вытягивает html поле справочника. Каким образом можно адекватно вставить html содержимое в ворд шаблон? Пока вытягивается содержимое поля со всеми тегами html, необходимо добиться корректного отображения всевозможных элементов html, таких как таблицы, маркированные списки и стили  текста.

Нравится

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

Сталкивался с подобной проблемой. В ПФ Word html контент никак не добавить. Получалось в Dev Express, и то со скрипом, были проблемы с картинками, закодированными в base64 (а в html полях именно такие), что решалось жуткими костылями. Проблему усугубляет ещё то, что в ядре bpm лежит крайне устаревшая версия OpenXml SDK (2.0.5, сейчас последняя вроде 2.9.0). А доступные бесплатные конвертеры html в word используют более свежие версии. 

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

Сталкивался с подобной проблемой. В ПФ Word html контент никак не добавить. Получалось в Dev Express, и то со скрипом, были проблемы с картинками, закодированными в base64 (а в html полях именно такие), что решалось жуткими костылями. Проблему усугубляет ещё то, что в ядре bpm лежит крайне устаревшая версия OpenXml SDK (2.0.5, сейчас последняя вроде 2.9.0). А доступные бесплатные конвертеры html в word используют более свежие версии. 

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

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

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

Нравится

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

Для обмена информацией между страницей редактированья и деталью нужно использовать модуль sanbox

Пример

Для обмена информацией между страницей редактированья и деталью нужно использовать модуль sanbox

Пример

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

Добрый день!

Создал свой WS с методом GET. Он не требует авторизации в BPM. По прямой ссылке он прекрасно выдает результат в браузере.

При попытке использования его в БП появляется сообщение: 

Ошибка HTTP 401.1 — Unauthorized

Я верно понимаю, что причина кроется именно в настройке самой BPM  для работы с WS, а не в настройке конкретного БП?

Нравится

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

В броузере вы подключились к своему сеансу, из БП нужно выполнить авторизацию

В броузере вы подключились к своему сеансу, из БП нужно выполнить авторизацию

Григорий Чех,

Верно ли понимаю, что можно в БП первым действием блок для работы с WS вставить, 

описать WS AuthService.svc/Login в справочнике WS и на первом шаге к нему обращаться так:

https://bpm/ServiceModel/AuthService.svc/Login

Тем самым решая проблему выполнения последующих блоков в рамках данного БП.

Или нужно c# кодом описывать логику дополнительно?

При работе с веб-сервисами кроме авторизации ещё нужно получать CSRF-токен. Если в итоге с авторизацией через AuthService не получится, можно переделать на basic-аутентификацию, как поступил автор темы тут. Правда, её не рекомендуют из-за недостатков.

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

Доброго времени суток.

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

BPM'online 7.13.2.934

Нравится

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

Какой тип колонки установлен в bpm от которого вы не можете построить обратную связь?

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

Колонка, естественно, справочная, иначе я б просто свое представление в списке не видел.

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

По обратной связи выбирается много записей с разными значениями в справочных и текстовых полях (речь не о том справочном, по которому связь, о других). Какое учитывать – непонятно. Соответственно, есть смысл только в обобщённых значениях по числам и датам.

Ну с чего их должно быть много? На простом примере - для каждого документа - одна строка

--Создание представления
IF OBJECT_ID ('InpVwDocSubcontracting', 'V') IS NOT NULL
 DROP VIEW InpVwDocSubcontracting;
GO
 
CREATE VIEW [dbo].[InpVwDocSubcontracting]
SELECT
	doc.Id InpId,
	doc.Id InpDocumentId,
	mainDoc.Number AS InpMainDocumentNumber
FROM Document doc
LEFT JOIN Document mainDoc ON doc.InpMainDocumentId = mainDoc.Id
 
--И запрос для проверки
SELECT d.Id, d.Number, vwd.InpMainDocumentNumber FROM Document d
INNER JOIN InpVwDocSubcontracting vwd ON d.Id = vwd.InpDocumentId

Это частный случай для конкретного кода view. В общем случае по обратным связям может быть много записей.

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

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

Я так и хотел сделать, но как использовать представление вместо объекта раздела?

Можно зарегистрировать как отдельный раздел, чтобы можно было выбрать этот объект из списка при создании отчёта. Но тогда нужно будет как-то нестандартно делать его открытие из обычного раздела.

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