Всем добрый день. Версия 7.12.

Вопрос - можно ли добавить фильтр на данные в справочнике?

Есть справочник 1, содержащий ещё две справочные колонки (2 и 3). Создавать отдельный раздел или деталь под справочник - ну можно, но они не нужны на практике. Тем не менее, можно ли сделать так, чтобы именно в разделе "Справочники" при заполнении данных справочника 1 можно было фильтровать значения одной справочной колонки (3) по другой (2)?

Нравится

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

Добрый день.

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

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

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

Добрый день.

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

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

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

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

Есть простой способ создать роль с правами "только чтение" на абсолютно все объекты? Или для этого нужно по одиночке всем 1000! объектам назначать для этой роли права "только чтение"?

Нравится

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

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

На практике таких таблиц не очень много. Например, в моей конфигурации сейчас 1148 таблиц, но только 29 из них администрируются по операциям.

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

Можно просто дать пользователю read only лицензию, тогда он сможет зайти, но ничего не сможет изменить.

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

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

У клиента в системе иногда наблюдается такое поведение: например открыт раздел Заказы , пользователь ничего не делает, абсолютно ничего. На экране появляется надпись Загрузка и пока не обновить страницу не исчезнет. 

.

В консоле такое:

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

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

На мой комментарий, что Ошибка выпадает в схеме EntityProductCountMixin и она не замещена, Террасофт выслал эти скрины и ответил:

"это понятно что ошибка в EntityProductCountMixin, но причина не в том что метод работает не правильно (там все ок), а в том что вы цепочка вызовов не должна доходить до данного метода, если проще - вы не правильно используете функционал базовой логики. Пожалуйста, проанализируйте свой код."

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

Помоги разобраться, что не так делаем, наша ли тут ошибка?

Нравится

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

В EntityProductCountMixin есть функция:

getEntityProductSchemaName: function() {
	var schemaName = this.getDependentEntitySchemaName();
	return schemaName + "Product";
},

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

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

all-combined.js:1 POST https://192.168.247.12:444/ServiceModel/AuthService.svc/Login 404 (Not Found)

Обновлялся с 11 на 12 версию. На 11 версии сайт работал корректно

Нравится

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

Пройдитесь ещё раз по инструкции по разворачиванию приложения bpm'online on-site, скорее всего что-то недонастроили.

Также посмотрите файлы логов, часто там можно найти информацию о непосредственной причине проблемы. Их можно найти на сервере в папке Temp/BPMOnline.

Пройдитесь ещё раз по инструкции по разворачиванию приложения bpm'online on-site, скорее всего что-то недонастроили.

Также посмотрите файлы логов, часто там можно найти информацию о непосредственной причине проблемы. Их можно найти на сервере в папке Temp/BPMOnline.

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

Версия 7.12.0.2702

HTTP Error 503. The service is unavailable. Pool останавливается.

Только пытаешься открыть начальную страницу.

WSRV 2016

Где копать? 

Или в сообществе может есть FAQ ?

 

Нравится

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

Попробуйте в IIS в дополнительных параметрах пула приложений в параметре "Удостоверение" указать пользователя с правами администратора: "Особая учетная запись" -> Установить.

Даже если уже указана учетная запись администратора, введите логин и пароль повторно, должно помочь

Попробуйте в IIS в дополнительных параметрах пула приложений в параметре "Удостоверение" указать пользователя с правами администратора: "Особая учетная запись" -> Установить.

Даже если уже указана учетная запись администратора, введите логин и пароль повторно, должно помочь

Спасибо. Подтолкнули к решению. Там как раз была учетка с админскими правами. Поставил ApplicationPoolIdentity - ошибка ушла. Но пришлось повторно генерировать исх. коды и компилировать, а это процесс не быстрый. Генерация шла около 4-х часов, а окончания компиляции я не дождался.

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

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

Нравится

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

Добрый день!

Да, заходите в системную настройку, указываете пункт "Разрешить по операции". Системную операцию используете существующую, либо создаете новую.

Добрый день!

Да, заходите в системную настройку, указываете пункт "Разрешить по операции". Системную операцию используете существующую, либо создаете новую.

Сидоров Александр В.,

в 7.12 такого нет, наверно это в более новой версии

Ещё один повод обновиться сразу до актуальной.

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

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

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

Вот потому и думаю, и так обновления проходят не без проблем, а так ещё добавятся

В таком случае стоит обновляться. В версии 7.13 права уже есть.

У нас сейчас 7.12.4, будет стимул проставить на прод. Спасибо

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

Здравствуйте, коллеги!

Сделал велосипед - перебор результирующей коллекции > элемента БП "Чтение данных" и решил поделиться для "будущих поколений".

Тестовый БП:

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

читаем счета

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

 

в Методах БП объявляем переменную, в которой будем хранить коллекцию, в данном случае invoices и методы доступа к колонкам объекта GetCompositeObjectColumnValue и перехода на следующую запись коллекции CompositeObjectListMoveNext

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

инициализируем переменную коллекции

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

Перебираем коллекцию и читаем поля текущей записи коллекции

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

Готово!

Нравится

Поделиться

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

Какие тэги поставить, что бы в топе выдачи поиска по теме было?

Борис Леонов,

а как обойти это ограничение?

Миннекаев Айдар,

я не знаю, пробовал 5000 - позволяет

Для статей при создании поста можно выбрать тип «Публикация» вместо «Вопрос».

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

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

Точно! Поменял на публикацию. А теги какие добавить? Идея то востребованная, куча вопросов на эту тему...

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

Как на Хабре, тег #никто_не_читает_теги.cheeky

Можно читать первые N штук, а потом каждую обрабатывать, чтобы не попадали под условия выборки, затем читать очередные N штук. А если записи не меняются, то непонятно, зачем так много читать, а не фильтровать ещё на уровне запроса в базу.

 

Борис, Спасибо!

Очень помогли.

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

 

 Это же каким извращенцем нужно быть, чтоб кусок кода давать в виде скриншота) что ж вы за люди))))))

Stradivarius,

я посчитал, что он читается лучше, потому что вставленное как <код> тут выглядит ужасно

 Methods

private IEnumerator&lt;ICompositeObject&gt; entities;
 
private T GetCompositeObjectColumnValue&lt;T&gt;(IEnumerator&lt;ICompositeObject&gt; objectList, string columnName) {
		ICompositeObject currentObject = objectList.Current;
		if(currentObject != null) {
			currentObject.TryGetValue&lt;T&gt;(columnName, out T value);
			return value;
		} else {
			return default(T);
		}
 
}
 
private bool CompositeObjectListMoveNext(IEnumerator&lt;ICompositeObject&gt; objectList) {
	return objectList.MoveNext();
}

Init

entities = Get&lt;ICompositeObjectList&lt;ICompositeObject&gt;&gt;("ReadDataUserTask1.ResultCompositeObjectList").GetEnumerator();
return true;

Processing

Set("MoveNext", CompositeObjectListMoveNext(entities));
string name = GetCompositeObjectColumnValue&lt;string&gt;(entities, "Name");
// Работает с Name
return true;

 

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

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

Нравится

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

Если бы тут привели текст выводимого на экран или в логи при запуске БП сообщения, гадать о причинах было бы намного легче: фаза Луны, погода на Марсе...wink

А так можно только посоветовать воспользоваться инструментами Visual Studio и Management Studio: отладить функцию RecalculateAll в схеме BaseCompletenessService, которую запускает этот БП и запустить с теми же параметрами хранимку tsp_CompletenessRenew в базе, которую функция запускает.

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

если запускать "Обновить полноту профиля"

 

Oracle.DataAccess.Client.OracleException ORA-00936: missing expression
ORA-06512: at "BPM.tspkg_Completeness", line 113
ORA-06512: at line 2    at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
   at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()
   at Polly.Policy.&lt;&gt;c__DisplayClass119_0`1.&lt;Execute&gt;b__0(Context ctx, CancellationToken ct)
   at Polly.Policy.&lt;&gt;c__DisplayClass129_0`1.&lt;ExecuteInternal&gt;b__0(Context ctx, CancellationToken ct)
   at Polly.Policy.&lt;&gt;c__DisplayClass103_0.&lt;NoOp&gt;b__1(Context ctx, CancellationToken ct)
   at Polly.NoOp.NoOpEngine.Implementation[TResult](Func`3 action, Context context, CancellationToken cancellationToken)
   at Polly.Policy.&lt;&gt;c.&lt;NoOp&gt;b__103_0(Action`2 action, Context context, CancellationToken cancellationToken)
   at Polly.Policy.ExecuteInternal[TResult](Func`3 action, Context context, CancellationToken cancellationToken)
   at Polly.Policy.Execute[TResult](Func`3 action, Context context, CancellationToken cancellationToken)
   at Polly.Policy.Execute[TResult](Func`1 action)
   at Terrasoft.DB.Oracle.OracleExecutor.FailoverExecute[TResult](DbCommand command, Func`1 func)
   at Terrasoft.Core.DB.DBExecutor.ExecuteCommand[TResult](Func`2 commandExecutionCallback, String sqlText, QueryParameterCollection queryParameters, CancellationToken cancellationToken)
   at Terrasoft.Core.DB.DBExecutor.Execute(String sqlText, QueryParameterCollection queryParameters)
   at Terrasoft.Core.DB.StoredProcedure.Execute()
   at Terrasoft.Configuration.BaseCompletenessService.RecalculateAll()
   at Terrasoft.Core.Process.CompletenessRenew.ScriptTask1Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Если запускать "Запустить обновление полноты профиля"

System.NullReferenceException: Object reference not set to an instance of an object.
   at Terrasoft.Configuration.BaseCompletenessService.get_AppConnection()
   at Terrasoft.Configuration.BaseCompletenessService.RecalculateAllByCompleteness(Guid completenessId)
   at Terrasoft.Configuration.BaseCompletenessService.RecalculateAll()
   at Terrasoft.Core.Process.CompletenessRenew.ScriptTask1Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

 

Значит ещё и используется Oracle... Нужно смотреть, что находится в пакете spkg_Completeness во второй строке и во входящей в него хранимке tsp_CompletenessRenew в 113 строке и рядом. Были ли в них доработки?

Есть ли замещения схемы BaseCompletenessService? Если есть, попробуйте удалить, скомпилироваться, повторить запуск процесса.

Изменений и замещений нет. Содержание хранимой процедуры

create or replace PACKAGE BODY "tspkg_Completeness"
AS
	FUNCTION "fn_Is_Number" (stringValue IN VARCHAR2)
	RETURN INT
	IS
		new_Number NUMBER;
	BEGIN
		new_Number := TO_NUMBER(stringValue);
	RETURN 1;
	EXCEPTION
		WHEN VALUE_ERROR THEN
			RETURN 0;
	END;
 
	PROCEDURE "tsp_CompletenessRenew" (CompletenessId VARCHAR2)
	IS
	BEGIN
		DECLARE 
			EntitySchemaName VARCHAR2(50);
			TypeColumn VARCHAR2(50);
			TypeValue VARCHAR2(38);
			ResultColumn VARCHAR2(50);
			sqlcmd VARCHAR2(30000);
			createTableSql VARCHAR2(30000);
			whereSql VARCHAR2(30000);
			updateSql VARCHAR2(30000);
			fromSelectSql VARCHAR2(30000);
			c_id VARCHAR2(38);
			c_column_name VARCHAR2(500);
			c_detail_name VARCHAR2(500);
			c_detail_column VARCHAR2(500);
			c_master_column VARCHAR2(500);
			c_is_column VARCHAR2(1);
			c_is_detail VARCHAR2(1);
			c_percentage INT;
			c_type_column VARCHAR2(50);
			c_type_value VARCHAR2(38);
			typed_detail_name VARCHAR2(500);
			attributes_count INT;
 
			CURSOR attributes_cursor IS 
				SELECT 
					cp."Id",
					cp."ColumnName",
					cp."DetailEntityName",
					cp."DetailColumn",
					cp."MasterColumn",
					cp."IsColumn",
					cp."IsDetail",
					cp."Percentage",
					cp."TypeColumn",
					cp."TypeValue"
				FROM "CompletenessParameter" cp
				WHERE cp."CompletenessId" = (
					SELECT "Id" FROM "Completeness" c WHERE c."Id" = CompletenessId);
		BEGIN
			attributes_count := 0;
			SELECT "EntitySchemaName", "TypeColumnName", "TypeColumnValue", "ResultColumnName"
				INTO EntitySchemaName, TypeColumn, TypeValue, ResultColumn
				FROM "Completeness" WHERE "Id" = CompletenessId;
			createTableSql := 'CREATE TABLE "CalcCompleteness" AS SELECT  "Id", "'||ResultColumn||'", SUM(';
			fromSelectSql := 'FROM "' || entitySchemaName || '" a ';
			whereSql := ' WHERE ';
			OPEN attributes_cursor;
			LOOP
				FETCH attributes_cursor into 
					c_id,
					c_column_name,
					c_detail_name,
					c_detail_column,
					c_master_column,
					c_is_column,
					c_is_detail,
					c_percentage,
					c_type_column,
					c_type_value;
				EXIT WHEN attributes_cursor%notfound;
				attributes_count := attributes_count + 1;
				IF c_is_column = '1' THEN
 
					createTableSql := createTableSql || ' CASE WHEN ("' || c_column_name || '" IS NULL) OR (LENGTH("' || c_column_name || '") = 0)';
					createTableSql := createTableSql || ' OR ("tspkg_Completeness"."fn_Is_Number"("' || c_column_name || '") = 1 AND TO_NUMBER("' || c_column_name || '") = 0) THEN 0 ELSE ' || c_percentage || ' END +';
				ELSE
					typed_detail_name := c_detail_name;
					IF (c_type_column IS NOT NULL OR c_type_column &lt;&gt; '') AND (c_type_value IS NOT NULL OR c_type_value &lt;&gt; '') THEN
						typed_detail_name := c_detail_name || TO_CHAR(attributes_count); 
					END IF;
 
					createTableSql := createTableSql || ' CASE WHEN NVL(' || typed_detail_name || '."' || c_detail_name || '", 0) = 0 THEN 0 ELSE ' || c_percentage || ' END +';
 
					fromSelectSql := fromSelectSql || ', (SELECT COUNT("'|| c_detail_name ||'"."'||c_detail_column||'") "'|| c_detail_name ||'", "'||c_detail_column||'" FROM "'||c_detail_name||'"';
					IF (c_type_column IS NOT NULL OR c_type_column &lt;&gt; '') AND (c_type_value IS NOT NULL OR c_type_value &lt;&gt; '') THEN
						fromSelectSql := fromSelectSql || ' WHERE "' || c_detail_name ||'"."'||c_type_column||'" = '''||c_type_value||'''';
					END IF;
					fromSelectSql := fromSelectSql ||' GROUP BY "'||c_detail_column||'") ' || typed_detail_name;
 
					whereSql := whereSql || 'a."Id" = '||typed_detail_name||'."'||c_detail_column||'"(+) AND ';
				END IF;
			END LOOP;
			CLOSE attributes_cursor;
 
			IF attributes_count &lt;&gt; 0 THEN
				createTableSql := SUBSTR(createTableSql, 0, LENGTH(createTableSql) - 2);
				createTableSql := createTableSql || ') AS "NewCompleteness"';
				whereSql := SUBSTR(whereSql, 0, LENGTH(whereSql) - 6);
				IF (TypeColumn IS NOT NULL OR TypeColumn &lt;&gt; '') 
					AND (TypeValue IS NOT NULL OR TypeValue &lt;&gt; '') THEN
 
					whereSql := whereSql || ' AND a."' || TypeColumn || '" = '''||TypeValue||'''';
				END IF;
				createTableSql := createTableSql || fromSelectSql || whereSql;
				createTableSql := createTableSql || ' GROUP BY a."Id", a."'||ResultColumn||'"';
				EXECUTE IMMEDIATE createTableSql;
				sqlcmd := 'CREATE UNIQUE INDEX calcCompleteness_id_ix ON "CalcCompleteness" ("Id")';
				EXECUTE IMMEDIATE sqlcmd;
				updateSql := 'UPDATE 
					(SELECT 
						t1."Id", 
						t2."Id",
						t1."'||ResultColumn||'" "Completeness1", 
						t2."NewCompleteness" "NewCompleteness"
					FROM 
						"'||EntitySchemaName||'" t1, 
						"CalcCompleteness" t2 WHERE t1."Id" = t2."Id" AND t1."'||ResultColumn||'" &lt;&gt; t2."NewCompleteness") SET "Completeness1" = "NewCompleteness"';
				EXECUTE IMMEDIATE  updateSql;
				sqlcmd := 'DROP TABLE "CalcCompleteness"';
				EXECUTE IMMEDIATE  sqlcmd;
			ELSE
				sqlcmd := 'UPDATE "'||EntitySchemaName||'" SET "'||ResultColumn||'" = 0';
				EXECUTE IMMEDIATE  sqlcmd;
			END IF;
		END;
	END; 
END "tspkg_Completeness";

 

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

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

если имеете введу вносил ли я изменения - нет. Настройки производил по инструкции

Речь о самодельных деталях в этом разделе, если они есть.

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

Детали есть, но не совсем понимаю на что они могут повлиять в процессе. Возможно я чего не знаю, можете подсказать для примера?

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

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

Добрый день!

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

Нашел модуль SecurutyUtilities, метод checkColumnsEditRight, который как мне кажется выполняет данную проверку, одна при открытии карточки отладчик не попадает в этот метод.

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

Нравится

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

Этот метод используется только в схеме OrderPageV2 пакета Order:

/**
* Validates payment status and change if valid.
* @protected
* @param {Function} callback The callback function.
* @param {Object} scope Environment object callback function.
*/
validatePaymentStatus: function(callback, scope) {
	if (this.validate()) {
		var parameters = {
			columnNames: ["PaymentStatus"],
			callback: this.handleColumnRightsAvailability.bind(this, callback, scope)
		};
		this.checkColumnsEditRight.call(this, parameters);
	} else {
		callback.call(scope || this);
	}
},
 
/**
* Handles column rights availability.
* @private
* @param {Function} callback The callback function.
* @param {Object} scope Environment object callback function.
* @param {Object} columnRights Rights of column.
*/
handleColumnRightsAvailability: function(callback, scope, columnRights) {
	if (columnRights.PaymentStatus) {
		this.changePaymentStatus(callback, scope || this);
	} else {
		callback.call(scope || this);
	}
},

Но права доступа определяются на стороне сервера и не уверен, что на стороне браузера получится их регулировать.

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

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

Создан встроенный процесс объекта. Работает прекрасно. Обрабатывается событие "при сохранении".

Создан обычный процесс, который работает с этим же объектом. В нём изменяется значение одного из столбцов и результат сохраняется. После сохранения объекта в процессе, BPM запускает событие "при сохранении" в встроенном процессе объекта и выдаёт исключение при попытке получение значение столбца. Почему-то во встроенный процесс объекта BPM не передал сам объект

Код процесса:

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

Код события "при сохранении" во встроенном процессе объекта:

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

 

Нравится

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

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

esqCandidates.AddAllSchemaColumns();

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

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