Снять ограничение на доступ к чтению в одной детали

Есть задача- убрать контроль доступа на чтение на записи отображаемые в детали История раздела Контрагента. Но сохранить контроль доступа при попытку перейти к записи по действию Перейти к '.....' в контекстном меню.
Это требуется для того, чтоб пользователи у которых есть доступ на чтение к Разделам, но нет прав на чтение конкретной записи могли видеть, когда и кто общался с этим клиентом и т.д. Но не могли просмотреть эту информацию более детально.

Нравится

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

Реализовать подобное возможно, например, одним из двух следующих вариантов:

а) создать хранимую процедуру, которая будет возвращать полную историю по контрагенту, дать пользователю доступ на её выполнение, создать запрос, который будет содержать результат выполнения процедуры (подробнее здесь), и этот запрос использовать в детали;

б) взять текст запроса из предпросмотра sq_AccountHistory, создать представление, используя этот текст, раздать пользователю на него доступ, а перед открытием датасета ds_AccountHistory заменять текст его запроса на выборку из этого представления (например, SELECT ID, Name, CreatedOn, RecordType FROM vw_FullAccountHistory). При этом не забыть о фильтрации по AccountID.

Решил остановиться на втором варианте, а есть где в системе посмотреть реализацию подобного функционала?
Я так думаю, надо писать скрипт на событии OnDatasetAfterOpen, где менять текст запроса? Я так никогда не делал, можно пример.
Или просто сделать альтернативный сервис sq_AccountHictory с текстом запроса типа

SELECT ID, Name, CreatedOn, RecordType FROM vw_FullAccountHistory

и заменить в параметрах датасета "Запрос на выборку" с текущего запроса на альтернативный?

Да, можно сделать, как Вы предложили. Для этого Вам необходимо будет после создания представления создать сервис таблицы с названием vw_FullAccountHistory и добавить в него колонки из представления, не обновляя структуру базы данных (то есть, сам сервис сохранить, но на вопрос, обновить ли элемент в базе данных, ответить "Нет"). Только после этого Вы сможете создать SelectQuery с таким текстом (представление появится в списке таблиц).

В базовой версии подобных примеров нет.

"Лабьяк Олег Игоревич" написал:При этом не забыть о фильтрации по AccountID.

А как это сделать, я не могу понять :-(. В сервисе sq_FullAccountHistory есть параметр AccountID, а как его связать с ID записи из основного окна Раздела Контрагенты?

Можно вынести поле AccountID в представление vw_FullAccountHistory. А в запросе, который будете создавать на основе представления, создать фильтр по AccountID, а саму колонку в запросе не выбирать. При этом нужно учесть, что поле AccountID необходимо добавить в каждый UNION представления.

Спасибо большое за консультацию все получилось. Я сделал, как Вы рекомендовали -
1. Добавил колонку AccountID в Представление, соответственно добавив ее в основной запрос(формирующий Представление) и все union'ы для извлечения Контрагента из документов отображаемых на детали история.
2. Добавил ее в табличном сервисе vw_FullAccountHistory
3. В сервисе Query в разделе Where добавил фильтр, где и связал Параметр AccountID и колонку из сервиса vw_FullAccountHistory с таким же названием и все стало фильтроваться на детали.
Но можно еще один вопрос на последок в целях, так сказать дальнейшего самообразования. :-)
По умолчанию у меня когда я делал фильтр в секции Where В сервисе Query, он естественно был активен(был установлен флаг), а в исходном сервисе sq_AccountHistory все фильтры в основном запросе и union'ах были отключены... т.е. флаг был снят, но на детали все равно происходила фильтрация, вопрос почему?

Руслан, данный фильтр включается автоматически при обновлении детали. Это прописано в скрипте раздела (scr_AccountsWorkspace) при вызове функции RefreshAccountsHistoryDetail.

В данном конкретном случае не имеет особого значения, включен ли фильтр по умолчанию, или нет, но в общем случае лучше отключать все фильтры первого уровня в запросах разделов и деталей, чтобы избежать некорректного отображения информации. Конечно же, бывают исключения, например, когда нужно отображать в детали не все записи, а по некоторому условию (не отображать оплаченные счета и т.д.), в этих случаях либо оставляется включенным фильтр, либо перед открытием датасета его включают в скрипте.

Спасибо, за разъяснения.

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