Добрый день!
В 7.7 появилась как воздух необходимая возможность выбирать в счетах в поле "Клиент" как записи из раздела "Контрагенты", так и из раздела "Контакты". Но вот, в договорах такой возможности нет.
Можно ли данный функционал по аналогии с Контактами реализовать и в Договорах? И если да, то в какую сторону копать, чтобы понять, как это реализовано?
Нравится
Добрый день, Николай! По структуре данных всё осталось как и раньше: в объекте находятся оба поля: и Контрагент, и Контакт. А вот на странице используется специальный контрол. Вся логика прописана в схеме страницы. Можете взять за пример счет или заказ и скопировать в любую нужную вам сущность.
Николай, необходимо сделать следующее:
- Добавить аттрибут Client с колонками Contact, Account (можно посмотреть в InvoicePageV2)
- В diff добавить поле Клиент и скрыть поля Account и Contact
- Настроить правила фильтрации (несколько полей в договорах вроде по Account фильтруются)
Еще раз спасибо за информацию - все получилось.
Но, столкнулся с одним нюансом. При выборе в поле Client записи из таблицы Contact, у которой в свою очередь проинициализировано поле Account, происходит заполнение поля Account в договоре, но согласно нашей бизнес-логике, такого не должно происходить.
Как я понимаю, это "дело рук" одного из унаследованных бизнес-правил. В связи с этим вопрос - как правильно отключать унаследованные бизнес-правила?
Пока вышел из ситуации переопределением данного бизнес-правила:
"Contact": { "FiltrationContactByAccount": { "ruleType": BusinessRuleModule.enums.RuleType.FILTRATION, "autocomplete": false, "autoClean": false, "baseAttributePatch": "Account", "comparisonType": this.Terrasoft.ComparisonType.EQUAL, "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE, "attribute": "Account" } }
Здравствуйте, Николай!
Вам необходимо заместить базовое правило его переопределением.
Хм... оказалось, не все так просто...
При вводе текста непосредственно в данное поле, происходит поиск по контрагентам и контактам - тут все ОК. Но, при попытке открыть окно выбора (при нажатии кнопки с лупой) на экране появляется пустое окно без контролов, а в консоле браузера наблюдается следующее сообщение об ошибке:
message: Cannot read property 'split' of undefined date: Tue Dec 15 2015 23:53:11 GMT+1000 (VLAT) moduleId: SectionModuleV2_ContractSectionV2_CardModuleV2_chain00000000-0000-0000-0000-000000000000_LookupPage moduleName: LookupPage
Я так понимаю, где-то нужно указать правильный LookupPage. Вопрос - где?
Хм... оказалось, не все так просто...
При вводе текста непосредственно в данное поле, происходит поиск по контрагентам и контактам - тут все ОК. Но, при попытке открыть окно выбора (при нажатии кнопки с лупой) на экране появляется пустое окно без контролов, а в консоле браузера наблюдается следующее сообщение об ошибке:
message: Cannot read property 'split' of undefined date: Tue Dec 15 2015 23:53:11 GMT+1000 (VLAT) moduleId: SectionModuleV2_ContractSectionV2_CardModuleV2_chain00000000-0000-0000-0000-000000000000_LookupPage moduleName: LookupPage
Я так понимаю, где-то нужно указать правильный LookupPage. Вопрос - где?
Проверил данный способ как на Документах, так и на Договорах. Опишу по пунктам действия:
1. Мастером раздела добавил любое существующее поле, что бы система создала замещающую схему страницы. Что не обязательно, если у вас уже есть в пользовательском пакете замещающая схема для страницы.
2. Убедился что в объекте есть колонки как "Контакт" так и "Контрагент".
3. Добавил зависимость на бизнес правила:
define('ContractPageV2', ['ContractPageV2Resources', 'GeneralDetails', "BusinessRuleModule"], function(resources, GeneralDetails, BusinessRuleModule) {
4. Добавил атрибут:
attributes: { "Client": { "caption": "TestClient", "dataValueType": this.Terrasoft.DataValueType.LOOKUP, "multiLookupColumns": ["Contact", "Account"], "isRequired": false } },
5. Вывел поле на форму:
diff: /**SCHEMA_DIFF*/[ { "operation": "insert", "parentName": "Header", "propertyName": "items", "name": "Client", "values": { "layout": {"column": 0, "row": 3, "colSpan": 12}, "controlConfig": { "enableLeftIcon": true, "leftIconConfig": {"bindTo": "getMultiLookupIconConfig"} } } } ]/**SCHEMA_DIFF*/,
6. Добавил правило:
rules: { "Contact": { "FiltrationContactByAccount": { "ruleType": BusinessRuleModule.enums.RuleType.FILTRATION, "autocomplete": false, "autoClean": false, "baseAttributePatch": "Account", "comparisonType": this.Terrasoft.ComparisonType.EQUAL, "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE, "attribute": "Account" } } },
7. В расчет не беру того факта что поле "Контрагент" по умолчанию обязательное к заполнению в договоре, но отключить это условие, не должно составить проблем, если то позволяет ваша бизнес логика.
Возможно причина ошибки в дополнительных действиях. Логика же добавления мультиполя верна.
Версия: 7.7.0.2161
Полный код схемы: https://jsfiddle.net/4x35pknd/
Причину ошибки удалось установить совместными усилиями с техподдержкой.
Дело оказалось в том, что пакете SalesContracts переопределен метод loadVocabulary, из-за этой подмены, карточка не открывалась. Нужно было вернуть методу исходный вид из карточки BasePageV2 и проблема ушла.
На всякий случай, вдруг кому-то еще пригодится, вот этот фрагмент кода:
methods: { loadVocabulary: function(args, columnName) { var multiLookupColumns = this.getMultiLookupColumns(columnName); var config = (Ext.isEmpty(multiLookupColumns)) ? this.getLookupPageConfig(args, columnName) : this.getMultiLookupPageConfig(args, columnName); this.openLookup(config, this.onLookupResult, this); } }