Учимся редактировать записи детали раздела из карточки редактирования записи раздела
Полезным оказался нескольким пользователям функционал радеатирования записи детали по, скажем, контрагенту, из его карточки редактирования. Реализация не сложная, много времни не заберет ;)
Покажу на примере карточки контрагента, и Детали[Платежные реквизиты].
Предположим, в карточке контрагента нужно иметь выбрать одну из записей датели с платежными реквизитами.
Начнем с сервисов раздела контрагенты:
- Запускаем Terrasoft Administrator, неходим и открываем в нем сервис Accounts\General\Main Grid\tbl_Account
- Добавляем в него новое поле типа GUID, AccountINNID
- Добавляем связь по вторичному ключу для этого поля (Relation)
Сохраняем сервис tbl_Account с обновлением структуры таблицы в БД. - Находим и открываем сервис Accounts\General\Main Grid\sq_Account, добавьте в него выборку поля AccountINNID
- После того как в выборку будет добавленно поле AccountINNID в Select, привязываем к ней через Join таблицу tbl_AccountBillingInfo
Настраиваем привязку по полям tbl_AccountBillingInfo.ID = tbl_Account.AccountINNID
- Затем добавляем в Select выборку поля INN из таблицы tbl_AccountBillingInfo и задаем ему псевдоним (Alias) = AccountINN
- Теперь можно добавить поле AccountINNID справочного типа LookupDataField в Датасет Accounts\General\Main Grid\ds_Account, связав его с датасетом ds_AccountBillingInfo, и указав поле для отображения AccountINN
- Открываем сервис карточки редактирования контрагента, wnd_AccountEdit, добавьте в него поле типа LookupDataControl связав его с полем AccountINNID датасета
- Для этого же поля, перейдя на закладку События задаем обработчик события OnPrepareSelectWindow:
В тело обработчика вставляем код:
function edtAccountINNOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
var LookupDataset = LookupDataControl.DataField.LookupDataset;
ApplyDatasetFilter(LookupDataset, 'AccountID', dlData.Dataset('ID'), true);
SelectWindow.Attributes('DisplayFieldNames') = 'Name;INN';
SelectWindow.Attributes('SearchFieldNames') = 'INN';
SelectWindow.Attributes('KeyFieldName') = 'ID';
SelectWindow.Attributes('KeyValue') = null;
SelectWindow.Attributes('SearchFieldName') = 'INN';
var DefaultValues = GetNewDictionary();
DefaultValues.Add('AccountID', dlData.Dataset('ID'));
DefaultValues.Add('INN', null);
SelectWindow.Attributes('DefaultValues') = DefaultValues;
LookupDataset.Attributes('EditWindowUSI') = 'wnd_AccountBillingInfoEdit';
} - При необходимости вывести поле Account INN в реестр контрагентов, включите его в сервисе wnd_AccountGridArea
После того как все вышеописанное будет проделано, сохранено и перезагружено клиентское приложение, в карточке контрагента, появится lookup контрол, позволяющий выбирать, устанавливать, управлять платежными реквизитами контрагента прямо из его карточки редактирования.
В случае необходимости сделать поле INN обязательным для всех типов реквизитов, отвяжите его в настройках пользовательских полей от всех типов записей:
Файл :: Настройки :: Пользовательские поля:
И добавьте его вручную на форму редактирования платежных реквизитов в сервисе Accounts\Details\Billing Information\wnd_AccountBillingInfoEdit как строковое.