Всем доброго времени суток. Версия 7.10.

На странице активностей есть маленький фильтр поиска по участникам Активности.

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

Я хочу его немного переделать, чтобы в появляющемся по клику на него окне справочника были доступны только контакты, указанные как сотрудники в колонке тип, вместо того Terrasoft.createColumnIsNotNullFilter('[SysAdminUnit:Contact].Id'), который там сейчас стоит. Насколько я понимаю, свойства этого блока указываются внутри функции initFixedFiltersConfig в схеме ActivitySectionV2. Переопределил схему, и заменил функцию, где указал вот такое свойство:

{
	name: "Owner",
	caption: this.get("Resources.Strings.OwnerFilterCaption"),
	addOwnerCaption: this.get("Resources.Strings.AddEmployeeFilterCaption"),
	hint: this.get("Resources.Strings.SelectEmployeeFilterHint"),
	columnName: "Owner",
	defValue: this.Terrasoft.SysValue.CURRENT_USER_CONTACT, //
	dataValueType: this.Terrasoft.DataValueType.LOOKUP,
	filters: [
		function() {
			var filterGroup = Ext.create("Terrasoft.FilterGroup");
			filterGroup.add("OnlyCustomers",
				this.Terrasoft.createColumnFilterWithParameter(
				this.Terrasoft.ComparisonType.EQUAL,
				"Type",
				"60733efc-f36b-1410-a883-16d83cab0980"));
			return filterGroup;
		}
	],
	appendFilter: function(filterInfo) {
		/.../
	}
}

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

 

Нравится

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

Здравствуйте Денис,

Да, изменения нужно было вносить в initFixedFiltersConfig метод, но замещать у фильтра свойство "filter", проставив в него кстомный метод, который возвращает фильтр нужного вида.



Изменения отличные от оригинального initFixedFiltersConfig:



результат:

Вся замещающая схема:

define("ActivitySectionV2", ["terrasoft", "ConfigurationConstants"],
	function(Terrasoft, ConfigurationConstants) {
		return {
			entitySchemaName: "Activity",
			messages: {
			},
			mixins: {
			},
			attributes: {
			},
			methods: {
				initFixedFiltersConfig: function() {
					
					var filterGroup = Ext.create("Terrasoft.FilterGroup");
					filterGroup.add("OnlyCustomers",
						this.Terrasoft.createColumnFilterWithParameter(
						this.Terrasoft.ComparisonType.EQUAL,
						"Type",
						"60733efc-f36b-1410-a883-16d83cab0980"));
						
					var myOwnerFilter = function OwnerFilter() {
						return filterGroup;
					};
					
					var fixedFilterConfig = {
						entitySchema: this.entitySchema,
						filters: [
							{
								name: "PeriodFilter",
								caption: this.get("Resources.Strings.PeriodFilterCaption"),
								dataValueType: this.Terrasoft.DataValueType.DATE,
								startDate: {
									columnName: "StartDate",
									defValue: this.Terrasoft.startOfWeek(new Date())
								},
								dueDate: {
									columnName: "DueDate",
									defValue: this.Terrasoft.endOfWeek(new Date())
								}
							},
							{
								name: "Owner",
								caption: this.get("Resources.Strings.OwnerFilterCaption"),
								addOwnerCaption: this.get("Resources.Strings.AddEmployeeFilterCaption"),
								hint: this.get("Resources.Strings.SelectEmployeeFilterHint"),
								columnName: "Owner",
								defValue: this.Terrasoft.SysValue.CURRENT_USER_CONTACT,
								dataValueType: this.Terrasoft.DataValueType.LOOKUP,
								filter: myOwnerFilter,
								appendFilter: function(filterInfo) {
									var confirmedFilter;
									if (filterInfo.value && filterInfo.value.length > 0) {
										var inviteResponse = ConfigurationConstants.Activity.ParticipantInviteResponse;
										confirmedFilter = new Terrasoft.createFilterGroup();
										confirmedFilter.add("InviteResponseFilter", Terrasoft.createColumnFilterWithParameter(
												Terrasoft.ComparisonType.NOT_EQUAL,
												"[ActivityParticipant:Activity].InviteResponse",
												inviteResponse.Declined,
												Terrasoft.DataValueType.GUID));
										confirmedFilter.add("ActivityParticipantFilter", Terrasoft.createColumnInFilterWithParameters(
												"[ActivityParticipant:Activity].Participant",
												filterInfo.value));
									}
									return confirmedFilter;
								}
							}
						]
					};
					this.set("FixedFilterConfig", fixedFilterConfig);
				}
			},
			diff: /**SCHEMA_DIFF*/[
			]/**SCHEMA_DIFF*/
		};
	}
);

 

Илья, здравствуйте! Спасибо за решение, помогло.

Задам тут же ещё один вопрос: если мне нужен фильтр уже для выбранных активностей, то я могу изменения вносить уже в confirmedFilter? К примеру, в лукапе вывести не список контактов, а список типов, после чего задать: confirmedFilter.add("ActivityParticipantFilter", Terrasoft.createColumnInFilterWithParameters("Owner.Type", filterInfo.value); чтобы вывести задачи всех сотрудников

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

Добрый день!

Нужна помощь. Есть запрос на T-SQL вот такого вида: 

SELECT

    [tbl_BaseAssortment].[OfferingID] AS [OfferingID],

    [tbl_BaseAssortment].[Description] AS [Description],

    [tbl_BaseAssortment].[ChannelID] AS [ChannelID],

    [tbl_BaseAssortment].[StartDate] AS [StartDate],

    [tbl_BaseAssortment].[DueDate] AS [DueDate]

FROM

    [dbo].[tbl_BaseAssortment] AS [tbl_BaseAssortment]

WHERE([tbl_BaseAssortment].[StartDate] = 

    (SELECT

        MAX([tbl_BaseAssortmentLast].[StartDate]) AS [StartDate]

    FROM

        [dbo].[tbl_BaseAssortment] AS [tbl_BaseAssortmentLast]

    WHERE([tbl_BaseAssortment].[OfferingID] = [tbl_BaseAssortmentLast].[OfferingID] AND

        [tbl_BaseAssortment].[ChannelID] = [tbl_BaseAssortmentLast].[ChannelID] AND

        ([tbl_BaseAssortmentLast].[DueDate] >= getdate() OR

        [tbl_BaseAssortmentLast].[DueDate] IS NULL))))

Его нужно записать на EntitySchemaQuery в конфигурационной схеме. С фильтром совсем запутался...

Нравится

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

Добрый день. Если данный запрос необходимо выполнить из серверного кода - вам стоит посмотреть в сторону использования класса SELECT (более низкоуровневый класс чем ESQ). В случае клиентского кода необходимо добавлять View, поскольку конструкция SELECT FROM SELECT не поддерживается (если только не делать второй запрос в коллбеке первого).

Показать все комментарии
js
mobile
7.10
регистрация библиотек
sales

Подскажите пожалуйста каким образом можно внедрить сторонние библиотеки JS в мобильную версию bpm online

Нравится

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

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

Подскажите, какую функциональность Вы хотите добавить сторонними библиотеками?

Pavel Bashtovoy, мне необходимо распрарсить xlsx файл, без отправки на сервер.

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

Как вариант Вы можете создать отделньую схему и полностью скопировать код из этой библиотеки (т.е. метод "copy-paste"). А затем подключить как обычно в манифест CustomSchemas.

Пример подключения таких скриптов:

CustomSchemas: ['MobileActionCheckIn', 'MobileUtilities']

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

Здравствуйте. Очень полезная штука для меня оказалась - стартовый таймер в БП.

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

Запуск таймера происходит по времени UTC +3, хотя я создавал его в UTC +5.

БП, который запускался у меня по таймеру, должен создавать задачи, в которых явно присваивалось время старта, так вот время старта задачи получается вообще по времени UTC +2.

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

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

Нравится

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

Раз официальная поддержка молчит, отвечу я.

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

Именно с таймером, конечно, остался вопрос, работает ли он с временной зоной настроенной у пользователя создавшего таймер (что было бы более логично), либо как-то еще хитро? До проверки такого эксперименты еще не дошли... wink

Добрый день, коллеги! Новый элемент работает с часовой зоной пользователя - а именно высчитывает offset и записывает в базе время в UTC. Также проверили работу джобов при изменении таймера - если это тот же элемент(т.е. изменить время запуска на текущем, а не удалить и добавить другой), джоб корректно изменяется согласно новых настроек. О том, что в данный момент отсутствуют пользовательские средства по удалению джобов(только SQL скрипты в конфигурации) разработчикам ядра известно, и они добавят соответствующий функционал в последующих релизах.

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

Коллеги, Доброго дня!

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

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

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

 

Нравится

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

Добрый день.

Можно решить данную задачу следующим способом:

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

2) В методе onEntityInitialized проверять является пользователь админом или hr-менеджером при помощи esq и по результату запроса заполнять атрибут из пункта 1. Получить Id текущего пользователя можно кодом: Terrasoft.SysValue.CURRENT_USER.value.

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

Пример использования фильтрации в атрибутах из конфигурации:

"Opportunity": {                                                               

dataValueType: Terrasoft.DataValueType.LOOKUP,

lookupListConfig: {

filter: function() {

return this.getOpportunityFilters();

}

}

}

Где имя фильтруемой колонки Opportunity, а метод filter возвращает набор фильтров, которые будут применены к esq при выборке значений для колонки Opportunity из бд.

 

 

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

Всем доброго времени суток. Версия 7.10.

При редактировании раздела Контрагенты выяснилось, что при добавлении новых типов страницы, их схемы наследуются от базовой BaseModulePageV2 (ESN) ( NUI ).

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

После сохранения вот такой правки, как на скриншоте, на странице Клиента остался первоначальный вариант страницы контакта (лежит в пользовательском пакете, наследуется от версии страницы в пакете UIv2 ), а страница Партнёра (лежит в Custom) почти пустая, занаследована от Базовой.

При попытке на странице редактирования схемы страницы Партнёра изменить родительский объект, вылезает сообщение об ошибке: "Невозможно установить родительский объект. Элемент c именем "SaveButtonCaption" уже существует в родительской схеме"

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

Нравится

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

Добрый день. Если я не ошибаюсь, то "элемент существует" - это всего лишь предупреждение. Попробуйте проигнорировать и сохранить страницу

Денис, здравствуйте!

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

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

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

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

Рекомендации по формату схем для обеспечения совместимости с мастерами Вы найдете на SDK: https://academy.terrasoft.ru/documents/technic-sdk/7-10/trebovaniya-k-formatu-shem-dlya-obespecheniya-sovmestimosti-s-masterami

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

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

На вкладке Взаимосвязи страницы Контрагента есть деталь - Взаимосвязи.

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

Можно ли как-нибудь убрать это ограничение, чтобы можно было указать более одной материнской компании?

Нравится

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

Здравствуйте, Денис!

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

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

Shevchenko Andrey,

Андрей, здравствуйте!

Так а в схемах нельзя поправить? Хотя бы в каких схемах происходит генерация диаграммы?

Здравствуйте, Денис!

К сожалению, данное поведение на текущий момент изменить нельзя.

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

Всем доброго времени суток. Версия 7.10.

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

Возможно ли в контролах использовать миксины, также, как и в обычных схемах? Может быть есть примеры, как правильно подключать миксин?

Сделал вот такой миксин:

 

Ext.define("Terrasoft.mixins.UsrMyMixin", {
    extend: "Terrasoft.Component",
    alternateClassName: "Terrasoft.UsrMyMixin",

    checkData: function(test){
console.log("ok");
    }
});

И подключил в контроле, занаследованном также от Component:

mixins: {
		UsrCheckScheduleDatesMixin: "Terrasoft.UsrCheckScheduleDatesMixin",
	},

При подключении, однако, в консоль вываливается ошибка:

file: undefined

 line: undefined

 column: undefined

 message: c is not a constructor 

Может где-то ещё что-то нужно добавить?

Нравится

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

Добрый день.

Контролы в bpm'online не поддерживают секцию mixins и код показанный на скриншоте работать не будет. Для уменьшения количества повторения кода, вы можете создать миксин или же просто модуль с методами и подключить его в define или же через- require. Затем нужные вам методы вызывать в нужном контексте используя методы call или же apply языка JavaScript. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Globa…

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

Терещук Сергей,

Сергей, я ориентировался вот на это: 

https://academy.terrasoft.ru/jscoresdk/source/diagram.html#Terrasoft-co…

Это контрол диаграммы. Там именно такая конструкция:

mixins: {
		connectorRemoval: "Terrasoft.ConnectorRemovalMixin"
	},

Ну и далее идёт вызов через this.mixins.connectorRemoval.init(this.getInstance());

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

То есть, мне следует создать свою версию components, внести туда свои дополнения, и занаследоваться от него.

В Components тоже есть похожая конструкция с mixins: https://academy.terrasoft.ru/jscoresdk/source/component.html#Terrasoft-…

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

Как сделать, чтобы при нажатии на флаг во вкладке Набор групп (1) текущий набор групп добавлялся в связи активности (2) http://prntscr.com/gwfa8a. Например, как в вкладке Контакты http://prntscr.com/gwfbo5

Пыталась сделать вот так: 

Кусочек в схеме

	modules: /**SCHEMA_MODULES*/{
			"ActionsDashboardModule": {
				"config": {
				"isSchemaConfigInitialized": true,
				// Имя схемы.
				"schemaName": "BtcGroupActionsDashboard",
				"useHistoryState": true,
				"parameters": {
					"viewModelConfig": {
						"entitySchemaName": "BtcInterest",
						"dashboardConfig": {
							"Activity": {
								"masterColumnName": "Id",
								"referenceColumnName": "BtcGroupInContact"
							}
						}
					}
					}
				}
			}
		}/**SCHEMA_MODULES*/,

Структура активности:

http://prntscr.com/gwfdic

Нравится

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

Добрый день, Татьяна.

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

Вам необходимо выполнить следующие шаги:

1) Открыть метаданные объекта Activity.

2) Найти UId колонки BtcGroupInContact. Пример для колонки UsrTest на прикрепленном скриншоте.

3) Выполнить следующий скрипт:

insert into EntityConnection (SysEntitySchemaUId, ColumnUId) values ('C449D832-A4CC-4B01-B9D5-8A12C42A9F89', '4847cb25-c29b-44e5-9b7c-1829e2a2f6b4')

Где вместо 4847cb25-c29b-44e5-9b7c-1829e2a2f6b4 будет UId вашей колонки. 

4) Перезайти в систему.

http://prntscr.com/gydvit - взяла uid

http://prntscr.com/gydszn - сделала запрос. Перезашла в систему, почистила кеш и куки

http://prntscr.com/gydtfu - ничего не поменялось (

Терещук Сергей,

именно текущий не добавляется 

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

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

Всем доброго времени суток. Версия 7.10.

К примеру, есть некоторый контрол, наследующийся от Terrasoft.Component. Как я понимаю, сам процесс генерации непосредственно HTML-кода происходит на этом этапе:

 

renderComponent: function(buffer, renderData) {
		var self = renderData.self;
		if (self.html) {
			Ext.DomHelper.generateMarkup(self.html, buffer);
			return;
		}
		var tpl = self.getTpl();
		var tplData = self.getTplData();
		tpl = self.processTemplate(tpl, tplData);
		var template = new Ext.XTemplate(tpl);
		self.prepareTpl(template, tplData);
		template.applyOut(tplData, buffer);
	},

(взято отсюда: https://academy.terrasoft.ru/jscoresdk/#!/api/Terrasoft.controls.Compon…)

Собственно, вопрос такой: можно ли сюда вставить какой-либо запрос, типа getEntityCollection? Задача по сути - надо внести некоторые изменения в tplData, получить данные для которых можно только запросом.

Если я делаю запрос после строки var tplData = self.getTplData(); а последующее - переношу внутри функции-обработчика результата запроса, то в консоль вываливается ошибка: Uncaught Terrasoft.ItemNotFoundException: Элемент не создан

Внутрь самой getTplData, понятно, запрос тоже не добавить - там функция возвращает return.

Можно ли вообще реализовать такую штуку с запросом?

Нравится

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

Добрый день. Да, вы можете воспользоваться esq в данном методе. Однако в момент вызова функции обратного вызова часть внутренних переменных контрола будет уже недоступна. Вам стоит смотреть в сторону реализации взаимодействия контрола с моделью, как это реализовано в базовых контролах системы. Пример реализации вы можете посмотреть в SDK https://academy.terrasoft.ru/sites/default/files/documents/docs/technic… стр. 672.

Терещук Сергей,

Сергей, доброго дня.

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

Может тоже есть, где посмотреть примеры?

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