Добрый день!
В 7.7 появилась как воздух необходимая возможность выбирать в счетах в поле "Клиент" как записи из раздела "Контрагенты", так и из раздела "Контакты". Но вот, в договорах такой возможности нет.
Можно ли данный функционал по аналогии с Контактами реализовать и в Договорах? И если да, то в какую сторону копать, чтобы понять, как это реализовано?
Нравится
Добрый день, Николай! По структуре данных всё осталось как и раньше: в объекте находятся оба поля: и Контрагент, и Контакт. А вот на странице используется специальный контрол. Вся логика прописана в схеме страницы. Можете взять за пример счет или заказ и скопировать в любую нужную вам сущность.
Николай, необходимо сделать следующее:
- Добавить аттрибут Client с колонками Contact, Account (можно посмотреть в InvoicePageV2)
- В diff добавить поле Клиент и скрыть поля Account и Contact
- Настроить правила фильтрации (несколько полей в договорах вроде по Account фильтруются)
Еще раз спасибо за информацию - все получилось.
Но, столкнулся с одним нюансом. При выборе в поле Client записи из таблицы Contact, у которой в свою очередь проинициализировано поле Account, происходит заполнение поля Account в договоре, но согласно нашей бизнес-логике, такого не должно происходить.
Как я понимаю, это "дело рук" одного из унаследованных бизнес-правил. В связи с этим вопрос - как правильно отключать унаследованные бизнес-правила?
Пока вышел из ситуации переопределением данного бизнес-правила:
[javascript]
"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"
}
}
[/javascript]
Здравствуйте, Николай!
Вам необходимо заместить базовое правило его переопределением.
Хм... оказалось, не все так просто...
При вводе текста непосредственно в данное поле, происходит поиск по контрагентам и контактам - тут все ОК. Но, при попытке открыть окно выбора (при нажатии кнопки с лупой) на экране появляется пустое окно без контролов, а в консоле браузера наблюдается следующее сообщение об ошибке:
[code]
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
[/code]
Я так понимаю, где-то нужно указать правильный LookupPage. Вопрос - где?
Хм... оказалось, не все так просто...
При вводе текста непосредственно в данное поле, происходит поиск по контрагентам и контактам - тут все ОК. Но, при попытке открыть окно выбора (при нажатии кнопки с лупой) на экране появляется пустое окно без контролов, а в консоле браузера наблюдается следующее сообщение об ошибке:
[code]
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
[/code]
Я так понимаю, где-то нужно указать правильный LookupPage. Вопрос - где?
Проверил данный способ как на Документах, так и на Договорах. Опишу по пунктам действия:
1. Мастером раздела добавил любое существующее поле, что бы система создала замещающую схему страницы. Что не обязательно, если у вас уже есть в пользовательском пакете замещающая схема для страницы.
2. Убедился что в объекте есть колонки как "Контакт" так и "Контрагент".
3. Добавил зависимость на бизнес правила:
[javascript]
define('ContractPageV2', ['ContractPageV2Resources', 'GeneralDetails', "BusinessRuleModule"],
function(resources, GeneralDetails, BusinessRuleModule) {
[/javascript]
4. Добавил атрибут:
[javascript]
attributes: {
"Client": {
"caption": "TestClient",
"dataValueType": this.Terrasoft.DataValueType.LOOKUP,
"multiLookupColumns": ["Contact", "Account"],
"isRequired": false
}
},
[/javascript]
5. Вывел поле на форму:
[javascript]
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*/,
[/javascript]
6. Добавил правило:
[javascript]
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"
}
}
},
[/javascript]
7. В расчет не беру того факта что поле "Контрагент" по умолчанию обязательное к заполнению в договоре, но отключить это условие, не должно составить проблем, если то позволяет ваша бизнес логика.
Возможно причина ошибки в дополнительных действиях. Логика же добавления мультиполя верна.
Версия: 7.7.0.2161
Полный код схемы: https://jsfiddle.net/4x35pknd/
Причину ошибки удалось установить совместными усилиями с техподдержкой.
Дело оказалось в том, что пакете SalesContracts переопределен метод loadVocabulary, из-за этой подмены, карточка не открывалась. Нужно было вернуть методу исходный вид из карточки BasePageV2 и проблема ушла.
На всякий случай, вдруг кому-то еще пригодится, вот этот фрагмент кода:
[javascript]
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);
}
}
[/javascript]