Как на деталь "Подчиненные/родительские документы" добавить фрейм с файлами

Может кто подскажет.
Есть задача переделать деталь "Подчиненные/родительские документы", так чтобы в ней в отдельном фрейме отображались соответствующие документам прикрепленные файлы (прикрепленые черезь деталь Файлы). Т.е. деталь состоит из двух частей: слева грид докуметов, справа для выбранного документа отображается список файлов (как в детали Файлы).

Соответственно вопрос насчет реализации этого:
Т.е. нужно добавить на wnd_DocumentInDocumentGridArea новый фрейм, который будет содержать другие элементы для отображения нужной информации.
Проблема в том, что wnd_DocumentInDocumentGridArea унаследовано от wnd_BaseGridArea, а нужно переместить элемент grdData (унаследованный) в этот новый фрейм.

Нравится

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

Не меняйте внешний вид wnd_DocumentInDocumentGridArea. На родительском Page просто добавьте еще один WindowContainer и там уже реестр файлов. Реализация обновления - аналогично обновлению делали из основного реестра воркспейса.

"Глова Сергей" написал: Реализация обновления - аналогично обновлению делали из основного реестра воркспейса.

вывести на воркспейс датасет окна wnd_DocumentInDocumentGridArea, а на его событиях обновлять окно с файлами

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

Спасибо за рекомендации.
Будем попробуем так сделать.

Только сейчас дошли руки попробовать сделать. Для начала решил попробовать на детали Документы (показалось что проще чем Род/Подч документы) из раздела Продажи. Добавил контейнер с wnd_FilesDetail, для обновления данных попробовал использовать стандартную функцию RefreshFilesDetail где вместо параметра BaseWorkspace
указал OpportunitiesWorkspace.DocumentsWindow, но так не получилось т.к. внутри функции есть создание переменной
var Dataset = BaseWorkspace.GridDataset;
пришлось создать свой вариант этой функции изменив эту строку на
var Dataset = BaseWorkspace.ComponentsByName('dlData').Dataset;

Аналогично поступил с RefreshCommonDetail.

т.е. так в wnd_OpportunitiesWorkspaceScript

else if (pcDetails.ActivePage.Name == pgDocumentsDetail.Name) {
RefreshDocumentsDetail(); changedRefreshFilesDetail(OpportunitiesWorkspace.DocumentsWindow, wndFilesInDocumentDetail, 'DocumentID', 'tbl_FileInDocument', 'iq_FileInDocument');
}
Теперь окно Файлы отображается на детали Документы.

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

Подобно тому, как в окне любого раздела функция RefreshDetails вызывается при обработке событий даталинка OnDatasetAfterPositionChange, OnDatasetRefreshRecord, OnDatasetAfterPost, нужно поступать и здесь: обновлять реестр файлов при обработке событий dlDataOnDatasetAfterPositionChange, dlDataOnDatasetRefreshRecord и dlDataOnDatasetAfterPost, где dlData - даталинк детали wnd_DocumentInDocumentGridArea.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Примерно так и думал, но как добраться до этих событий?
(еще раз уточню я сейчас делаю это в разделе Продажи в детали Документы)
Через wnd_OpportunitiesWorkspace я до них добраться не могу.
Напрямую через wnd_DocumentsGridArea с обработкой событий в scr_DocumentsGridArea вроде не-то.

Судя по всему, именно там и нужно обрабатывать. Но при этом необходимо учитывать, что этот реестр используется и как основной реестр раздела "Документы". Поэтому можно ввести дополнительный атрибут, по которому будем идентифицировать местонахождение грида, и в зависимости от его значения (если мы находимся в детали раздела "Продажи") обновлять или не обновлять деталь "Файлы".

Также обратите внимание: в базовой версии обработка этих событий наследуется из wnd_BaseGridArea, поэтому в скрипте scr_DocumentsGridArea обработчики не объявлены. В Вашем случае необходимо их переопределить, например, так:

function dlDataOnDatasetRefreshRecord(Dataset, KeyValue, AddNewRecordOnPage) {
    scr_BaseGridArea.dlDataOnDatasetRefreshRecord(Dataset, KeyValue, AddNewRecordOnPage);
    ..... (Ваш код)
 
}

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Будет ли работать, если я использую стандартную функцию
RefreshFilesDetail ?

Т.е. пишу в scr_DocumentsGridArea:
function dlDataOnDatasetAfterPositionChange(Dataset) {
RefreshFilesDetail(BaseGridArea, wndFilesInDocumentDetail, 'DocumentID', 'tbl_FileInDocument', 'iq_FileInDocument');
}

И вопрос как получить wndFilesInDocumentDetail, чтобы подставить в эту функцию из этого места?

Да, работать будет. Но для этого необходимо подключить к скрипту scr_DocumentsGridArea скрипт scr_WorkspaceUtils.

Вместо wndFilesInDocumentDetail Вам необходимо подставить название WindowContainer'а, который содержит wnd_FilesDetail.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Получилось практически то что нужно.
wndParentDocFilesDetail получил как Self.ParentContainer.ParentWindow.ComponentsByName('wndParentDocFilesDetail');
Спасибо за помощь.
Осталось еще немного причесать эту конструкцию и можно пользоваться.

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