Это достаточно старая работа, которая позволяет ограничивать доступ на уровне записей в Аксапте 2.5. К сожалению, в 2.5 необходимо внести простейшую модификацию в каждую форму и отчет, где хочется включить фильтр. Ограничение доступа на уровне ядра реализовано только в Аксапте 3.0.

Проект mazyAccessRecord в AOTЗагрузить
Установка
Описание
Рекомендации по использованию
Известные проблемы

 

Загрузить

Axapta xpo-project mazAccessRecord.xpo (90Кб)

 

Установка

Новый пункт в меню АдминистрированиеОткройте AOT. Загрузите проект mazAccessRecord.xpo в Аксапту.

Примечание: Для загрузки проекта и включения фильтров вам необходима лицензия на средства разработки.

При первом импорте Аксапта проимпортирует все объекты из проекта и автоматически создаст описания для форм. Чтобы импортировать описания выполните импорт повторно.

Для того, чтобы пункт "Права доступа" появились в главном меню, перенесите menuitem AccessRecordList_maz в како-нибудь меню. Я рекомендую перенести пункт Administrator, в раздел Управление пользователями \ Права доступа.

Вы можете изменить описание пункта и поставить "Права доступа на уровне записей", если будет желание.

Очень полезно установить функциональные ключи на пункт меню и на таблицу. Я рекомендую устанавливать SYS_Security.

Примечание: Для того, чтобы не было проблем с установкой у тех, кто только начинает разбираться с Аксаптой, я вообще убрал конфигурационные ключи из проекта.

Для того, чтобы фильтры использовались в формах и отчетах, в их код необходимо добавить одну строку:

AccessRecordList_maz::updateQuery(this.query()); 

Строчку надо вставлять после вызова super-метода и после программного переопределения query формы или отчета. Обычно код надо добавить в самый конец init-метода последнего datasource формы или отчета.

Например, для того, чтобы форма клиентов использовала автоматическую фильтрацию надо добавить строку следующим образом:

Включить фильтрацию с правами доступа в форму со списком клиентов

Для формы, где используется несколько таблиц в качестве datasource, строчку лучше добавлять в конец init-метода последнего датасорса. Например, для формы с номенклатурой добавить строку надо так:

Включить фильтрацию с правами доступа в форму номенклатуры

 

Описание

Откройте форму AccessRightsList_maz. Обычно ссылку на эту форму создают в меню Администрирование \ Управление пользователями \ Права доступа.

Форма настройки прав доступа

Здесь необходимо указать фильтры для полей таблиц Аксапты. Указанные здесь фильтры будут автоматически добавлены при открытии форм и отчетов. Формат фильтров полностью совпадает с форматом строки поиска. См. совет Поиск в Аксапте.

Например, на скриншоте показано, что пользователи из группы тест получат не полный список клиентов, а только тех, у кого группа равна ПРЧ. А если пользователь, принадлежащий группе тест, откроет список номенклатуры, то получит только ОС, Прочие и услуги.

Примечание: обратите внимание, что пользователь может входить в несколько групп. В этом случае в качестве фильтра будет использоваться ИЛИ-объединение диапазонов от каждой группы.

Полный список клиентов
Полный список клиентов

Автоматически отфильтрованный список клиентов для пользователей группы Тест
Автоматически отфильтрованный список клиентов для пользователей группы Тест

Обратите внимание на поле Range у каждой строки в форме AccessRightsList_maz. Это поле может принимать значения Open, Locked, Hidden. Это поле позволяет определить, может ли пользователь видеть или изменить диапазон.

Если используется Open, то пользователь может видеть и изменить фильтр. Для нашей формы попробуйте изменять фильтр при помощи Ctrl+F3.

Если используется Locked, то пользователь может видеть, но не может изменить диапазон. Если же используется Hidden, то пользователь даже не увидит того, что в форме наложены дополнительные фильтры.

 

Рекомендации по использованию

Используйте положительные фильтры. Не используйте отрицания. Например, лучше использовать ОС, Прочее, Услуги, вместо !Основные. Дело в том, что если пользователь будет входить в несколько групп, то орицания становится чертовски сложно контролировать.

Постарайтесь не злоупотреблять фильтрами со звездочками. Например, фильтр "Основные, ОС" намного лучше, чем фильтр "О*". И дело не только в том, что вы можете получить неожиданный результат когда добавится новая группа начинающаяся на букву О. Дело в том, что в первом случае SQL может использовать индекс для поиска, а во втором случае индекс скорее всего использоваться не будет.

Ни в коем случае не используйте фильтры, которые начинаются со *. Например, недопустимо использовать фильтр "*О*". В этом случае для поиска гарантировано будет использоваться TableScan.

Тщательно тестируйте и отслеживайте производительность системы при создании фильтров. Фильтры могут существенно снизить скорость работы за счет того, что SQL может решить не использовать индексы для заданного фильтра.

Постарайтесь управлять доступом на уровне групп, а не на уровне пользователей. Так вам будет проще контрлировать права.

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

 

Известные проблемы

В 2.5 нельзя простыми средствами полноценно ограничить права доступа. Данный проект не исключение.

Например, вы ограничили доступ в списку номенклатуры и включили фильтр "ОС, Прочие, Услуги". Дело в том, что пользователь стандартными средствами может добавить новый фильтр "*". В результате он сможет снять фильтр.

Или предположим, вы закрыли в списке склад ХитроСпрятанный, задав условие "!ХитроСпрятанный". Пользователь может ввести свой фильтр "*". В этом случае фильтры наложатся с условием ИЛИ, тпользователь сможет увидеть список всех складов.

Чтобы решить проблему с дополнительным фильтром нужны дополнительные усилия... или переход на Аксапту 3.0. В Аксапте 3.0 ограничение на уровне записей действует на ядра. В Аксапте 3.0 пользователь не может получить доступ к отфильтрованным записям добавляя свои фильтры.

 

Есть еще одна хитрость. Например, в складских проводках пользователь может не пользоваться выпадающим списком и просто ввести с клавиатуры название склада "ХитроСпрятанный". Стандартная Аксапта будет считать это значение вполне допустимым, поскольку фильтр наложен на основную таблицу, а не на список проводок. Для того, чтобы ограничить и такое использование надо продумывать систему фильтров и на проводки... или чуть модифицировать метод validateField, делать его более интелектуальным.

 

Буду рад ответить на ваши замечания и предложения.
Мазуркин Сергей
mazzy@mazzy.ru