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

Добавление колонки в бизнес-объект

Разработчики типового решения «Банк и Касса» не предусмотрели поле «Наименование банка получателя» в бизнес-объекте платежное поручение. Конечно, увидеть наименование банка можно, открыв платежное поручение в диалоговом окне на редактирование, однако намного удобнее было бы иметь соответствующую колонку в окне просмотра списка документов.

 

Попробуем решить данную проблему средствами Гедымина. Обратите внимание, что все, указанные ниже действия, необходимо выполнять под учетной записью Администратор.

Прежде всего, следует определиться, откуда можно получить необходимую информацию. Платежные поручения хранятся в таблице USR$BN_PAYMENT. Просмотреть структуру данной таблицы можно, если последовательно перейти в Исследователе системы в раздел «Сервис», «Атрибуты» и выбрать команду «Таблицы». Найдем в верхнем списке позицию, соответствующую USR$BN_PAYMENT и установим на нее курсор. В нижней части окна можно просмотреть список полей выбранной таблицы.

Интересующее нас поле, ссылка на расчетный счет получателя денег, имеет наименование USR$BN_RECEIVERACCOUNT. Данное поле ссылается на таблицу GD_COMPANYACCOUNT. Последняя, в свою очередь, имеет поле BANKKEY — ссылку на таблицу GD_CONTACT, которая и содержит искомое наименование банка.

Итак, мы знаем, где находится нужная нам информация. Для ее извлечения необходимо изменить исходный запрос бизнес-объекта, подключив в секцию FROM две таблицы: GD_COMPANYACCOUNT и GD_CONTACT и добавив поле наименования банка в секцию SELECT.

Поскольку мы будем соединять таблицу GD_COMPANYACCOUNT с таблицей USR$BN_PAYMENT необходимо узнать, какой алиас имеет она в запросе. Для этого, находясь в списке платежных поручений, нажмем клавишу F10. На экране появится диалоговое окно «Мастер установок» таблицы. Нас интересует вкладка «Запрос».

Как видно на рисунке, таблица USR$BN_PAYMENT имеет псевдоним U. Закроем окно «Мастера установок».

Теперь внесем изменения в запрос бизнес-объекта. Для этого активизируем форму просмотра списка платежных поручений и переведем ее в режим дизайнера путем нажатия комбинации клавиш Ctrl+Alt+E. Отыщем на ней и выделим компонент gdcUserDocument.

Нажмем F11 для того, чтобы перейти в окно Инспектора объектов. Переключимся на вкладку События.

SQL запрос бизнес-объекта собирается из пяти частей: SELECT, FROM, WHERE, GROUP и ORDER. При формировании каждой из них вызывается соответствующее событие. Перекрыв событие можно изменить или даже целиком заменить текст соответствующей секции SQL запроса. В нашем случае мы будем обрабатывать события OnGetSelectClause и OnGetFromClause. Для ввода программного кода найдем событие в списке и нажмем кнопку «…» справа от него, как показано на следующем рисунке.

На экране откроется редактор скрипт-объектов с текстом обработчика события по-умолчанию. Внесем в него свои коррективы и сохраним с помощью команды меню «Скрипт»—«Сохранить».

Ниже приводится исходный код перекрытых обработчиков. Текст, выделенный жирным начертанием, был добавлен нами.

option explicit
sub gdcUserDocumentOnGetFromClause(ByVal Sender, ByRef Clause)
'*** Данный код необходим для вызова встроенного обработчика ***
'*** В случае его удаления возможно нарушение работы системы ***
Dim ParamArr(1)
Set ParamArr(0) = Sender
ParamArr(1) = Clause
call Inherited(Sender, "OnGetFromClause", ParamArr)
Clause.Value = ParamArr(1)
'*** конец кода поддержки встроенного обработчика ***

Clause.Value = Clause & _
" JOIN gd_companyaccount receiver_account ON" & _
" receiver_account.id = U.USR$BN_RECEIVERACCOUNT " & _
" JOIN gd_contact receiver_bank ON" & _
" receiver_bank.id = receiver_account.bankkey "

end sub

option explicit
sub gdcUserDocumentOnGetSelectClause(ByVal Sender, ByRef Clause)
'*** Данный код необходим для вызова встроенного обработчика ***
'*** В случае его удаления возможно нарушение работы системы ***
Dim ParamArr(1)
Set ParamArr(0) = Sender
ParamArr(1) = Clause
call Inherited(Sender, "OnGetSelectClause", ParamArr)
Clause.Value = ParamArr(1)
'*** конец кода поддержки встроенного обработчика ***

Clause.Value = Clause & _
",receiver_bank.name AS receiver_bank_name "

end sub

Как видно из листингов все достаточно просто. Мы добавили две таблицы в секцию FROM, связав их с таблицей платежных поручений, и одно поле в секцию SELECT.

Испытаем наше творение в действии. Для этого необходимо пересоздать окно со списком платежных поручений. Именно пересоздать, а не закрыть-открыть. Для этого нажмем клавишу Shift и, удерживая ее, щелкнем мышью по крестику в правом верхнем углу окна. Оно исчезнет не только с экрана, но и удалится из оперативной памяти компьютера. Теперь заново откроем его используя Исследователь системы . Если на экран не выдалось никаких сообщений об ошибках, то все было сделано правильно. Осталось сделать нашу новую колонку видимой в таблице. Нажимаем F10, переходим на вкладку «Колонки», находим наше поле в списке, выделяем его и устанавливаем флаг «Колонка отображается».

Закроем «Мастер установок». Теперь в таблице, для каждого платежного поручения отображается наименование банка клиента.

Но, если мы попробуем добавить новое платежное поручение в список, то получим сообщение об ошибке: "Нобходимо заполнить поле наименование!". Действительно, ведь мы добавили поле наименование банка, про которое Гедымин знает, что оно обязатльно для заполнения. Выйти из данного положения можно двумя способами: либо перед сохранением записи присваивать полю любое значение, либо после открытия набора данных снять с поля флаг "Обязательно для заполнения".

Воспользуемся вторым вариантом и определим для нашего датасета обработчик события AfterOpen.

option explicit
sub gdcUserDocumentAfterOpen(ByVal DataSet)
'*** Данный код необходим для вызова встроенного обработчика ***
'*** В случае его удаления возможно нарушение работы системы ***
call Inherited(DataSet, "AfterOpen", Array(DataSet))
'*** конец кода поддержки встроенного обработчика ***

DataSet.FieldByName("receiver_bank_name").Required = False
end sub

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