Подскажите как вывести следующую аналитику с типом "Показатель" (можно каким либо другим):

Есть объект, в котором 2 поля с типом данных "дата": "Плановая дата" и "Фактическая дата".

Нужно вывести следующую информацию:

1) Количество записей, которые не были просрочены ("Фактическая дата"< "Плановая дата")

2) Количество записей, которые были просрочены ("Фактическая дата"> "Плановая дата")

 

Я предполагал, что можно в разделе "Как отфильтровать" указать поле "Фактическая дата" знак "<" и выбрать поле: "Плановая дата", но там можно выбрать только текущий год/месяц/ день.... :((((((

Нравится

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

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

 

Тут нужны обходные подходы: либо через view, как выше советует Алла, либо сделать дополнительное поле (логическое или числовое) и на уровне БП (обычного или встроенного) писать туда признак, что первая дата больше или разницу в днях. БП запускать на событии вставки записи или изменения одного из полей с датами. И затем итоги строить по этому полю.

Добрый вечер.

 

Данный функционал Вы можете реализовать в 2х показателях, а данные для них настроить с помощью sql-представления.

 

Как создать такое представление подробнее читайте в этом посте.

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

 

Тут нужны обходные подходы: либо через view, как выше советует Алла, либо сделать дополнительное поле (логическое или числовое) и на уровне БП (обычного или встроенного) писать туда признак, что первая дата больше или разницу в днях. БП запускать на событии вставки записи или изменения одного из полей с датами. И затем итоги строить по этому полю.

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

Алла Савельева,

Спасибо за ответы

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

Добрый день!

Подскажите, пожалуйста, мы хотим, чтобы у нас в Итогах раздела был расчетный показатель, который пересчитывается при перемещении по папкам в соответствии с условием, накладываемым фильтром папки. Реализовано ли это для элемента «Расчетный показатель»?

 Версия 7.15.1.1295

 Спасибо!

Нравится

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

Ольга, в стандартном блоке итогов «Показатель» выбранная группа учитывается. Правда, проверял на 7.16.1, но в 7.15.1 должно быть тоже.

Или Вы имели в виду «Расчетный показатель» из дополнения «Calculated metrics»? Там не так?

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

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

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

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

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

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

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

 

 

Нравится

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

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

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

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

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

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

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

 

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

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

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

 

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

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

Добрый всем. Заметил странное поведение детали "Стадии" во вкладке "История продажи".

У меня три страницы для разных типов продаж, на двух из них при переходах со стадии на стадию в истории стадий за один переход прописывается 6 стадий (при этом только последняя относится к этому типу продаж). Но интересное что на одном виде продаж такого нет.

Запускается только один бизнес-процесс, так что влияние сторонних исключено, это проверил.

Видимо в логике именно добавления именно в таблицу что-то.

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

Нравится

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

Проверьте, не установлено ли "Показывать в воронке" в True для этих стадии в справочнике стадий продаж

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

 

Если воспроизводится стабильно, то где-то в коде реализовано: или во встроенном БП, или в отдельных, или в событийном слое, или в кейсах этого раздела, или в коде карточки на JS, или, что наименее вероятно, вообще в триггерах.

 

Тут ещё нужно понять, только ли деталь стадий менялась, или реально каждый раз менялось поле «стадия» продажи. Это можно выяснить, настроив стандартный механизм журнала изменений для раздела.

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

 в воронке отображаются, так и должно быть. Проблема в том что эти стадии относятся к другим кейсам, которых у меня 4

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

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

Нужно смотреть во встроенном БП объекта «Продажа» в функции SynchronizeOpportunityStage:

  public virtual void SynchronizeOpportunityStage() {
   if (UserConnection.GetIsFeatureEnabled("DisableOldOpportunityStageSynchronizers")) {
    return;
   }
   if (UserConnection.GetIsFeatureEnabled("NewOpportunityStageManager")) {
    var opportunityStageRepository =
     Terrasoft.Core.Factories.ClassFactory.Get&lt;Terrasoft.Configuration.OpportunityStageRepository&gt;(
      new Terrasoft.Core.Factories.ConstructorArgument("userConnection", UserConnection));
    var opportunityInStageRepository =
     Terrasoft.Core.Factories.ClassFactory.Get&lt;Terrasoft.Configuration.OpportunityInStageRepository&gt;(
      new Terrasoft.Core.Factories.ConstructorArgument("userConnection", UserConnection));
    var opportunityStageManager =
     Terrasoft.Core.Factories.ClassFactory.Get&lt;Terrasoft.Configuration.OpportunityStageManager&gt;(
      new Terrasoft.Core.Factories.ConstructorArgument("userConnection", UserConnection),
      new Terrasoft.Core.Factories.ConstructorArgument("opportunityStageRepository", opportunityStageRepository),
      new Terrasoft.Core.Factories.ConstructorArgument("opportunityInStageRepository", opportunityInStageRepository));
    opportunityStageManager.SynchronizeStage(StageOldValue, OldOwnerId, Entity);
   } else {
    var oppInStageSchema = UserConnection.EntitySchemaManager.GetInstanceByName("OpportunityInStage");
    var stageHelper = Terrasoft.Core.Factories.ClassFactory.Get&lt;Terrasoft.Configuration.OpportunityStageHelper&gt;(
     new Terrasoft.Core.Factories.ConstructorArgument("userConnection", UserConnection),
     new Terrasoft.Core.Factories.ConstructorArgument("oppInStageSchema", oppInStageSchema));
    stageHelper.SynchronizeStage(StageOldValue, OldOwnerId, Entity);
   }
  }

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

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

 

К сожалению настройка "DisableOldOpportunityStageSynchronizers" по умолчанию включена, значит синхронизацию стадий реализовали в другом совершенно методе, возможно даже через какой-то бизнес процесс, так как весь метод только начавшись заканчивается сразу return. Так и не нашел как. Самое интересное:

- во первых, что проблема появилась после обновления с 7.12.4 до 7.15.2 (да, много пропустили потому массово пришлось обновлять), на 7.12.4 проблемы не было

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

 

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

А в кейсах для этого раздела проверяли, может, логика там реализована?

 

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

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

Добрый день

Кастомизируем страничку OrderPageV2. На заголовке выведены Виджеты в виде графиков и индикаторов. Мнение пользователей разделилось надвое. Одни рады  этому, а другим не нужно - только место занимает. 

Теперь сам вопрос можно лина области Header страницу сделать Группу полей (как на вкладках страницы), и уже в неё поместить все виджеты? чтобы появилась возможность скрывать и разворачивать на усмотрение пользователя.

Нравится

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

У меня получилось: мастером добавил группу на вкладке, потом туда виждет, а потом в коде OrderPageV2 у создавшегося элемента OrderProductTabGroup8c09e07e поменял родителя на Header:

"parentName": "Header",//"OrderProductTab",

Выглядит так:

Сворачивается-разворачивается нормально.

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

Добрый день, уважаемые коллеги!

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

Задача - на страницу редактирования Активности в мобильном приложении добавить бизнес-правило (доступность). В какой схеме необходимо прописать новое бизнес-правило?

Есть образованные при настройке мастером мобильного приложения кастомные

MobileApplicationManifestFieldForceWorkplace и MobileActivityRecordPageSettingsFieldForceWorkplace.

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

  1. Создать схему клиентского модуля, в которой прописать новое бизнес-правило. Схема должна расширить кастомную MobileActivityRecordPageSettingsFieldForceWorkplace? Как правильно связать новую схему с MobileActivityRecordPageSettingsFieldForceWorkplace?
  2. Подключить созданную схему модуля в манифесте мобильного приложения MobileApplicationManifestFieldForceWorkplace

И еще вопрос: в каком случае следует использовать классы бизнес-правил , а в каком пользовательские бизнес-правила.

Благодарю за помощь

Нравится

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

Вообще, бизнес-правила для разных разделов добавляют в схемы с названиями ...ModelConfig, вроде MobileActivityModelConfig. Например, в ней стандартно такое:

Terrasoft.sdk.Model.addBusinessRule('ContactCommunication', {
	ruleType: Terrasoft.RuleTypes.Requirement,
	triggeredByColumns: ['Number'],
	position: 0
});
 
Terrasoft.sdk.Model.addBusinessRule('ContactCommunication', {
	ruleType: Terrasoft.RuleTypes.Requirement,
	triggeredByColumns: ['CommunicationType'],
	position: 1
});
 
Terrasoft.sdk.Model.addBusinessRule('ContactCommunication', {
	ruleType: Terrasoft.RuleTypes.Filtration,
	triggeredByColumns: ['CommunicationType'],
	position: 2,
	filters: Ext.create('Terrasoft.Filter', {
		type: Terrasoft.FilterTypes.Group,
		subfilters: [
			Ext.create('Terrasoft.Filter', {
				property: 'UseforContacts',
				value: true
			}),
			Ext.create('Terrasoft.Filter', {
				property: 'Id',
				funcType: Terrasoft.FilterFunctions.NotIn,
				funcArgs: [Terrasoft.GUID.Twitter, Terrasoft.GUID.Facebook, Terrasoft.GUID.LinkedIn]
			})
		],
		name: 'a4265c53-b393-4e16-be5f-ee0e5a7faa8c'
	})
});

 

По базовым бизнес-правилам можно тут документацию с примерами почитать

https://academy.terrasoft.ru/documents/technic-sdkmob/7-16/biznes-pravila-mobilnogo-prilozheniya

А тут по кастомным

https://academy.terrasoft.ru/documents/technic-sdkmob/7-16/polzovatelskie-biznes-pravila-mobilnogo-prilozheniya

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

 

 

Бершеда Д. Н.,

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

Вообще, бизнес-правила для разных разделов добавляют в схемы с названиями ...ModelConfig, вроде MobileActivityModelConfig. Например, в ней стандартно такое:

Terrasoft.sdk.Model.addBusinessRule('ContactCommunication', {
	ruleType: Terrasoft.RuleTypes.Requirement,
	triggeredByColumns: ['Number'],
	position: 0
});
 
Terrasoft.sdk.Model.addBusinessRule('ContactCommunication', {
	ruleType: Terrasoft.RuleTypes.Requirement,
	triggeredByColumns: ['CommunicationType'],
	position: 1
});
 
Terrasoft.sdk.Model.addBusinessRule('ContactCommunication', {
	ruleType: Terrasoft.RuleTypes.Filtration,
	triggeredByColumns: ['CommunicationType'],
	position: 2,
	filters: Ext.create('Terrasoft.Filter', {
		type: Terrasoft.FilterTypes.Group,
		subfilters: [
			Ext.create('Terrasoft.Filter', {
				property: 'UseforContacts',
				value: true
			}),
			Ext.create('Terrasoft.Filter', {
				property: 'Id',
				funcType: Terrasoft.FilterFunctions.NotIn,
				funcArgs: [Terrasoft.GUID.Twitter, Terrasoft.GUID.Facebook, Terrasoft.GUID.LinkedIn]
			})
		],
		name: 'a4265c53-b393-4e16-be5f-ee0e5a7faa8c'
	})
});

 

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

 

Александр, спасибо за пояснения. Но никак не разберусь).

Имеется решение Sales Enterprise + Field Force. Цель изменить поведение стандартного бизнес-правила Активности заполнения Результата, применив сверху стандартного правила и внешнего пакета. Стандартное бизнес-правило прописано в MobileActivityModelConfig (пакет Mobile) - разрешать редактирование поля Result , если состояние активности имеет признак Конечное. Стандартное правило не именовано,т.е. просто отключить его нельзя

Есть FieldForceMobileActivityModelConfig (пакет FieldForceMobile), где изменяется стандартное бизнес-правило в отношении поля DetailedResult. 

Есть MobileApplicationManifestFieldForceWorkplace (пакет FieldMobile), где для модели Activity прописаны "ModelExtensions":

["MobileActivityModelConfig" (стандартные правила),

"FieldForceMobileActivityModelConfig" (добавленные правила внешнего пакета)]

Есть MobileApplicationManifestFieldForceWorkplace (пакет Custom), создан автоматически с признаком «замещать родителя» да.

Создаю свой модуль UsrFieldForceMobileActivityModelConfig, где прописываю свое бизнес-правило, и затем в MobileApplicationManifestFieldForceWorkplace (пакет Custom), добавляю в "ModelExtensions" свой модуль UsrFieldForceMobileActivityModelConfig

И никак не могу добиться работы своего бизнес-правила (либо работает стандартное, либо ничего не работает :)). Т.е. каким образом можно переопределить стандартное неименованное бизнес-правило на свое?

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

 

Благодарю за помощь) разобралась

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

При попытке выгрузки списка, выдается ошибка "Неполадка сервера". Дело в том что мы увеличили количество столбцов до 50 и после этого перестали экспортироваться списки больше ~25, ограничение в web.config на количество выгружаемых строк увеличено до 40 000, есть ли возможность выгрузить большее количество строк?

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

 

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

Нравится

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

Такие большие массивы мы через ODATA в Excel Power BI выгружали

Если сайт развёрнут локально, то ещё можно брать информацию напрямую запросами к базе. Или сохранить в файл, используя Management Studio, или подключаться к базе прямо из Excel по кнопке на вкладке «Данные».

 

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

Здравствуйте, Сакен!

 

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

 

Такое поведение ещё может быть, если в системной настройке "Количество записей в пачке для экспорта в Excel" стоит слишком больше значение. Коробочное значение равно 2000.

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

Кто может сталкивался.

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

Кто сталкивался, поделитесь. Заранее все спасибо.

Нравится

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

Добрый день.

 

Если без разработки, то можно комментарий указать либо в 'Подписи числового показателя' в настройке графика (и он будет отображаться при наведении курсора), либо в заголовке самого графика. Например:

 

 

Алла Савельева,

Алла, спасибо. Это всё сделано. Ноклиент как раз хочет, чтобы было краткое описание самого дэшборда. Т.е. типа всплывающего окна с многострочным текстом.

Милова Марина,

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

Алла Савельева,

к сожалению, клиент не хочет ждать новую версию, а хочет сейчас

Марина, ещё как вариант, можно между графиками добавить блоки веб-страниц, где и разместить нужный текст с форматированием. Но хранить их с доступом по HTTP или HTTPS где-то нужно отдельно. Если именно всплывающим окном, боюсь, без программирования не обойтись.

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

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

 

Я имею в виду стандартный блок итогов «Веб-страница», но так текст будет только в размере её фрейма и на всю страницу не получится. Настраивается пользовательскими средствами.

 

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

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

Как обновить "Панель действий" не перезагружая страницу при создании активности.

Пример ситуации:

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

Ну или как часто бывает у меня - Создается продажа из карточки, процесс начался, и база очень долго создает активность (да, на это бывает уходит минуты две, но это уже вопрос по работе с СУБД Oracle), но пользователь уже зашел в карточку, и когда активность все же создалась то на панели действий ее нет так как она создалась когда у кейса выбрана стадия и панель действий загрузилась уже

Нравится

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

Пример ситуации:

Менеджер сидит и на втором мониторе смотрит фильм, 

Отличное начало.laugh

 

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

 

Конкретно с панелью действий работают сообщения ReloadDashboardItems (отправляется из BaseMiniPage) и ChangeDashboardTab (из ActivityMiniPage):

/**
 * Publishes events after entity save.
 * @protected
 * @param {Function} [callback] Callback-function.
 * @param {Object} [scope] Callback execution context.
 */
publishOnSaveEvents: function(callback, scope) {
	this.sandbox.publish("ReloadDashboardItems", {
		id: this.get("Id")
	});
	this.Ext.callback(callback, scope || this);
},
/**
 * @inheritdoc BaseMiniPage#close
 * @override
 */
close: function() {
	if (this.destroyed) {
		return;
	}
	this.sandbox.publish("ChangeDashboardTab", null);
	this.callParent(arguments);
},

 

Они принимаются в BaseActionsDashboard:

/**
 * Subscribe on events of sandbox.
 * @protected
 */
subscribeSandboxEvents: function() {
	var sandbox = this.sandbox;
	sandbox.subscribe("ReloadDashboardItems", function() {
		this.onReloadDashboardItems();
	}, this);
	sandbox.subscribe("ChangeDashboardTab", function(tabName) {
		this.setActiveTab(tabName);
	}, this);
},

Далее срабатывают обработчики в этой же или дочерних схемах.

 

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

 

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

Но как это сделать из бизнес процесса?

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

	public class idNumberOpportunity
    {
		public Guid Id { get; set; }
    }

проверил что колонка "Продажа" не пуста

Entity.GetTypedColumnValue&lt;Guid&gt;("OpportunityId") != Guid.Empty

и в сценарии запустил код преобразовав сообщение в нужный вид преобразовав в Json формат (на выходе в js вышло так { "Id": "22345200-abe8-4f60-90c8-0d43c5f6c0f6"})

var userConnection = Entity.UserConnection;
var KtIdOpportunuty = new idNumberOpportunity();
KtIdOpportunuty.Id = Entity.GetTypedColumnValue&lt;Guid&gt;("OpportunityId");
MsgChannelUtilities.PostMessage(userConnection, "ReloadDashboardItems", JsonConvert.SerializeObject(KtIdOpportunuty));
return true;

Но видимо подписка так не срабатывает.

Что я не так делаю, подскажите?

Попробуйте поставить отладчик в onReloadDashboardItems, так будет видно, доходит ли Ваше сообщение и чем отличается от настоящего.

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

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

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

После установки этого параметра во время показа детали с колонками рисуется отображение итоговой информации с крестиком отмены. Надо запретить пользователям логику "закрыть на крестик" для всех разделов.  Такое поведение описано в схеме Summary, входит в пакет NUI. Верно понимаю что нет решения?

Нравится

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

Скорее, в схеме SummaryModuleV2:

{
	className: "Terrasoft.Button",
	style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
	imageConfig: resources.localizableImages.ImageDeleteButton,
	classes: {
		wrapperClass: ["summary-delete-button-wrapperEl"],
		imageClass: ["summary-delete-button-image-size"]
	},
	click: {
		bindTo: "deleteItem"
	},
	markerValue: {
		bindTo: "columnCaption"
	}
}

Но опять же, модуль со всеми особенностями по поводу переопределения.

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