7.12
Пагинация
Pagination
Service_Creatio

Есть ли какие-нибудь стандартные методы реализации постраничного вывода записей на детали? Или придется создавать свои?

Нравится

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

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

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

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

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

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

 

Есть проблема с переходом на карточку детали. В консоли ошибка

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

 

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

 

Для указанного объекта детали не подгружается страница. Подскажите, какие доработки нужно сделать, чтоб страница подгрузилась?

Нравится

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

Если вы не можете получить editPage для детали значит у вас неправильно зарегистрированы связи между деталью и карточкой детали. Здесь написано как регистрируются эти связи в таблицах пункт 5 https://academy.terrasoft.ru/documents/technic-sdk/7-15/detal-so-strani…

Как у вас получается нормально создавать и сохранять записи детали если вы не можете открыть карточку?

Если вы не можете получить editPage для детали значит у вас неправильно зарегистрированы связи между деталью и карточкой детали. Здесь написано как регистрируются эти связи в таблицах пункт 5 https://academy.terrasoft.ru/documents/technic-sdk/7-15/detal-so-strani…

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

Добрый день! Перерабатываю синхронизацию с LDAP. Заказчик требует выполнять раз в сутки полную синхронизацию и чуть ли не каждые 15 мин частичную. То есть при частичной только добавление новых пользователей и обновление измененных в течении последних 15 мин. После синхронизации в штатной реализации выполняется процедура актуализации ролей. Эта процедура вызывает хранимую процедуру tsp_ActualizeAdminUnitInRole, которая в свою очередь вызывает хранимую процедуру tsp_GetAdminUnitList. На 50000 пользователях эта хранимая процедура выполняется слишком долго (перекрывает 15 минут). Хотелось бы понять, что делает tsp_ActualizeAdminUnitInRole, в чем ее назначение? Если пользователи просто добавляются в группу "All Employees" и еще в одну, вложенную в "All Employees", возможно ли отключить вызов ХП tsp_ActualizeAdminUnitInRole при частичной синхронизации и вызывать только обновление кэша SysAdminUtilities.ReloadSysAdminUnitsCache?

Нравится

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

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

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

Они рекомендуют обновиться до версии 7.17.1+.

Учтите только при разработке своей интеграции, что новая логика уже не использует эти хранимки, то есть их прямой запуск Вам не подойдёт.

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

Всем доброго дня. Версия 7.15.

 

Как в коде в задании-сценарии бизнес-процесса создать несколько записей одним запросом? К примеру, нужно создать несколько записей внутри цикла:

 

foreach (var groupItem in groupCollection)
	{		
		//Создадим запись
		try {
		    var entity = new Terrasoft.Configuration.WSObject(userConnection);
		    entity.SetDefColumnValues();
		    //...
		    entity.Save();
		} catch (Exception exc) {
			//return false;
		} 
}

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

 

К примеру, в JavaScript на клиенте аналогичное действие можно выполнить следующий образом:

var bq = this.Ext.create("Terrasoft.BatchQuery");
 
arr.forEach(function(item, i, arr) {
        var insert = Ext.create("Terrasoft.InsertQuery", {
        		rootSchemaName: "WSObject"
        });				                    
        insert.setParameterValue("WSComment", item.comment, Terrasoft.DataValueType.TEXT); 
        //прочие колонки
        bq.add(insert);
});
 
bq.execute(function(addresponse){});

Тогда в базу уйдёт один запрос. Как сделать аналогичное действие на c#?

Нравится

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

У вас в batchQuery несколько insert каждый из которых выполняется в отдельности, он не отличается от c# варианта который вы описали. 

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

Если вы хотите выполнить вариант sql в котором один insert с несколькими values, вам надо использовать либо CustomQuery в котором прописан sql. Либо попробовать обертку для insert в виде класса Insert.

Entity можно добавлять в EntityCollection, а потом вызывать entityCollection.Save

Николай, спасибо.

А есть пример добавления записей в такую коллекцию?

Например, в схеме MLPredictionSaver:

MLResultListSchemaConfig resultListSchemaConfig = GetResultListSchemaConfig(modelConfig);
var entityCollection = new EntityCollection(_userConnection, resultListSchemaConfig.EntitySchema);
foreach (RecommendationOutput output in predictionResult.Outputs) {
	foreach (RecommendedItem item in output.Items) {
		Entity entity = resultListSchemaConfig.EntitySchema.CreateEntity(_userConnection);
		entity.UseAdminRights = UseAdminRights;
		entity.SetColumnValue("Id", Guid.NewGuid());
		entity.SetColumnValue(resultListSchemaConfig.SubjectColumn, output.UserId);
		entity.SetColumnValue(resultListSchemaConfig.ObjectColumn, item.ItemId);
		if (resultListSchemaConfig.ValueColumn != null) {
entity.SetColumnValue(resultListSchemaConfig.ValueColumn, item.Score);
		}
		if (resultListSchemaConfig.ModelColumn != null) {
entity.SetColumnValue(resultListSchemaConfig.ModelColumn, modelConfig.Id);
		}
		if (resultListSchemaConfig.DateColumn != null) {
entity.SetColumnValue(resultListSchemaConfig.DateColumn, DateTime.UtcNow);
		}
		entityCollection.Add(entity);
	}
}
entityCollection.Save();

Уже заведена идея дать возможность сохранять несколько entity в одной транзакции.

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

Я так и не поняла из этого поста, можно ли использовать BatchQuery на стороне сервера?

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

У вас в batchQuery несколько insert каждый из которых выполняется в отдельности, он не отличается от c# варианта который вы описали. 

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

Если вы хотите выполнить вариант sql в котором один insert с несколькими values, вам надо использовать либо CustomQuery в котором прописан sql. Либо попробовать обертку для insert в виде класса Insert.

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

Добрый день!

Версия 7.14

Могу ли я отображать в конкретной своей детали даты ровно в том часовом поясе, в котором они записаны в БД? Какая утилита отвечает за получение из БД дат со смещением на часовой пояс текущего пользователя?



Заранее спасибо.

Нравится

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

Ап. Пожалуйста откликнитесь

Михаил, как видно по обмену сетевым трафиком,  данные в таком виде приходят уже от веб-сервиса DataService, через который интерфейс в браузере обменивается данными с сервером. А в ядре для приведения к нужному поясу используют методы вроде:

 Terrasoft.Core.DateTimeDataValueType.Serialize(object value, TimeZoneInfo timeZoneInfo)

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

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

Доброго времени суток. Возникла необходимость в настройке глобального поиска версии 2.0. Выполнил все действия по инструкции https://academy.terrasoft.ru/documents/administration/7-16/nastroyka-se…

В ходе настройки ошибок не возникло, но поиск не работает. Решил запустить переиндексацию сайта PUT запросом вида:

http://[GS-WEB-API]:81/indexation/{siteName}/reindex/full

и получил ошибку:

{"code":500,"status":"error","message":"System.ArgumentException: Format of the initialization string does not conform to specification starting at index 66.\n  

at System.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue)\n  

at System.Data.Common.DbConnectionOptions.ParseInternal(Dictionary`2 parsetable, String connectionString, Boolean buildChain, Dictionary`2 synonyms, Boolean firstKey)\n  

at System.Data.Common.DbConnectionOptions..ctor(String connectionString, Dictionary`2 synonyms)\n  

at System.Data.SqlClient.SqlConnectionString..ctor(String connectionString)\n  

at System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous)\n  

at System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions)\n  

at System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key)\n  

at System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)\n  

at ServiceStack.OrmLite.SqlServer.SqlServerOrmLiteDialectProvider.CreateConnection(String connectionString, Dictionary`2 options)\n  

at ServiceStack.OrmLite.OrmLiteConnection.get_DbConnection()\n  

at ServiceStack.OrmLite.OrmLiteConnection.Open()\n  

at ServiceStack.OrmLite.OrmLiteConnectionFactory.OpenDbConnection()\n  

at GlobalSearch.WebApp.HealthCheck.BaseChecker.GetFeatures(List`1 featuresCodes, String dbConnectionString, String dbType) in /src/Src/GlobalSearch.WebApp/HealthCheck/BaseChecker.cs:line 89\n  

at GlobalSearch.WebApp.HealthCheck.FeaturesChecker.Check(Site site) in /src/Src/GlobalSearch.WebApp/HealthCheck/FeaturesChecker.cs:line 24\n  

at GlobalSearch.WebApp.HealthCheck.SiteHealthChecker.CheckSite(Site site, ICollection`1 checkList) in /src/Src/GlobalSearch.WebApp/HealthCheck/SiteHealthChecker.cs:line 53\n  

at GlobalSearch.WebApp.ServiceModel.Requests.Handlers.SearchManagement.GetSearchStateRequestHandler.GetCheckResult(GetSearchStateRequest request) in /src/Src/GlobalSearch.WebApp/ServiceModel/Requests.Handlers/SearchManagement/GetSearchStateRequestHandler.cs:line 34\n  

at GlobalSearch.WebApp.ServiceModel.Requests.Handlers.SearchManagement.GetSearchStateRequestHandler.InternalHandle(GetSearchStateRequest request) in /src/Src/GlobalSearch.WebApp/ServiceModel/Requests.Handlers/SearchManagement/GetSearchStateRequestHandler.cs:line 46\n  

at GlobalSearch.WebApp.ServiceModel.Requests.Handlers.BaseRequestHandler`1.Handle(TRequest request) in /src/Src/GlobalSearch.WebApp/ServiceModel/Requests.Handlers/BaseRequestHandler.cs:line 38"}

 

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

 

Нравится

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

Кирилл, похоже, ошибка происходит при попытке работать с базой, причём, не сайта 7.Х, а сайта глобального поиска. Проверьте правильность databaseConnectionString, который посылают через curl при регистрации сайта в глобальном поиске.

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

Спасибо за ответ. Есть подозрение, что проблема в том, что для подключения к БД в databaseConnectionString я прописал  учетку с указанием домена (т.е. domain\user)  и судя по всему знак "\" недопустим. Подскажите, пожалуйста, какой командой удалить сайт глобального поиска , чтобы передобавить его с корректными реквизитами ?

Кирилл, имеете в виду это?

Важно

Чтобы изменить шаблон поиска, выполните DELETE запрос на /sites/{siteName}/search и  действие AddSearch, описанное выше, после чего будет выполнена полная переиндексация сайта.

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

да, с api разобрался)  , спасибо

 

Kirill Polushin,

Кирилл, здравствуйте. А у вас Глобальный поиск развернут в одной локальной сети с SQL севером creatio?

при выполнении команды: 

curl -v -X POST -d '{"templateName": "[TEMPLATE_NAME]"}' -H "Content-Type: application/json" http://[SERVER2_IP_ADDRESS]:81/sites/[SITE_NAME]/search
Я получаю ответ: "code":500,"status":"error","message":"System.Exception: Could not check index 'hi7z0wyxvi3leufyv8rlaa5aeokhyvharozf3hqlxn1zh8xzthuyawswuw0dcdmn' exists

Не понял с индексацией. Куда вводить PUT запрос? 

curl -v -X POST -d '{"templateName": "default.json"}' -H "Content-Type: application/json" http://[SERVER2_IP_ADDRESS]:81/sites/my-test-site/search  - это я понял, а вот DELETE запрос без примера и действие AddSearch не описано, что куда. Не подскажите по подробнее   

Максим, вводить PUT запрос необходимо на втором сервере в консоли. 

Пример DELETE запроса можно найти в документации curl:

curl -X DELETE http://localhost:8080/user/100 

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

Его пример в документации:

curl -v -X POST -d '{"templateName": "default.json"}' -H "Content-Type: application/json" http://[SERVER2_IP_ADDRESS]:81/sites/my-test-site/search

Рекомендую также ознакомится с более новой версией этой документации тут.

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

надо сделать нормализацию телефонного номера в стандартный формат для

- текущей базы телефонов

- для новых добавляемых телефонов

как это грамотно сделать?

Нравится

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

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

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

Алексей - а как сделать для текущей БД без прямого исправления БД?

Например, написанием и единоразовым ручным запукском БП, который это делает в скрипте или ещё как-то.

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

Добрый день!



Подскажите, пожалуйста, как обновить только одну запись в детали (даже только одну колонку в этой записи), не вызывая updateDetail, который обновляет всю деталь, меняет сортировку, прячет лишние записи и прочие мешающие пользователю продолжить работу с деталью?



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

Нравится

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

При вызове метода updateDetail передавать параметром не reloadAll, а primaryColumnValue.

Например:

 

this.updateDetail({primaryColumnValue: "SomeRecordId"});

 

Владимир, а как Вы обновляли деталь? Смотрю, есть параметр reloadAll, который обычно указывают true:

this.updateDetail({reloadAll: true});

Может, если передать false, получится поменять только нужное? Хотя, Вам же нужно обновлять разные записи.

this.updateDetail({"detail": "UsrSchemaDetailNameHere"});



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

При вызове метода updateDetail передавать параметром не reloadAll, а primaryColumnValue.

Например:

 

this.updateDetail({primaryColumnValue: "SomeRecordId"});

 

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

Код приводит к ошибке.

// Обновление всех деталей.
// all-combined.js:41 Detail not found: undefined
this.updateDetail({ realoadAll:true });

 

У меня вот такое обновление детали без ошибок.

this.reloadEntity();

 

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

Показать все комментарии
Отчёты
пользовательский отчет
7.16
Service_Creatio

Добрый день!

Используется Excel reports builder for Creatio.

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

Отчет не отображается во всплывающем меню "Excel Отчеты" раздела "Контакты".

 

Вопрос: Где кроме как на самой карточке существует возможность сгенерировать отчет?

Заранее спасибо!

Нравится

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

Андрей, добрый день!

 

отчеты с типом "Пользовательский" можно сформировать только в разделе "Excel отчеты". Для отображения отчета в разделе Контакты используйте при создании отчета тип "Отчет для раздела".

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

Коллеги, добрый день. Версия 7.15.3.

 

Подскажите, как настраивается размещение блока шаблона.

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

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

 

Как можно "прижать" его к левому краю?

Нравится

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

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

 

А на вкладке «Предпросмотр» можно проверить, как будет на разных размерах экранов выглядеть. Стандартные блоки автоматически адаптируются под ширину, меняя расположение элементов:

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