Добрый день!



Подскажите, пожалуйста, как перевести стенд в режим разработки в файловой системе в .Net Core 7.18?



Согласно статье Академии для перехода в режим разработки в файловой системе необходимо изменить следующие ключи в web.config



...





Но в версии web.config для .Net Core нет соответствующих ключей:



.<?xml version="1.0" encoding="utf-8"?>



 

   

     

       

     

     

   

 

Нравится

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

Добрый день.

В проекте есть файл app.config, во время билда он превращается в Terrasoft.WebHost.dll.config. Именно в нем можно найти ключи UseStaticFileContent и fileDesignMode.

На сколько я понимаю, то версия .Net Core это клиент, и разрабатывать на ней пока еще нельзя толком. Конфигуратор сделали, но пока только в нем что-то меня, а для полноценного использования пока не подходит

Добрый день.

В проекте есть файл app.config, во время билда он превращается в Terrasoft.WebHost.dll.config. Именно в нем можно найти ключи UseStaticFileContent и fileDesignMode.

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

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

 

Нравится

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

Можно. На параметр "enabled": {bindTo: "название функции"} указать функцию в которой проверить текущего пользователя Terrasoft.SysValue.CURRENT_USER.value на вхождение в указанную группу к примеру

Можно. На параметр "enabled": {bindTo: "название функции"} указать функцию в которой проверить текущего пользователя Terrasoft.SysValue.CURRENT_USER.value на вхождение в указанную группу к примеру

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

Добрый день!

Столкнулись с проблемой формирования отчетов по участникам.   

1) Кнопка «Сформировать отчет» до этого не реагировала. Сейчас при нажатии отчёт вроде бы формируется и попадает в уведомления

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

2) Отображается уведомление, что отчет сформирован

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

3) При нажатии на уведомление об Отчете – выдает ошибку "Не найдена страница для веб-адреса"

Нравится

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

Что за дополнение используется? Версия системы? Дополнение обновляли?

Алексей Следь,

версия системы 7.17.3. Приложение Advanced excel reports for Creatio

Показать все комментарии
<?xml version="1.0" encoding="utf-8"?>
<connectionStrings>
 
  <add name="redis" connectionString="host=localhost;db=2;port=6379;timeout=20;maxReadPoolSize=10;maxWritePoolSize=500" />
  <add name="defPackagesWorkingCopyPath" connectionString="%TEMP%\%APPLICATION%\%APPPOOLIDENTITY%\%WORKSPACE%\TerrasoftPackages" />
  <add name="tempDirectoryPath" connectionString="%TEMP%\%APPLICATION%\%APPPOOLIDENTITY%\%WORKSPACE%\" />
  <add name="sourceControlAuthPath" connectionString="%TEMP%\%APPLICATION%\%APPPOOLIDENTITY%\%WORKSPACE%\Svn" />
  <add name="elasticsearchCredentials" connectionString="User=gs-es; Password=DEQpJMfKqUVTWg9wYVgi;" />
  <add name="influx" connectionString="url=http://10.0.7.161:30359; user=; password=; batchIntervalMs=5000" />
  <add name="messageBroker" connectionString="amqp://guest:guest@localhost/BPMonlineSolution" />
  <add name="db" connectionString="Data Source=MSKDTC01-SQL01\CRM; Initial Catalog=ELZTerrasoft; User ID=Terrasoft123; Password=Root123-4;MultipleActiveResultSets=True;Pooling=true;Max Pool Size=100" />
</connectionStrings>

выше мой файл настроек



у пользователя есть права владельца 



но при попытке открыть сайт выдает 

 

Security Exception

Description: The application attempted to perform an operation not allowed by the security policy.  To grant this application the required permission please contact your system administrator or change the application's trust level in the configuration file.



Exception Details: System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)



Source Error:

 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.



Stack Trace:

 

[SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)]
   System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling, SqlAuthenticationProviderManager sqlAuthProviderManager) +1431
   System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +1085
   System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) +70
   System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +964
   System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +109
   System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) +1529
   System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) +156
   System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) +258
   System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) +312
   System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) +202
   System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) +413
   System.Data.SqlClient.SqlConnection.Open() +128
   Terrasoft.Core.DB.DBExecutor.<get_DBConnection>b__14_0() +22
   Polly.<>c__DisplayClass109_0.<Execute>b__0(Context ctx, CancellationToken ct) +23
   Polly.<>c__DisplayClass103_0.<NoOp>b__1(Context ctx, CancellationToken ct) +18
   Polly.NoOp.NoOpEngine.Implementation(Func`3 action, Context context, CancellationToken cancellationToken) +17
   Polly.<>c.<NoOp>b__103_0(Action`2 action, Context context, CancellationToken cancellationToken) +105
   Polly.Policy.Execute(Action`2 action, Context context, CancellationToken cancellationToken) +70
   Polly.Policy.Execute(Action action) +119
   Terrasoft.Core.DB.DBExecutor.get_DBConnection() +238
   Terrasoft.Core.DB.DBExecutor.PingDB(UserConnection userConnection) +47
 
[SecurityException: System login error. Error has been recorded in system log of the server. Please contact your system administrator.]
   Terrasoft.Core.DB.DBExecutor.PingDB(UserConnection userConnection) +240
   Terrasoft.Core.SystemUserConnection.InitializeCurrentUser(String userName, TimeZoneInfo timeZone, String clientIP, String agent, Boolean needRegisterSessionStart) +28
   Terrasoft.Core.SingleInstanceSystemUserConnectionProvider.Initialize(Boolean doLogin) +127
   Terrasoft.Core.AppConnection.InitializeSystemUserConnection(ConfigurationSection schemaManagerProviderConfigurationSection) +51
   Terrasoft.Core.AppConnection.Initialize() +493
   Terrasoft.WebApp.Loader.Global.InitializeAppConnection() +152
   Terrasoft.WebApp.Loader.Global.Application_Start(Object sender, EventArgs e) +230

Нравится

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

Дмитрий, добрый день! 

 

Данная ошибка связана с тем, что возникают проблемы подключения к серверу базы данных SQL с сервера IIS.



С рекомендациями по устранению данных проблемы можно ознакомиться тут 

https://stackoverflow.com/questions/16256533/a-network-related-or-instance-specific-error-occurred-while-establishing-a-conne

и

https://thycotic.force.com/support/s/article/System-Data-SqlClient-SqlException-0x80131904

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

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

Нравится

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

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

хорошо, а как найти то где он используется , не по поиску или как либо еще подобное не работает, всегда выдает один экземпляр

Dima Avdoshin,

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

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

Добрый день,

 

Как в БП с помощью элемента Изменить данные внести уникальные изменения в несколько уникальных записей, или каким иным элементом следует воспользоваться? 

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



"Для выполнения разных изменений в разных записях используйте несколько элементов [ Изменить данные ]. - таких уникальных записей будет 20-30 + со временем могут добавляться новые, прописывать вручную параметры каждой не вариант.

Нравится

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

А как вы рассчитывает эти "Уникальные изменения". И что за "уникальные изменения"? От этого зависит возможно ли вообще так сделать, а если возможно , то как сделать. Как вариант сделать цикличность процесса с признаком что изменили данные или попробовать использовать подпроцессы с расчетом "уникальных изменений" внутри под процесса. А на вход подавать коллекцию записей.

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

 

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

 

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

Алексей Следь,

Добрый день,

 

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

Екатерина Пильгук,

ну так все просто. вот этот реестр с уникальными записями есть коллекция записей. Делаете бизнес процесс стартующий по таймеру. Отбираете коллекцию записей год-клиент-юр.лицо - id. Вызываете подпроцесс с параметрами год-клиент-юр.лицо-id. в подпроцессе 2 элемента. Читать данные с параметрами режим чтения Считать функцию. потом изменить данные, где данные отбираете запись по id и пишите результат функции из читать данные.

Алексей Следь,



Спасибо, попробую сделать так.

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

Добрый день,

Мне необходимо ограничить пользователю права доступа: может редактировать в записях раздела только одно поле.  В голову приходит только костыльный вариант - дать право доступа Редактирование на данную колонку в доступах на объекты, а по всем остальным колонкам (а их очень много) Чтение. Но тут есть риск покалечить права доступа других пользователей, а их задевать нельзя.

Может, предусмотрен какой-то более удобный способ? 

Нравится

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

Добрый день! Вы имеете ввиду редактировать поле на странице? Через бизнес-правила вроде так можно это сделать.

 

Дмитрий,

Через бизнес-правило "if текущий пользователь = справочник.Пользователь then поле редактируемое"  права на другие колонки же не ограничатся. Плюс, я так понимаю, это правило не позволит другим пользователям редактировать это поле, т.к. будет проходить проверка на текущего пользователя.

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

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

Дмитрий,

 

Мне как раз нужно, чтобы пользователь не мог редактировать ни одно другое поле кроме выбранного.

Если ставить правила на запрет изменения всех остальных полей через "пользователь!=" , то помимо того, что их будет порядка 30-40, и некоторые из них работать не будут (т.к. creatio воспринимает только 1 правило, завязанное на 1 поле, а другие игнорирует), но ещё такие правила перетрут права доступа, настроенные через Доступ на объекты. =(

Добрый день, 

 

Самый правильный способ, это добавить функциональную роль, например "Может редактировать одну колонку". После настроить права доступа на все колонки таким образом что бы роли которы имеют право редактировать эти колонки имели такую возможность, а для роли "Может редактировать одну колонку" такую возможность забрать. Важно что бы запрещающие права были в приоритете выше. 

 

Из неочевидного, руководители роли "Может редактировать одну колонку" также унаследуют эти права. 

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

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



Можно ли как то применить фильтр к детали с задержкой, если да то как?

Нравится

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

Делаете сбор коллекции в инит 

получаете айди записи с помощью 

recordId = this.get("PrimaryColumnValue");

радуетесь

Показать все комментарии
attributes: {
            //коллекция записей объектов, используется для фильтров на детали объекты
            "collection": {
                "dataValueType": this.Terrasoft.DataValueType.COLLECTION,
                "type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                "value": []
            },
"qrtSchema20721e4bDetail473909b0": {
				"schemaName": "qrtSchema20721e4bDetail",
				"entitySchemaName": "qrtObject",
				"filterMethod": "setObjectFilers"
			}
onEntityInitialized: function(){
				this.callParent(arguments);
                this.console.log("onEntityInitialized");
				this.getProjectCollections();
			},
 setObjectFilers: function(){
                debugger;
                var DEFAULT = "00000000-0000-0000-0000-000000000000";
                this.console.log("setObjectFilers");
                var collection = this.get("collection");
                this.console.log("Массив: "+collection);
                var filterGroup = Ext.create("Terrasoft.FilterGroup");
 
 
                if(collection.length !== 0){
                    filterGroup.add("IdFilter",Terrasoft.createColumnInFilterWithParameters("Id", collection));
                } else {
                    filterGroup.add("IdFilter",
                                    Terrasoft.createColumnFilterWithParameter(
                                        Terrasoft.ComparisonType.EQUAL, "Id", DEFAULT));
                }
 
 
 
                return filterGroup;
 
            },
            /**
             * получает коллекцию объектов по лидам и продажам
             */
            getProjectCollections:function(){
                var mas = [];
                Terrasoft.chain(
                    function(next){
                        var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                            rootSchemaName: "Opportunity"
                        });
                        this.console.log("obj");
                        esq.addColumn("qrtObject.Id");
                        // Создание экземпляра первого фильтра.
                        var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "qrtProject", this.get("Id"));
                        esq.filters.add("esqFirstFilter", esqFirstFilter);
 
                        esq.getEntityCollection(function (result) {
                            if (result.success) {
                                result.collection.each(function (item) {
                                    this.console.log(item.get("qrtObject.Id"));
                                    mas.push(item.get("qrtObject.Id"));
 
                                });
                            }
                            next();
                        }, this);
                    }, 
                    function(next){
                        this.console.log(mas);
                        self.set("collection", mas);
                        this.updateDetail({detail: "qrtSchema20721e4bDetail473909b0", realoadAll: true});
                        this.setObjectFilers();
 
                    }, this
                )           
            }

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

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

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

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

Нравится

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

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

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

Когда пытаюсь удалить объект через элемент БП удалить данные мне выдает сообщение, что Элемент удалить невозможно, так как он используется в процессе.

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

Нравится

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

Объект не нашел, но сделал удаление без связанных с помощью метода 

 

GridUtilitiesService deleteRecordsService = new GridUtilitiesService();
//первый параметр айдишники записей, а второй целевой объект
deleteRecordsService.DeleteRecords(new string[]{"ac52a8ab-f404-4809-b590-e4beeec2eacc","f9f8c61d-64b3-4686-862f-e261150e7fca","320cc71e-e053-4eb2-b6eb-8ca96728bb51"}, "Activity");

 

Объект не нашел, но сделал удаление без связанных с помощью метода 

 

GridUtilitiesService deleteRecordsService = new GridUtilitiesService();
//первый параметр айдишники записей, а второй целевой объект
deleteRecordsService.DeleteRecords(new string[]{"ac52a8ab-f404-4809-b590-e4beeec2eacc","f9f8c61d-64b3-4686-862f-e261150e7fca","320cc71e-e053-4eb2-b6eb-8ca96728bb51"}, "Activity");

 

Добрый день!

 

Найти идентификатор экземпляра процесса, в котором используется удаляемая запись можно запросом:

select SysProcessId from SysProcessElementData ed join SysEntityCommonPrcEl ede on ede.ProcessElementId = ed.Id where ede.RecordId = 'id удаляемой записи'



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



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



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

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