У меня реализована система интеграции через EntityDataService, и когда данные приходят в интеграционные сущности, запускается БП по сигналу и обрабатывает данные. Иногда возникает странная ошибка 

Terrasoft.Common.ItemNotFoundException: Элемент с именем "UsrIntMyTable" не найден в
Terrasoft.Core.ManagerItemCollection`1.GetByName(String name) в
Terrasoft.Core.Manager`2.GetInstanceByName(String name) в
Terrasoft.Core.Entities.EntitySchemaQuery..ctor(EntitySchemaManager entitySchemaManager, String sourceSchemaName) в
Terrasoft.Core.Process.UsrMyProcessing.ScriptTask1Execute(ProcessExecutingContext context) в
Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

где UsrIntMyTable - моя интеграционная таблица в БД, которой соответствует объект в конфигураторе (или наоборот).

БП всегда отрабатывает одинаково, но ошибка случается иногда. При этом, что самое обидное, данные по сути теряются, т.к. не обрабатываются.

Судя по всему, ошибка случается здесь

var userConnection = UserConnection;
var DealEsq = new EntitySchemaQuery(userConnection.EntitySchemaManager,"UsrIntMyTable");

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

Нравится

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

Добрый день

Единственное предположение в том, что в эти моменты производится компиляция. Проверьте это предположение

"За ширмой" происходит следующее:

EntitySchemaManager ищет созданный инстанс, если его нет, то создает (new UsrIntMyTable). И вот, если его в сборке нет, то создать его возможности нет

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

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

addItemsToGridData: function() {
    this.callParent(arguments);
	debugger;
	var gridDataItems = this.getGridData().getItems();
	gridDataItems.forEach(function(item) {
		item.set("IsUpdated", 1);
	});
.....

Можно ли в реестр вывести IsUpdated, чтобы пользователи его видели?

Нравится

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

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

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

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

Как это лучше сделать?

Я, например, вижу, что есть метод setActiveTab, однако, надо номер таба получить.

Нормально ли сделать ссылку вида

/0/Nui/ViewModule.aspx#CardModuleV2/UsrMyPage/edit/3f199545-fd54-46fb-b801-f711014389f2/4

Не окажется ли так, что такая приписка к урлу будет валить систему в будущих версиях?

Нравится

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

Добрый день

Вы можете оперировать не номерами Tab'а, а их именами и в урле будете передавать его имя. В будущих релизах не планируется что-то добавлять после Id записи

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

Алексей-Карягин пишет:

В onEntityEnitialized получается рано - таб выбирается, но контент остается от первого таба.

Это потому , что с табами всё очень плохо smiley Попробуйте вот так написать:

onEntityInitialized: function() {
	this.callParent(arguments);
	this.tabsCollectionActions();
},
tabsCollectionActions: function() {
	var tabsCollection = this.get("TabsCollection"); //получаем коллекцию
	//что-то с ней делаем (или нет)
	this.setActiveTab("ProductsInDiscountTab"); //устанавливаем активную
	this.set("ProductsInDiscountTab", true); //в этом set-е вся соль. Нафига он - непонятно. Но без него не рендерится содержимое вкладки
},

 

Варфоломеев Данила,

this.set("ProductsInDiscountTab", true); тоже не рендерится. Только таймаут, только хардкор!

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

Хочу настроить функцию Количество по связанному объекту и вывести значение в реестр как здесь https://academy.terrasoft.ru/documents/marketing/7-8/nastroyka-kolonok-…

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

Почему? Что влияет на это?

Нравится

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

Здравствуйте, Алексей!

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

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

Наблюдаю интересный глюк на OnSite.

Раз в какое-то кол-во минут (10-30) Redis поднимает второй процесс, который отъедает до 13 ГБайт памяти, потом завершается. База рэдиса dump.rdb по размеру 3Гб.

В логах этому времени соответствует такая запись, например

[2116] 04 Dec 15:37:45.043 * 10 changes in 300 seconds. Saving...

[2116] 04 Dec 15:37:45.183 * Background saving started by pid 7080

[2116] 04 Dec 15:38:28.223 # fork operation complete

[2116] 04 Dec 15:38:29.504 * Background saving terminated with success

Когда свободной памяти в системе не хватало, BPM повисала на 30-50 сек, сайт становился недоступен. Когда памяти стало больше (уменьшили макс. память для SQL-сервера), стала чуть-чуть подтормаживать в эти моменты, но в целом работает стабильно.

Однако, сама ситуация мне не нравится. Что посоветуете посмотреть? Куда копать?

И вообще, насколько важные данные хранит рэдис? Если вообще отключить сохранение, то при ребуте сервера, потеряется ли что-то важное?

В ВРМ постоянно вкачиваются данные со стороны системы интеграции через EntityDataService.

Нравится

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

Скорее всего у вас включено хранение данных в файле для редиса.

Попробуйте его отключить:

Конфигурация Redis (redis.windows.conf)

    Отключить сохранение на диск (закомментировать)

        #save 900 1

        #save 300 10

        #save 60 10000

Сергей Кy6риш,

Я правильно понимаю, что в Рэдисе ничего важного не хранится и при очистке и перезапуске сервера, например, мы точно ничего не потеряем?

Алексей-Карягин,

верно

Кстати, каноничный Redis есть только под Linux. Порт на Windows — неофициальный.

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

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

Для определенной сущности у меня есть администрирование по записям.

Если я даю человеку доступ, допустим на чтение, получит ли группа руководителей роли, в которую он входит такие же права?

А если мне надо, чтобы руководители получили права с правом делегирования другому сотруднику, как тогда?

Нравится

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

Добрый день, Алексей!

 

Если я даю человеку доступ, допустим на чтение, получит ли группа руководителей роли, в которую он входит такие же права?

Да, получит.

А если мне надо, чтобы руководители получили права с правом делегирования другому сотруднику, как тогда? 

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

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

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

Есть у меня галлерея изображений, которые я отображаю через Terrasoft.Button. Хочу, что бы по клику открывалось большое изображение, однако, при клике вылетает ошибка "Cannot read property 'apply' of undefined" причем дважды.

Вот такой код. Подскажите, куда копать?

getItemViewConfig: function(itemConfig, item) {
				var itemViewConfig = this.get("itemViewConfig");
				if (itemViewConfig) {
					itemConfig.config = itemViewConfig;
					return;
				}
				var config = {
					className: "Terrasoft.Container",
					id: "ImageGalleryContainer",
					items: []
				};
				config.items.push(this.generateImageConfig(item.get("itemId"), item.get("PhotosSmallURL"),
					item.get("PhotosLargeURL")));
				itemConfig.config = config;
				var x = [];
				x.push(config);
			},
 
			generateImageConfig: function(id, smallUrl, largeUrl) {
				var config = {
					id: id,
					type: ConfigurationEnums.CustomViewModelSchemaItem.CUSTOM_ELEMENT,
					style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT + " cpimagebutton",
					className: "Terrasoft.Button",
					iconAlign: Terrasoft.controls.ButtonEnums.iconAlign.TOP,
					tag: id,
					click: {
						bindTo: "onImageClick"
					},
					visible: true,
					enabled: true,
					imageConfig: {
						source: Terrasoft.ImageSources.URL,
						url: smallUrl
					}
				};
 
				return config;
			},
 
			onImageClick: function() {
				debugger;
			}

 

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

Нравится

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

Сто процентов вы указали что-то замудрёное в одном из параметров. Я бы начал с "style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT + " cpimagebutton"" Поставил бы что-нибудь простое, вроде style: "blue".

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

Добрый день!

сложно сказать куда копать, так как ошибка в том, что не найден какой-то метод можели. Для начала я бы рекомендовал продебажить. Остановиться в месте свала, пройтись по callstack. и возможно станет ясно, какой метод отсутствует

Варфоломеев Данила,

Разобрался, метод должен быть определен во viewmodel scope-е.

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

Наткнулся на ужасную проблему производительности при создании представления в БД.

Ситуация такая, что в таблице, по которой работает View очень-очень много данных. Но по ключевым полям построены индексы и если делать деталь по самой таблице, то всё ок.

Но мне потребовалась небольшая агрегация данных, я сделал View.

В итоге SELECT * FROM myView WHERE UsrMyId = '' отрабатывает мгновенно, но при создании детали на этом представлении система генерирует какой-то бешеный запрос

exec sp_executesql N'
SELECT
    [myView].[Id] [Id],
 
...мои поля...
    (
SELECT
    COUNT([SubEntryPoint].[Id]) [Count]
FROM
    [dbo].[EntryPoint] [SubEntryPoint] WITH(NOLOCK)
WHERE
    [SubEntryPoint].[EntityId] = [myView].[Id]
    AND [SubEntryPoint].[IsActive] = @P2) [SubEntryPoint]
FROM
    [dbo].[myView] [myView] WITH(NOLOCK)
WHERE
    [myView].[UsrMyId] = @P1
ORDER BY
    [UsrServiceName] ASC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY',N'@P1 nvarchar(32),@P2 bit',@P1=N'bc1fc0d8f6d98c04b93a8fb1070f4766',@P2=1

который дико бешено тормозит!

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

Нравится

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

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

Мотков Илья,

Количество записей в таблице EntryPoint равно 0. разумеется мы это проверили.

Вообще, интересно, что когда я развернул  этот запрос без exec sp_executesql и подставил параметры, всё отработало быстро. А вот с процедурой в тысячу раз медленнее.

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

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

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

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

И вот тут возникает вопрос: как оба сервера корректно настроить? У меня, например, есть сигнал на добавление записи. Не сработает ли этот сигнал на обоих серверах приложений одновременно, или не на том? Как с этим работать? Ведь все сохраняется в одной базе.

Нравится

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

Здравствуйте, Алексей!

На текущий момент мы не рекомендуем использовать более одного сервера приложений для работы с одной БД. В теории можно на втором сервере приложения в web.config лоадера отключить использование Schrduler, однако это не обезопасит от остальных проблем, которые могут возникнуть.

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

Интересует возможность разнесения базы на файловые группы для разнесения групп на разные жёсткие диски (разный объем и скорость).

Есть ли в ВРМ встроенная возможность создавать определенные таблицы, например xxxFile на определенной файловой группе? И вообще, есть ли возможность управлять созданием таблиц на файловых группах?

Есть ли у кого-то положительный опыт разнесения базы на ФГ?

Нравится

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

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

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