Конфигурационный (редактируемый) реестр - фильтрация справочного поля

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

Версия 7.7.0.2325

Реализована пользовательская деталь с двумя справочными полями и редактируемым реестром.
Подскажите как можно реализовать фильтрацию одного справочного поля по значению другого.
С помощью BusinessRuleModule не получилось.

Нравится

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

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

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

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

Не срабатывают бизнес правила (делал по примеру из академии), попробовал добавить фильтрацию справочного поля по аналогии с примером из академии:

attributes: {
"UsrProductParamValue": {
	dataValueType: Terrasoft.DataValueType.LOOKUP,
	lookupListConfig: {
		filters: [
			function() {
				debugger
				var filterGroup = Ext.create("Terrasoft.FilterGroup");
 
				return filterGroup;
			}
		]
	}
}
}				

но при открытии поля, debugger не срабатывает, т.е. функция не вызывается и ошибок нет. Бизнес правило тоже не срабатывает, выводиться вся таблица.

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

"Щиголь Максим" написал:

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

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

Посмотрите эту тему, там подобную задачу решили.
http://www.community.terrasoft.ru/forum/topic/13684

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

Есть еще момент, на детали при повторном создание нового значения по полю UsrProductParamValue, через функционал быстрого создания(в поле вводиться значение и если его нет появляется "Создать ..."), возникает ошибка в функции SectionBundleModule.tryCreateEntityOrOpenCard
...
valuePairs.add(columnPath, {columnPath: columnPath, columnValue: columnValue});
Текст ошибки: Элемент с ключём "UsrProductParam" Уже существует.
Если обновить страницу и повторить действия то значение добавляется без ошибок, но если выбрать другую запись и попытаться добавить новое значение UsrProductParamValue, то возникает ошибка.

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

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

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

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

Подписаться на данное событие невозможно. Данная логика описана в миксине LookupQuickAddMixin. В данном случае событие можно поймать в методе onLookupChange. Привязка данного метода к лукапному полю происходит в модуле ViewGeneratorV2, от которого наследуется ConfigurationGridGenerator, который в свою очередь и строит грид детали. Вы можете создать свой генератор по аналогии с ConfigurationGridGenerator где и заместить данный метод, в котором бросать событие, используя sandbox. Так же можно напрямую заместить LookupQuickAddMixin, переопределив нужный метод.

Илья, подскажите что вы подразумевали под "Как вариант, Вы можете обновлять грид детали после каждого добавления записи в справочник."?
После сохранения записи обновляю деталь:

activeRowSaved: function(row, callback, scope) {
	scope = scope || this;
	callback = callback || this.Terrasoft.emptyFn;
	callback.call(scope);
	debugger;
	this.updateDetail({
		reloadAll: true
	});
}

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

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

Для замещения LookupQuickAddMixin, необходимо создать новый миксин, унаследовавшись от LookupQuickAddMixin. Примеров такого замещения достаточно в конфигурации, к примеру, CtiPanelCommunicationHistoryUtilities. Затем добавляете созданный миксин в нужное Вам место. Добившись вызова методов созданного миксина, достаточно будет установить дополнительную проверку перед вызовом строки valuePairs.add(columnPath, {columnPath: columnPath, columnValue: columnValue}); Данная строка и выдает ошибку.

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

Да, вы правильно поняли по поводу замещения миксинов. Как вариант, можете посмотреть в сторону ConfigurationGridGenerator и разобраться как он генерирует лукапы. Далее попробовать подменить методы. Данная задача будет не из простых. Так же посмотрите в сторону метода generateActiveRowControlsConfig из ConfigurationGridUtilites. Ошибка возникает после вызова строки:
BusinessRulesApplier.applyRules(rowClass, gridLayoutItems);

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