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

Сделали действие в меню, обрабатывающее выбор нескольких записей в разделе, всё по образцу из академии: https://academy.terrasoft.ru/documents/technic-sdk/7-12/obrabotka-vybor…

Проблема в том, что если выделить всё, то в любом случае добавленный пункт оказывается заблокированным ("Групповое действие")

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

В чём дело? Существует ли решение?

Нравится

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

Добавь "IsEnabledForSelectedAll": true    и верни проверку на доступность, те что хотя бы одна запись была выделена или выбрана. Вот что получилось в итоге:

isCustomActionEnabled: function() {
	var activeRowId = this.get("ActiveRow");
	if (activeRowId) return true;
	var selectedRows = this.get("SelectedRows") || [];                
	return selectedRows.length > 0;
},
getSectionActions: function () {
	var actionMenuItems = this.callParent(arguments);
	actionMenuItems.addItem(this.getButtonMenuItem({
		Type: "Terrasoft.MenuSeparator",
		Caption: ""
	}));
	actionMenuItems.addItem(this.getButtonMenuItem({
            "Caption": {bindTo: "Resources.Strings.GetServiceInfoButtonCaption"},
            "Click": {bindTo: "onGetServiceInfoClick"},
            "Enabled": {bindTo: "isCustomActionEnabled"},
            "IsEnabledForSelectedAll": true	
	}));
	return actionMenuItems;
},

Работает и при множественном выделении если хотябы ода запись отмечена или выбрана

Попробуй для проверки что хоть одна запись отмечена использовать isAnySelected

actionMenuItems.addItem(this.getButtonMenuItem({
	"Click": {"bindTo": "openShowOnMap"},
	"Caption": {"bindTo": "Resources.Strings.ShowOnMapActionCaption"},
	"Enabled": {"bindTo": "isAnySelected"}
		}));

 

Я вообще убирал какие-либо условия для Enabled, и всё равно блокируется.

Что ещё интересно, блокировка происходит только после того, как я выделю через пукнт "Выбрать всё" в Действиях. Если просто подключу множественный выбор и по одной выберу все записи - то всё ок.

Добавь "IsEnabledForSelectedAll": true    и верни проверку на доступность, те что хотя бы одна запись была выделена или выбрана. Вот что получилось в итоге:

isCustomActionEnabled: function() {
	var activeRowId = this.get("ActiveRow");
	if (activeRowId) return true;
	var selectedRows = this.get("SelectedRows") || [];                
	return selectedRows.length > 0;
},
getSectionActions: function () {
	var actionMenuItems = this.callParent(arguments);
	actionMenuItems.addItem(this.getButtonMenuItem({
		Type: "Terrasoft.MenuSeparator",
		Caption: ""
	}));
	actionMenuItems.addItem(this.getButtonMenuItem({
            "Caption": {bindTo: "Resources.Strings.GetServiceInfoButtonCaption"},
            "Click": {bindTo: "onGetServiceInfoClick"},
            "Enabled": {bindTo: "isCustomActionEnabled"},
            "IsEnabledForSelectedAll": true	
	}));
	return actionMenuItems;
},

Работает и при множественном выделении если хотябы ода запись отмечена или выбрана

Денис,

я тоже сталкивалась с аналогичной проблемой.

Заметила для базового действия "Merge records".

Уточнила у службы поддержки не является ли это ошибкой, на что был получен ответ: "Это корректное поведение базового функционала.

Таким образом система предотвращает объединение всех записей и защищает пользователя от совершения ошибки, но если необходимо выделить диапазон записей, то Вы можете воспользоваться клавишей shift. 

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

Мое мнение, что это совсем неочевидно (про shift).

Озвучила им, что функционал нужно переделать и пункт меню 'Merge records' должен быть доступен при 'Select all', так как вариант с shift более трудозатратный и требует дополнительных действий со стороны пользователя. Сказали, что информацию передадут соответствующей команде разработки.

В общем выделяйте пока shift и будет Вам счастье wink

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

 

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

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

Можно ли получить по названию объекта название его страницы редактирования (или массив названий, если страниц несколько)?

Ну т.е. например есть объект Contact, у него страница ContactPageV2

есть объект Case и страница CasePage

и т.д. для других объектов.

Нужно для правильной генерации ссылок.

Нравится

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

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

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

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

Нравится

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

require объекта можно сделать. Прилетит его полное описание.

Ну или в this.entitySchema в карточке/разделе посмотреть.

Значение - Entity.PrimaryDisplayColumnValue в С#

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

А через JS как-нибудь можно?

require объекта можно сделать. Прилетит его полное описание.

Ну или в this.entitySchema в карточке/разделе посмотреть.

См. последний пример тут.

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

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



В примере академии есть описание действия по реализации этого: https://academy.terrasoft.ru/documents/technic-sdk/7-12/mnozhestvennoe-…;



Но я не до конца понимаю концовку:

            getMultiSelectLookupConfig: function() {
                return {
                    // Корневая схема — [Продажа].
                    rootEntitySchemaName: "Opportunity",
                    // Колонка корневой схемы.
                    rootColumnName: "Opportunity",
                    // Связанная схема — [Контакт].
                    relatedEntitySchemaName: "Contact",
                    // Колонка связанной схемы.
                    relatedColumnName: "Contact"

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

relatedEntitySchemaName: "Мой справочник", - это, я так понимаю, как раз то, что будет показываться при добавлении



А что указывать в других строчках, если моя деталь находится на странице обращения и создана мною вручную? 

Нравится

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

Добрый день!

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

пример объекта:

 

 

А это пример детали:

define("UsrSchema6Detail", ["LookupMultiAddMixin"], function() {
	return {
		entitySchemaName: "UsrRecipientsPetitionsOrg",// схема детали будет состоятьиз двух полей справочного типа
		mixins: {
			// Подключение миксина к схеме.
			LookupMultiAddMixin: "Terrasoft.LookupMultiAddMixin"
		},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		 methods: {
			// Переопределение базового метода инициализации схемы.
			init: function() {
				this.callParent(arguments);
				//Инициализация миксина.
				this.mixins.LookupMultiAddMixin.init.call(this);
			},
			// Переопределение базового метода отображения кнопки добавления.
			getAddRecordButtonVisible: function() {
				//Отображать кнопку добавления если деталь развернута, даже если для детали не реализована страница редактирования.
				return this.getToolsVisible();
			},
			// Переопределение базового метода.
			// Обработчик события сохранения страницы редактирования детали.
			onCardSaved: function() {
				// Открывает справочное окно с множественным выбором записей.
				this.openLookupWithMultiSelect();
			},
			// Переопределение базового метода добавления записи на деталь.
			addRecord: function() {
				// Открывает справочное окно с множественным выбором записей.
				this.openLookupWithMultiSelect(true);
			},
 
			// Метод, возвращающий конфигурационный объект для справочного окна.
			getMultiSelectLookupConfig: function() {
					return {
					// Корневая схема — [Петиции]. объект к которому будет относиться деталь
					rootEntitySchemaName: "UsrPetitions",
					// Колонка корневой схемы. колонка в схеме детали (*) справочное поле
					rootColumnName: "UsrPetition",
					// Связанная схема — [Средство связи контрагента]. объект из которого будут выбираться значения
					relatedEntitySchemaName: "AccountCommunication",
					// Колонка связанной схемы. Данная колонка так же объявлена в схеме детали (*) справочное поле 
					relatedColumnName: "UsrEmailFromAccountCom"
				};
 
			},
			getLookupColumns: function() {
				return ["SearchNumber","Account","CommunicationType","Number"]
				},
 
			getLookupConfig: function() {
					return {
						entitySchemaName: this.getRelatedSchemaName(),
						multiSelect: true,
						columns: this.getLookupColumns()
					};
				},
 
			getAllLookupFilters: function(notExistingFilter) {
					var filters = this.Terrasoft.createFilterGroup();
					var additionalFilters = this.getAdditionalLookupFilters();
					if (!this.Ext.isEmpty(notExistingFilter)) {
						filters.add("NotExistsFilter", notExistingFilter);
					}
					if (!this.Ext.isEmpty(additionalFilters)) {
						filters.add("AdditionalFilters", additionalFilters);
					}
					//добавление фильтра на тип = Email
					var idList = ["ee1c85c3-cfcb-df11-9b2A-001d60e938c6", "EE1C85C3-CFCB-DF11-9B2A-001D60E938C6"];
					var filterById = Terrasoft.createColumnInFilterWithParameters("CommunicationType", idList);
					filterById.comparisonType = Terrasoft.ComparisonType.EQUAL;
					filters.add("filterById", filterById);
					return filters;
			}
		}
	};
});

 

Добрый день!

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

пример объекта:

 

 

А это пример детали:

define("UsrSchema6Detail", ["LookupMultiAddMixin"], function() {
	return {
		entitySchemaName: "UsrRecipientsPetitionsOrg",// схема детали будет состоятьиз двух полей справочного типа
		mixins: {
			// Подключение миксина к схеме.
			LookupMultiAddMixin: "Terrasoft.LookupMultiAddMixin"
		},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		 methods: {
			// Переопределение базового метода инициализации схемы.
			init: function() {
				this.callParent(arguments);
				//Инициализация миксина.
				this.mixins.LookupMultiAddMixin.init.call(this);
			},
			// Переопределение базового метода отображения кнопки добавления.
			getAddRecordButtonVisible: function() {
				//Отображать кнопку добавления если деталь развернута, даже если для детали не реализована страница редактирования.
				return this.getToolsVisible();
			},
			// Переопределение базового метода.
			// Обработчик события сохранения страницы редактирования детали.
			onCardSaved: function() {
				// Открывает справочное окно с множественным выбором записей.
				this.openLookupWithMultiSelect();
			},
			// Переопределение базового метода добавления записи на деталь.
			addRecord: function() {
				// Открывает справочное окно с множественным выбором записей.
				this.openLookupWithMultiSelect(true);
			},
 
			// Метод, возвращающий конфигурационный объект для справочного окна.
			getMultiSelectLookupConfig: function() {
					return {
					// Корневая схема — [Петиции]. объект к которому будет относиться деталь
					rootEntitySchemaName: "UsrPetitions",
					// Колонка корневой схемы. колонка в схеме детали (*) справочное поле
					rootColumnName: "UsrPetition",
					// Связанная схема — [Средство связи контрагента]. объект из которого будут выбираться значения
					relatedEntitySchemaName: "AccountCommunication",
					// Колонка связанной схемы. Данная колонка так же объявлена в схеме детали (*) справочное поле 
					relatedColumnName: "UsrEmailFromAccountCom"
				};
 
			},
			getLookupColumns: function() {
				return ["SearchNumber","Account","CommunicationType","Number"]
				},
 
			getLookupConfig: function() {
					return {
						entitySchemaName: this.getRelatedSchemaName(),
						multiSelect: true,
						columns: this.getLookupColumns()
					};
				},
 
			getAllLookupFilters: function(notExistingFilter) {
					var filters = this.Terrasoft.createFilterGroup();
					var additionalFilters = this.getAdditionalLookupFilters();
					if (!this.Ext.isEmpty(notExistingFilter)) {
						filters.add("NotExistsFilter", notExistingFilter);
					}
					if (!this.Ext.isEmpty(additionalFilters)) {
						filters.add("AdditionalFilters", additionalFilters);
					}
					//добавление фильтра на тип = Email
					var idList = ["ee1c85c3-cfcb-df11-9b2A-001d60e938c6", "EE1C85C3-CFCB-DF11-9B2A-001D60E938C6"];
					var filterById = Terrasoft.createColumnInFilterWithParameters("CommunicationType", idList);
					filterById.comparisonType = Terrasoft.ComparisonType.EQUAL;
					filters.add("filterById", filterById);
					return filters;
			}
		}
	};
});

 

Спасибо большое, как раз помогло разобраться :3

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

Вот пример кода:

define("UsrSchema6830a0c2Detail", ["LookupMultiAddMixin"], function() {
	return {
		entitySchemaName: "UsrDetailLinkServiceBR",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		mixins: {
            // Подключение миксина к схеме.
            LookupMultiAddMixin: "Terrasoft.LookupMultiAddMixin"
        },
		methods: {
            // Переопределение базового метода инициализации схемы.
            init: function() {
                this.callParent(arguments);
                //Инициализация миксина.
                this.mixins.LookupMultiAddMixin.init.call(this);
            },
            // Переопределение базового метода отображения кнопки добавления.
            getAddRecordButtonVisible: function() {
                //Отображать кнопку добавления если деталь развернута, 
                //даже если для детали не реализована страница редактирования.
                return this.getToolsVisible();
            },
            // Переопределение базового метода.
            // Обработчик события сохранения страницы редактирования детали.
            onCardSaved: function() {
                // Открывает справочное окно с множественным выбором записей.
                this.openLookupWithMultiSelect();
            },
            // Переопределение базового метода добавления записи на деталь.
            addRecord: function() {
                // Открывает справочное окно с множественным выбором записей.
 
                this.openLookupWithMultiSelect(true);
            },
            // Метод, возвращающий конфигурационный объект для справочного окна.
            getMultiSelectLookupConfig: function() {
 
                return {
                    rootEntitySchemaName: "UsrBusinessRequestV2",
                    rootColumnName: "UsrLookupBR",
                    relatedEntitySchemaName: "ServiceItem",
                    relatedColumnName: "UsrLookupService"
                };
            }
		}
	};
});

 

Валентин, насколько я понимаю, тут происходит только настройка параметров, а вся логика отрабатывает в LookupMultiAddMixin. Для добавления дополнительных фильтров нужно создать функцию getAdditionalLookupFilters, которая должна возвращать набор фильтров, а стандартно в LookupMultiAddMixin пустая:

 /**
* Returns additional filters for lookup.
* @protected
* @return {Terrasoft.FilterGroup} Filters.
*/
getAdditionalLookupFilters: this.Terrasoft.emptyFn,

Аналогично тому, как в приведенном выше в теме коде определяют функцию getMultiSelectLookupConfig, которая в LookupMultiAddMixin тоже пустая.

 

Вот пример такой функции для определения фильтра с нужным Вам условием:

getAdditionalLookupFilters: function () {
 var additionalFilter = this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL,
"UsrBooleanBR",
true
);
 return additionalFilter;
 },

 

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

Спасибо огромное , фильтр сработал !

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

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

Нравится

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

Можно еще проще разблокировать настройку колонок в  детали файлы  и ссылки. Те перейти в списочное представление и добавить колонку дату создания и сохранить для всех пользователей. Пример как это сделать описан тут.

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

initQuerySorting: function(esq) {
	var createdOnColumn = esq.addColumn("CreatedOn");
	createdOnColumn.orderDirection = this.Terrasoft.OrderDirection.ASC;
},

 

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

Мне кажется проще заместить стандартную деталь ("FileDetailV2") и настроить нужное расположение колонок и сортировку.

Можно еще проще разблокировать настройку колонок в  детали файлы  и ссылки. Те перейти в списочное представление и добавить колонку дату создания и сохранить для всех пользователей. Пример как это сделать описан тут.

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

initQuerySorting: function(esq) {
	var createdOnColumn = esq.addColumn("CreatedOn");
	createdOnColumn.orderDirection = this.Terrasoft.OrderDirection.ASC;
},

 

Григорий Чех,

Cпасибо за помощь! 

Создал замещающую деталь и вывел натсройку колонок и заменил стандартную сортировку, чтобы сначала были новые файлы. 

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

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

Можно ли при загрузке передать в параметр детали ссылку на функцию?

details: /**SCHEMA_DETAILS*/{
				DataDetail: {
					schemaName: "BaseGridDetailV2",
					entitySchemaName: function(){return this.get("SysModuleCode")},
					filter: {
						masterColumn: "SysModuleId",
						detailColumn: "Id"
					},
					filterMethod: "DataDetailFilter"
				}
			}/**SCHEMA_DETAILS*/,

Такая конструкция не сработала. Возможна ли вообще реализация заявленной задачи?

Нравится

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

Насколько я знаю, нет. Но можно в качестве entitySchemaName использовать view.

Насколько я знаю, нет. Но можно в качестве entitySchemaName использовать view.

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

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

Добавил новый кейс в раздел[Лиды]. В реестре отображена колонка [Стадия лида].На ней также отображены индикаторы стадий в виде полосок(см.Скриншот). Как можно настроить эту индикацию для нового кейса?

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

Нравится

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

Насколько я знаю, то надо в справочнике "Стадия лида" выставить номер этой стадии, но там работают только значения от 0 до 5.

Насколько я знаю, то надо в справочнике "Стадия лида" выставить номер этой стадии, но там работают только значения от 0 до 5.

 

 

Alex Zaslavsky,

Спасибо!!

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

Добрый день, коллеги!

Как вы добиваетесь в английской версии bpm'online того, чтобы в фильтрах Week начинался не с воскресенья, а с понедельника?

Спасибо

Нравится

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

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

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

В данном случае можно было бы сразу предусмотреть возможность 'более гибкой' работы с этой функциональностью!  

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

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

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

В данном случае можно было бы сразу предусмотреть возможность 'более гибкой' работы с этой функциональностью!  

Да, некоторые вещи в системе непонятно почему захардкодены...

Уже в версии 7.12.3 получили какие-то изменения, но опять привязали Европу к американским стандартам :(



Елена Левцова,

К сожалению, функциональность еще не добавлена, сроки реализации пока неизвестны.

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

Добрый день, Подскажите пожалуйста как сделать страницу где можно настроить фильтры для отчета как на скриншотах ?

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

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

 

 

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

Нравится

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

Такие отчёты привязываются к разделу записями в SysModuleAnalyticsReport, где в полях указаны Id схемы отчёта и схемы его параметров. Для этого отчёта окно параметров задаётся в ContactAnniversariesReportFilter.

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

Спасибо, я разобрался и сделал такую же страницу в разделе котором мне нужно.

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

Если изменять значения полей таблицы в Web-service, то информация о изменении не попадает в Change log и невозможно потом в случае чего проверить, кто изменил данные.

Есть ли какая-то стандартная возможность, чтобы эти данные все-таки попадали в Change log?

Нравится

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

Алла набросал конфигурационный сервис если выполнять UpdateQuery логирование не работает, если менять через Entity все логируется.  На всякий случай уточняю имеется ввиду Конфигурация-> Журнал изменений)

Если речь об изменении данных внутри веб-сервиса, то не должно быть отличий от обычной серверной логики: если менять при помощи EntitySchemaQuery, то логируется, если через Insert и Update, то нет.

Каким сервисом меняются данные если вами разработанным то привидите код иначе название и пример вызова.

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

Не важно, как реализовано, логгирование не работает ни через EntitySchemaQuery, ни через Update.

Разница в реализации, если через EntitySchemaQuery, то срабатывает вызов процессов по сигналам, а через Update - нет.

Таким образом, вопрос по логгированию остается открытым. Как всё-таки это можно реализовать на уровне серверной логики?

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

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

А если изменять не в вэб сервисе изминения попадают в  Change log? Может проблемы с настройкой  Change log?!

Григорий Чех,

Chage log настроен корректно, если изменять с клиента, то изменения в Change log отображаются.

А у Вас работает такой кейс или это гипотетическое предположение?

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

Алла набросал конфигурационный сервис если выполнять UpdateQuery логирование не работает, если менять через Entity все логируется.  На всякий случай уточняю имеется ввиду Конфигурация-> Журнал изменений)

Григорий Чех,

Спасибо с этим уже разобралась.

Так а в чём дело было?

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

Ошибка. Действительно, через EntitySchemaQuery логгирование работает.

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