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

Встречал кто ни будь такой баг или фичу и как смогли обойти? 

Реализовали кнопки в совмещенном режиме, после каких-то действий в карточке, необходимо поменять перечень кнопок в совмещенном режиме. Отправляется message с помощью sandbox в Section запускается метод this.reloadGridData(). Все работает отлично, но только до одного момента. Существует стандартный боковой список, по умолчанию подтягивается вроде 30 записей (не суть), когда скролл списка крутим вниз, то срабатывает needLoadData() из схемы BaseDataView.js появляется еще 30 записей, если выбрать запись из прогруженных, запустить выше описанную логику, то после метода this.reloadGridData() теряется ActiveRow, а это влияет на логику завязанный на ActiveRow в совмещённом режиме. Даже не используя боковой список, а перейдем в запись, например, 50 по счету, то после выполнения метода this.reloadGridData() пропадает ActiveRow. У вас так же?

define("ContactSectionV2", [], function() {
	return {
		entitySchemaName: "Contact",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		messages: {
			"buttonChanged": {
				mode: this.Terrasoft.MessageMode.PTP,
				direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE 
			}
		},
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
			init: function() {
				this.callParent(arguments);  
				this.buttonVisibleToMessages();
			},
			buttonVisibleToMessages: function(){
				var subscriberId = this.sandbox.id + "_CardModuleV2";
				this.sandbox.subscribe("buttonChanged", function() {				
					//debugger
					this.reloadGridData();
				}, this, [subscriberId]);
			},
		}
	};
});
define("ContactPageV2", [], function() {
	return {
		entitySchemaName: "Contact",
		attributes: {},
		messages: {	
			"buttonChanged": {
				mode: this.Terrasoft.MessageMode.PTP,
				direction: this.Terrasoft.MessageDirectionType.PUBLISH //тут мы получаем
			}
		},
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments); 
			},
			onSaved: function() {
				this.callParent(arguments);
				this.sandbox.publish("buttonChanged", null, [this.sandbox.id]);
			},
		},
		dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
	};
});



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

Нравится

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

Здраствуйте,  рекомендую обратить внимание на пример реализации описан в статье: https://academy.terrasoft.ru/docs/developer/ehlementy_interfejsa/strani…

В схеме ContactSectionV2 можно добавить метод, в котором явно будет определять activeRow = this.get("ActiveRow");

Здраствуйте,  рекомендую обратить внимание на пример реализации описан в статье: https://academy.terrasoft.ru/docs/developer/ehlementy_interfejsa/strani…

В схеме ContactSectionV2 можно добавить метод, в котором явно будет определять activeRow = this.get("ActiveRow");

Алёна Доля,

Спасибо, помогло!

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

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

ProcessModuleUtilities.executeProcess is not a function

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

Вызов осуществляется следующим образом.

var config = {
    sysProcessName: "UsrMyCustomProcess",
    parameters: { 
        SomeProcessParam: someValue 
    }
};
ProcessModuleUtilities.executeProcess(config);

 

Нравится

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

Татьяна, 

Рекомендую ознакомится с статьей https://academy.terrasoft.ru/docs/developer/integratsiya_i_vneshnij_api…, в ней пошагово описана реализация запуска процесса с схемы.

в конструктор пропиши ProcessModuleUtilities

 

define("AccountPageV2", ["ProcessModuleUtilities"],

    function( ProcessModuleUtilities)

Dima Avdoshin, это прописано

Татьяна, 

Рекомендую ознакомится с статьей https://academy.terrasoft.ru/docs/developer/integratsiya_i_vneshnij_api…, в ней пошагово описана реализация запуска процесса с схемы.

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

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

Нравится

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

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

 

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

https://community.terrasoft.ru/questions/filtraciya-spravochnogo-polya-…

https://community.terrasoft.ru/questions/filtr-spravochnogo-polyaneskol…

https://community.terrasoft.ru/questions/slozhnyy-filtr-v-spravochnom-p…

https://community.terrasoft.ru/questions/filtraciya-spravochnogo-polya-1

 

 

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

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



Появилась ошибка валидации лицензий при добавлении записи на кастомный раздел.

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

Может кто-нибудь сталкивался с похожим или знает в чём проблема.



Заранее благодарю за помощь.

 

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

Нравится

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

Тут лучше в поддержку обратиться. Возможно название объекта раздела как-то совпало с названием объекта из платного дополнения. У террасофта есть список "платных" разделов, которые они проверяют по названию объекта и если нет лицензии, то появляется такое предупреждение. Если dev среда без лицензий (с ограничением в 1000 записей), то там проверка лицензий не запускается.

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

Проверьте название Объекта раздела, который требует лицензию.

Возможно у него нет префикса и система считает его лицензируемым объектом базового приложения или какого-то решения.

Проверьте лицензируемый ли сам объект в SysLicPackage. Возможно, он содержится в Operations лицензионного продукта в списке LicEntities. 

Если это так, проверьте есть ли на объект права в лицензии, в Operations. Например, Case.Full, Lead.Read.

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

Добрый день!

Подскажите, пожалуйста, как с помощью CreateFilterWithParameters построить фильтр для поиска, не зависящего от регистра? Есть ли возможность применить upper, lower?

Нравится

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

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

Если страница обычная, тут понятно, настраиваем колонки - сохраняем настройку для всех пользователей, привязываем данные SysProfileData фильтруя по ключу.

А как правильно сохранить настройку на портальной странице, у портального пользователя нету кнопки сохранить настройку колонок для всех.

Подменой названия страницы в URL адресе, тогда под супервизором можно попасть на страницу портала, единственное ли это решение?

Нравится

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

Смотреть в таблицу SysProfileData, твой настройке нужно поставить в поле ContactId значение null

 

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

--удалял все настройки кроме тех, которые не пустые и не под пользователем супервизор. В вашем примере в key нужно подставить настройку этой самой детали. А id пользователя твоего пользователя, от которого копировать на всех
	/*	
		delete from SysProfileData where "Key" in (
		select "Key" from SysProfileData
		where ("Key" like 'Usr%GridDataView' or "Key" like '%Detail%') and SysCultureId = '1A778E3F-0A8E-E111-84A3-00155D054C03'
		and (ContactId = '410006E1-CA4E-4502-A9EC-E54D922D2C00' or ContactId is null)
		group by "Key"
		having count(*) >=2
		) and ContactId is null
	*/
--	в тут обновляем contactId на null (для системы если стоит null, то это считается настройкой по умолчанию.
 /*	
	update SysProfileData set ContactId = null
	where "Key" like 'Usr%GridDataView' or "Key" like '%Detail%' and SysCultureId = '1A778E3F-0A8E-E111-84A3-00155D054C03' and ContactId = '410006E1-CA4E-4502-A9EC-E54D922D2C00'
  */

 

Смотреть в таблицу SysProfileData, твой настройке нужно поставить в поле ContactId значение null

 

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

--удалял все настройки кроме тех, которые не пустые и не под пользователем супервизор. В вашем примере в key нужно подставить настройку этой самой детали. А id пользователя твоего пользователя, от которого копировать на всех
	/*	
		delete from SysProfileData where "Key" in (
		select "Key" from SysProfileData
		where ("Key" like 'Usr%GridDataView' or "Key" like '%Detail%') and SysCultureId = '1A778E3F-0A8E-E111-84A3-00155D054C03'
		and (ContactId = '410006E1-CA4E-4502-A9EC-E54D922D2C00' or ContactId is null)
		group by "Key"
		having count(*) >=2
		) and ContactId is null
	*/
--	в тут обновляем contactId на null (для системы если стоит null, то это считается настройкой по умолчанию.
 /*	
	update SysProfileData set ContactId = null
	where "Key" like 'Usr%GridDataView' or "Key" like '%Detail%' and SysCultureId = '1A778E3F-0A8E-E111-84A3-00155D054C03' and ContactId = '410006E1-CA4E-4502-A9EC-E54D922D2C00'
  */

 

Трефилов Павел Сергеевич,

Большое спасибо!

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

При добавлении или редактировании концертной программы для случая, если она ежедневная, выполнять проверку: если в результате изменений общее число активных ежедневных программ в системе будет превышать значение 3 (UsrSysSetingMaxNumberActiveDailyPrograms) то выводить сообщение об ошибке

Способ реализации:

обработчики в коде JavaScript страницы редактирования с применением клиентского ESQ и механизма валидации.

Нравится

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

Илья, добрый день!

Не совсем понимаю, что вы подразумеваете под "концертной" программой? Это объект в системе наподоби контактов или контрагентов?

Илья, реализовать вашу логику можно несколькими вариантами. 

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

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

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

Добрый день!

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

При открытии карточки, чтобы не исчезал фильтр в поле, после закрытия карточки.

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

Нравится

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

Мы подобным образом делали поиск лидов в LeadSectionV2 по многим полям

 

		attributes: {
			"UseSearchFilter": {
				dataValueType: Terrasoft.DataValueType.BOOLEAN,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				value: false
			},
			"SearchFilter": {
				dataValueType: Terrasoft.DataValueType.TEXT,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
			}
		},
			initQueryFilters: function(esq) {
				this.callParent(arguments);
				var useSearchFilter = this.get("UseSearchFilter");
				var searchFilter = this.get("SearchFilter");
				if (!useSearchFilter || !searchFilter) {
					esq.filters.removeByKey("FilterContactCommunication");
				}
				else {
					var filterGroup = new Terrasoft.createFilterGroup();
					filterGroup.logicalOperation = Terrasoft.LogicalOperatorType.OR;
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].Contact", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].Account", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].BusinesPhone", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].MobilePhone", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].Email", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].Website", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].QualifiedAccount.Name", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[Lead:Id:Id].QualifiedContact.Name", searchFilter));
						filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[ContactCommunication:Contact:QualifiedContact].SearchNumber", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[ContactCommunication:Contact:QualifiedContact].Number", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[AccountCommunication:Account:QualifiedAccount].SearchNumber", searchFilter));
					filterGroup.addItem(Terrasoft.createColumnFilterWithParameter(
						Terrasoft.ComparisonType.CONTAIN, "[AccountCommunication:Account:QualifiedAccount].Number", searchFilter));
					esq.filters.add("FilterCommunication", filterGroup);
				}
			},
			searchFilter: function() {
				this.reloadGridData();
			},
			enableSearchFilter: function() {
				this.set("UseSearchFilter", true);
			},
			disableSearchFilter: function() {
				this.set("UseSearchFilter", false);
				this.reloadGridData();
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "FilterSearchContainer",
				"parentName": "FiltersContainer",
				"propertyName": "items",
				"index": 0,
				"values": {
					"id": "FilterSearchContainer",
					"selectors": { wrapEl: "#FilterSearchContainer" },
					"itemType": Terrasoft.ViewItemType.CONTAINER,
					"wrapClass": ["quick-filter-module-container-wrapClass", "custom-filter-container"],
					"items": []
				}
			},
			{
				"operation": "insert",
				"parentName": "FilterSearchContainer",
				"propertyName": "items",
				"name": "EnableSearchFilter",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
					"click": {"bindTo": "enableSearchFilter"},
					"caption": "Search"
				}
			},
			{
				"operation": "insert",
				"parentName": "FilterSearchContainer",
				"propertyName": "items",
				"name": "SearchFilter",
				"values": {
					"bindTo": "SearchFilter",
					"visible": {"bindTo": "UseSearchFilter"},
					"labelConfig": {
						"visible": false
					},
					"controlConfig": {
						"className": "Terrasoft.TextEdit"
					},
					"textSize": "Small"
				}
			},
			{
				"operation": "insert",
				"parentName": "FilterSearchContainer",
				"propertyName": "items",
				"name": "UseSearchFilter",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"style": Terrasoft.controls.ButtonEnums.style.BLUE,
					"click": {"bindTo": "searchFilter"},
					"visible": {"bindTo": "UseSearchFilter"},
					"markerValue": "applyButton",
					"imageConfig": {"bindTo": "Resources.Images.ApplyButtonImageNew"}
				}
			},
			{
				"operation": "insert",
				"parentName": "FilterSearchContainer",
				"propertyName": "items",
				"name": "DisableSearchFilter",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"click": {"bindTo": "disableSearchFilter"},
					"visible": {"bindTo": "UseSearchFilter"},
					"markerValue": "cancelButton",
					"imageConfig": {"bindTo": "Resources.Images.CancelButtonImageNew"}
				}
			}
   }

 

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

Спасибо, попробуем

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

При открытии карточки фильтр очищается :(( а нам нужно, чтобы  хранился, пока не отменим

 

Тогда надо сохранять значение фильтра в профиле. Что-то похожее здесь обсуждалось - 

https://community.terrasoft.ru/questions/polzovatelskiy-fiksirovannyy-f…

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

Добрый день. Есть некоторые дорабоки которые находятся в пакете custom на стенде dev. Подскажите пожалуйста, каким образом, безболезненно для системы, мы можем перенести пакеты на продакшн версию? Спасибо.

Нравится

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

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

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

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

Создать свой пакет, перенести туда все доработки. Экспортировать пакет в ZIP и установить его на продакшн.

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

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

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

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

Версия Creatio 7.18.5.1500

В чем может быть проблема?

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

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

Нравится

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

Если установлено, то удалите приложение Custom filter constructor for Creatio. Если нет и доработки делала Banza, то пишите им чтобы они устранили эти ошибки

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

 

При создании раздела мастером происходит его автоматическая регистрация в системных таблицах SysModuleEntity, SysModuleEdit и SysModule.

При переносе на другой сайт записи в указанных таблицах не переносятся.

Необходимо:

  • Создать запись в таблице SysModuleEntity (таблица, где хранится информация объектах разделов):

SysModuleEntity

insert into SysModuleEntity (SysEntitySchemaUId) values ('AF6DD4AD-1398-4FCE-8837-78DC65AE0F9E')

где  [SysEntitySchemaUId] - колонка Uid объекта раздела (например, "UsrTest") в таблице SysSchema;

 

  • II Этап. Создать запись в таблице SysModuleEdit (страница редактирования "Page"):

SysModuleEdit

insert into SysModuleEdit (SysModuleEntityId

,UseModuleDetails

,CardSchemaUId

,ActionKindCaption

,ActionKindName

,PageCaption)

values ('8ED522AF-00E1-4595-AC13-643944B005B7'

,1

,'8B22D9BE-4BBC-4B50-80EA-AB6FBB604B7E'

,'Добавить'

,'UsrTest1Page'

,'Card schema: "Test"')

где  [SysModuleEntityId] - колонка Id записи таблицы SysModuleEntity из первого этапа (проверка Select Id from SysModuleEntity Where SysEntitySchemaUId='AF6DD4AD-1398-4FCE-8837-78DC65AE0F9E')

[CardSchemaUId]  - колонка Uid страницы редактирования объекта (например, "UsrTest1Page") в таблице SysSchema (проверка Select Uid,Name from SysSchema where name like '%UsrTest%'). Нам необходима схема, которая называется "Название объекта + 1Page"

[ActionKindCaption] - Название кнопки в реестре раздела;

[ActionKindName] - Название схемы страницы редактирования;

[PageCaption] - Заголовок схемы страницы редактирования в таблице SysSchema (проверка Select Uid,Name,Caption from SysSchema where name like '%UsrTest1Page%')

  • III Этап. Создать запись в таблице SysModule (страница раздела "Section"):

SysModule

insert into SysModule (Caption

,SysModuleEntityId

,FolderModeId

,GlobalSearchAvailable

,Code

,SectionModuleSchemaUId

,SectionSchemaUId

,Image32Id) values (N'Test'

,'8ED522AF-00E1-4595-AC13-643944B005B7'

,'B659D704-3955-E011-981F-00155D043204'

,1

,'UsrTest'

,'DF58589E-26A6-44D1-B8D4-EDF1734D02B4'

,'B3D153C0-92EF-4A53-B868-9395C3E43516'

,'026742D9-390C-4778-BC46-9FA85C42677A')

где  [Caption] - Название раздела (можно брать caption объекта раздела - 

[SysModuleEntityId]  - колонка Id записи таблицы SysModuleEntity из первого этапа (проверка Select Id from SysModuleEntity Where SysEntitySchemaUId='AF6DD4AD-1398-4FCE-8837-78DC65AE0F9E')

[Code] - Название объекта раздела;

[SectionModuleSchemaUId] - UId модуля SectionModuleV2 с помощью которой открывается схему раздела;

[SectionSchemaUId] - колонка Uid страницы раздела объекта (например, "UsrTest1Section") в таблице SysSchema (проверка Select Uid,Name,Caption from SysSchema where name like '%UsrTest%'). Нам необходима схема, которая называется "Название объекта + 1Section"

 

Роман Казекин,

У меня уже была точно такая же ситуация из-за этого приложения. Решилось только удалением. Ответ от команды разработки - пока несовместимо с версией 7.18. К тому же здесь пытаются редактировать базовый объект - обращения. Но в то же время соглашусь с вами. Есть еще вариант что сделана кастомизация как минимум в двух пакетах. А настройка CurrentPackage стоит на пакете который ниже по иерархии, т.е. не видит всех изменений. Такое у меня было когда я пытался редактировать страницу с полями, настроенными с приложением Single file control for Creatio. Решается просто указанием правильного пакета в настройке.

 

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