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

1. В основном приложении настроен каталог продуктов с числом категорий 38

2. В мобильном приложении в режиме off-line на странице подбора товаров в заказ, под кнопкой Продукты в заказе -> Фильтры видны только 10 категорий из 38. При этом в мобильное приложение импортированы все 38.

Никак не могу понять причины. Записи категорий ничем не отличаются.

Написала в поддержку, но ответа пока нет.

Может кто-то знает особенности этого функционала? спасибо за помощь

 

 

Нравится

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

Марина, возможно, у Вас не offline, а гибридный режим? Там как раз фигурирует ограничение в 10 штук:

Гибридный режим является частным случаем online режима и предназначен для того, чтобы пользователи могли работать с данными в отсутствие стабильного соединения с сервером. Он включается автоматически, когда у пользователя пропадает доступ к сети Интернет. В гибридном режиме есть возможность:

  • Работать с недавними записями во всех разделах. Недавними считаются последние 10 записей, с которыми взаимодействовал пользователь.

  • Создавать новые записи.

  • Работать с расписанием

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

 

Александр, большое спасибо за пояснения. У нас выставлен режим off-line и пакет Полевые продажи. В описании мобильного приложения Полевых продаж написано, что у нему не применим гибридный режим. После попытки внести изменения в перечень Категорий и Типов продуктов, в мобильном приложении стало отображаться всего 7 категорий. Но возможно, причины именно в этом. Благодарю. Если ситуация проясниться напишу)

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

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

 

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

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

Добрый день!

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

Нравится

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

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

 

Если Вы имеете в виду прямо в XLSX-файле выводить информацию о фильтре, то надо дорабатывать логику функции PrepareExport в схеме ExportToExcelService:

/// <summary>
/// Creates and writes excel stream to local storage and return export key.
/// </summary>
/// <param name="esqSerialized">Serialized export esq.</param>
/// <returns><see cref="ExportToExcelResponse"/>.</returns>
public virtual ExportToExcelResponse PrepareExport(string esqSerialized) {
	esqSerialized.CheckArgumentNull("ExportToExcelService.PrepareExport esqSerialized");
	UserConnection.CheckArgumentNull("ExportToExcelService UserConnection");
	UserConnection.DBSecurityEngine.CheckCanExecuteOperation(CanExportGridOperationCode);
	var selectQuery = Json.Deserialize<SelectQuery>(esqSerialized);
	selectQuery.CheckArgumentNull("ExportToExcelService.PrepareExport deserialized SelectQuery");
	var entitySchemaQuery = selectQuery.BuildEsq(UserConnection);
	entitySchemaQuery.CheckArgumentNull("ExportToExcelService.PrepareExport entitySchemaQuery");
	entitySchemaQuery = RemoveBinaryColumnsFromQuery(entitySchemaQuery);
	ExcelConverter.BatchSize = BatchSize;
	var excelData = ExcelConverter.GetExcelData(entitySchemaQuery, UserConnection);
	var storableExcelStream = new StorableStreamEntity { Data = excelData };
	var id = StreamRepository.Create(storableExcelStream);
	return new ExportToExcelResponse {
		Key = id.ToString(),
		Count = ExcelConverter.ExportedRowCount
	};
}

Или, скорее,  вызываемую из неё GetExcelData в схеме ExcelConverter:

/// <summary>
/// Returns excel data by entity schema query.
/// </summary>
/// <param name="entitySchemaQuery">Export data entity schema query.</param>
/// <param name="userConnection">User connection.</param>
/// <returns>Excel data bytes.</returns>
public virtual byte[] GetExcelData(EntitySchemaQuery entitySchemaQuery, UserConnection userConnection) {
	entitySchemaQuery.CheckArgumentNull("ExcelConverter.GetExcelData entitySchemaQuery");
	userConnection.CheckArgumentNull("ExcelConverter.GetExcelData userConnection");
	_isPrimaryColumnSelected = IsPrimaryColumnSelected(entitySchemaQuery);
	if (!_isPrimaryColumnSelected) {
		entitySchemaQuery.PrimaryQueryColumn.IsAlwaysSelect = true;
	}
	using (var excelStream = new MemoryStream()) {
		try {
			var spreadsheetDocument = CreateExcelFile(excelStream, entitySchemaQuery);
			SaveHeader(entitySchemaQuery);
			SaveData(entitySchemaQuery, userConnection);
			CloseExcelFile(spreadsheetDocument);
		} catch (Exception exception) {
			Log.Error($"Error during export to excel {exception}");
			throw new ExportToExcelException(exception);
		}
		return excelStream.ToArray();
	}
}

 Сейчас сериализованный ESQ с фильтром и набором колонок передаётся в первую в текстовом параметре в виде наподобие:

esqSerialized: "{"rootSchemaName":"Opportunity","operationType":0,"includeProcessExecutionData":true,"filters":{"items":{"4d035dfe-121a-4ac7-a729-353f872bf977":{"items":{"FixedFilters":{"items":{},"logicalOperation":0,"isEnabled":true,"filterType":6}},"logicalOperation":0,"isEnabled":true,"filterType":6}},"logicalOperation":0,"isEnabled":true,"filterType":6},"columns":{"items":{"Title":{"caption":"Название","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":0,"columnPath":"Title"}},"Mood":{"caption":"Настроение","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":0,"columnPath":"Mood"}},"Account":{"caption":"Контрагент","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":0,"columnPath":"Account"}},"Contact":{"caption":"Контакт","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":0,"columnPath":"Contact"}},"Stage":{"caption":"Стадия","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":0,"columnPath":"Stage"}},"Owner":{"caption":"Ответственный","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":0,"columnPath":"Owner"}},"Amount":{"caption":"Сумма продажи","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":0,"columnPath":"Amount"}}}},"isDistinct":false,"rowCount":-1,"rowsOffset":-1,"isPageable":false,"allColumns":false,"useLocalization":true,"useRecordDeactivation":false,"serverESQCacheParameters":{"cacheLevel":0,"cacheGroup":"","cacheItemName":""},"queryOptimize":false,"useMetrics":false,"querySource":0,"ignoreDisplayValues":false,"isHierarchical":false}"

А во вторую — в виде обычной ESQ.

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

Здравствуйте! Подскажите как можно сделать связи Email c контактом/контрагентом/договором(добавил в ссылочное поле в группу полей связей) при автоматической отправке email письма элементом в бизнес-процессе Отправить Email, отправка идет с использованием шаблона. Когда выбираешь ручную отправку, то там можно указать связи и все показывается на детали Email(Активности), а когда выбираешь автоматическая отправка...ничего не происходит...и нельзя выбрать ничего

Нравится

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

Атюкин Егор Эдуардович,

Посмотрите хороший пример отсылки с шаблонами в Service Creatio процесс "

SendEmailToCaseContactProcess"

 

Правда, на других продуктах пока не получилось его использовать

Какое-то время назад интересовался тем же. Ответ был - никак.



Потому пришлось скрипт (он есть в Service Creatio, но в других версиях не работал) использовать для этого

Владимир Соколов, а что за скрипт?

вот здесь  поясняется почему не работают связи при автоматической отправки письма элементов Отправить Email. Просто не создается экземпляр Activity. Как вариант создать активность типа Email, а потом её отправить скриптом.

var activityId = AddActivityDataUserTask.RecordId;
var emailClientFactory = ClassFactory.Get<EmailClientFactory>(new ConstructorArgument("userConnection", UserConnection));
var activityEmailSender = new ActivityEmailSender(emailClientFactory, UserConnection);
activityEmailSender.Send(activityId);
return true;

 

Атюкин Егор Эдуардович,

Посмотрите хороший пример отсылки с шаблонами в Service Creatio процесс "

SendEmailToCaseContactProcess"

 

Правда, на других продуктах пока не получилось его использовать

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

Так, пробовал, не работает

Обновление:

Я не указывал зависимости в Usings

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

Владимир Соколов,

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

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

Добрый день!

Правильно я понимаю, чтобы настроить глобальный поиск нужно 2 доп сервера помимо сервера с приложением и сервера баз данных (1-ый сервер с ElasticSearch, 2-ой сервер с компонентами глобального поиска, 3-ий сервер приложений, 4-ый сервера баз данных)?

Нравится

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

Шибаев Андрей,

У нас в компани 2 продуктивных инсталяции. Для них мы используем разные сервера приложений, один сервер БД, один промышленный сервер Redis, один сервер для глобального поиска и еще один для поиска дублей. Есть еще тестовые системы - у них сервер приложений свой, редис локально на сервере приложений. Сервер разработки (мощнее даже промышленных серверов :)), на нем 3 среды разработки, редис, SVN и Redmine для учета задач. Сервер БД один для всех. по мощности соответсвует описанным требованиям с учетом количества баз на нем. 

да, это если без отказоустойчивости

Спасибо!

Уточните, пожалуйста

1)возможно сервер приложения использовать в качестве одного доп сервера (сервер с ElasticSearch или сервер с компонентами глобального поиска)?

2) если в компании 2 - 3 системы, то доп сервера нужны для каждой системы или есть возможность настроить два доп сервер для 2-3 систем? просто немного затратно получается настроить  4 - 6 доп  сервера даже с минимальными системными требованиями

 

1-ый сервер с ElasticSearch, 2-ой сервер с компонентами глобального поиска, 3-ий сервер приложений, 4-ый сервера баз данных

Андрей, ещё забыли  5-й для Redis, 6-й для TMS (телефонии), 7-й для SVN, не считая серверов рассылок и подобного в облаке.

 

Всё зависит от нагрузки на сайт.

 

Если сайт маленький тестовый для одного разработчика, можно поднять всё на одном сервере и даже больше, несколько таких сайтов на одном.

 

А если высоконагруженный, то кластеризировать по нескольким нодам и веб-сервера, и базу, и Redis.

 

Системные требования есть тут, но в общем случае всё индивидуально.

Шибаев Андрей,

У нас в компани 2 продуктивных инсталяции. Для них мы используем разные сервера приложений, один сервер БД, один промышленный сервер Redis, один сервер для глобального поиска и еще один для поиска дублей. Есть еще тестовые системы - у них сервер приложений свой, редис локально на сервере приложений. Сервер разработки (мощнее даже промышленных серверов :)), на нем 3 среды разработки, редис, SVN и Redmine для учета задач. Сервер БД один для всех. по мощности соответсвует описанным требованиям с учетом количества баз на нем. 

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

Коллеги, вечер добрый.

 

Если кто, как мы, столкнулись с проблемой резкого ухудшения импорта данных по oData с обновлением creatio до версии 7.16, подскажите пожалуйста удалось ли данную проблему обойти своими силами.

 

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

(Данные импортируем в ms sql server.)

 

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

Нравится

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

Вадим, нужно выяснить, что именно тормозит: сервер приложений или база. Такое наблюдается только при заливке по OData или, например, при загрузке из Excel-файла тоже? Или вообще вставкой SQL-запросами? Медленно добавляет в любую таблицу или в конкретные?

 

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

 

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

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

Добрый день!

Цель: Кастомизировать страницу самостоятельной регистрации на портале самообслуживания. 

Описание: Т.е. нам необходимо скорректировать  существующие поля и добавить новые.

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

 

Вопрос: Кто-то сталкивался с таким? Подскажите пожалуйста, как решить проблему?

Нравится

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

Раиля, с версии 7.13 запрещено замещение модулей. Нужно делать свой с другим названиям и заменять все его упоминания на других страницах на этот самодельный. Вопрос обсуждался, например, тут и тут.

 

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

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

Добрый день.

При установке пакета File storage for Creatio возникает ошибка. Выдали пользователю БД админ права на СУБД - все равно не помогло.

Лог установки приложил в файле.

Прикрепленные файлы

Нравится

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

Добрый день, Максим,

 

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

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

Добрый день!

 

Подскажите, возможно ли добавить поле в организационные роли рядом с полем название (см. вложение).

 

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

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

Нравится

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

Попробуйте заместить схему SysAdminUnitPageV2 и там добавить кодом нужное поле.

Сидоров Александр Валерьевич пишет:

Попробуйте заместить схему SysAdminUnitPageV2 и там добавить кодом нужное поле.

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

Эта схема унаследована от SysAdminUnitRoleBasePageV2, поле Name задано в ней:

{
	"operation": "insert",
	"parentName": "Header",
	"propertyName": "items",
	"name": "Name",
	"values": {
		"layout": {"column": 0, "row": 0, "colSpan": 24}
	}
},

 

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

Добрый день!

 

Удалось добавить новое поле на эту страницу. Cоздал замещающий объект SysAdminUnit, в который добавил новую колонку. После этого создал замещающую страницу от SysAdminUnitRoleBasePageV2 и добавил рядом с полем Name новое поле, но теперь проблема в том, что поле не сохраняется. Не подскажете, что я упустил?

Сохранение в SysAdminUnit происходит не тем стандартным способом, как в любой объект, а специальным веб-сервисом /0/rest/AdministrationService/SaveRole. Посмотрите, какие запросы идут из браузера на сервер при сохранении карточки роли, увидите. Видимо, потребуется доработать и логику вызова, и сам сервис, добавив нужное поле.

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

Спасибо!

На демо версии (on-site) возможно редактирование данного сервиса?

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

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

Здравсвуйте! Есть кастомный раздел, в него необходимо добавлять данные(пользователь, дата начала сеанса) пользователя при входе в систему, а при выходе изменять эту запись(изменять, точнее заполнять, дату завершения), каким образом это можно сделать?

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

Нравится

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

Добрый день! Данная функциональность реализована в представлении Пользователей системы - https://prnt.sc/snx8dg

Нигрескул Алексей, Я понимаю, там и смотрел, эта деталь ссылается на объект Сеанс пользователя, про который и писал...

Егор, не всегда вставка в таблицу данных идёт так, что срабатывает логика на уровне БП. Например, если вставлять по ESQ или элементом процесса, то срабатывает, а если серверным классом Insert или напрямую через базу, то нет. Аналогично и с изменением и удалением. В стандартном механизме логина в систему в ядре используется именно Insert для начала сессии и Update для её завершения.

 

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

 

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

 

Либо вообще не делать отдельную сущность, а настроить в своём разделе отображение той стандартной детали, о которой писал Алексей. А если нужно совмещать с другими данными, то смотреть в сторону создания view в базе и объекта по нему.

 

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

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

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

Нравится

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

в diff

{

                "operation": "merge",

                "name": "AddTypedRecordButton",

                "parentName": "Detail",

                "propertyName": "tools",

                "values": {

                    "itemType": Terrasoft.ViewItemType.BUTTON,

                    "controlConfig": {

                        "menu": {

                            "items": {"bindTo": "addMenuItems"}

                        }

                    },

                "visible": true,

                "enabled": true

                }

            },

methods

init: function() {

                this.callParent(arguments);

                this.initAddMenuItems();

            },

            initAddMenuItems: function() {

                var addMenuItems = Ext.create("Terrasoft.BaseViewModelCollection");

                addMenuItems.add("addContactItem", this.Ext.create("Terrasoft.BaseViewModel", {

                    values: {

                        "Caption": {"bindTo": "Resources.Strings.AddContactCaption"},

                        "Click": {"bindTo": "addRecipient"},

                        "Tag": "addContact"

                    }

                }));

                addMenuItems.add("addbytemplateItem", this.Ext.create("Terrasoft.BaseViewModel", {

                    values: {

                        "Caption": {"bindTo": "Resources.Strings.AddByTemplate"},

                        "Click": {"bindTo": "addRecipient"},

                        "Tag": "addbytemplate"

                    }

                }));

                this.set("addMenuItems", addMenuItems);

            },

 

в diff

{

                "operation": "merge",

                "name": "AddTypedRecordButton",

                "parentName": "Detail",

                "propertyName": "tools",

                "values": {

                    "itemType": Terrasoft.ViewItemType.BUTTON,

                    "controlConfig": {

                        "menu": {

                            "items": {"bindTo": "addMenuItems"}

                        }

                    },

                "visible": true,

                "enabled": true

                }

            },

methods

init: function() {

                this.callParent(arguments);

                this.initAddMenuItems();

            },

            initAddMenuItems: function() {

                var addMenuItems = Ext.create("Terrasoft.BaseViewModelCollection");

                addMenuItems.add("addContactItem", this.Ext.create("Terrasoft.BaseViewModel", {

                    values: {

                        "Caption": {"bindTo": "Resources.Strings.AddContactCaption"},

                        "Click": {"bindTo": "addRecipient"},

                        "Tag": "addContact"

                    }

                }));

                addMenuItems.add("addbytemplateItem", this.Ext.create("Terrasoft.BaseViewModel", {

                    values: {

                        "Caption": {"bindTo": "Resources.Strings.AddByTemplate"},

                        "Click": {"bindTo": "addRecipient"},

                        "Tag": "addbytemplate"

                    }

                }));

                this.set("addMenuItems", addMenuItems);

            },

 

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