AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.04.2018, 11:15   #1  
Natali77 is offline
Natali77
Участник
 
39 / 10 (1) +
Регистрация: 05.09.2016
Как ограничить доступ к редактированию полей на форме определенной группе пользователей
Добрый день.

Подскажите, пожалуйста, как ограничить доступ к редактированию полей на форме определенной группе пользователей.
Предистория - есть группа пользователей "Бухгалтерия" и группа пользователей "Закупка". Закупщики создают договоры, поставщиков и регистрируют заказ на покупку, счет на оплату.
У бухгалтеров на все это тоже есть полный доступ, в каких-то случаях они сами все это делают, + имеется куча других прав.
Теперь бухгалтеры хотят, чтобы Закупщики создавали Договоры, Поставщиков, но после сохранения не могли редактировать данные.
Доступ на редактирование должен быть только у бухгалтеров и у админов.

Делала так, но теперь у Закупщиков при создании договора данные поля не доступны совсем. Как еще это можно сделать, чтобы выполнялись требования бухгалтерии?

Делала на форме RContractTable метод init()

public void init()
{
Args args = this.args();

super();
if (args.parmEnumType() == enumnum(RcontractPartnerTypeAll))
{
contractType.selection(args.parmEnum());

}
contractType.visible(! this.args().dataset() && contractType.selection() == RcontractPartnerTypeAll::All);
this.updateDesign();


// -->
if(UserInfoHelp::userInUserGroup(curUserId(), 'Закупка' )&&!UserInfoHelp::userInUserGroup(curUserId(), 'Admin' )&&!UserInfoHelp::userInUserGroup(curUserId(), 'Бухгалтерия' ))
{
allowEdit = UserInfoHelp::userInUserGroup(curUserId(), 'Закупка');
RContractTable_SubContract.allowEdit(!allowedit);
RContractTable_ContractDate.allowEdit(!allowedit);
RContractTable_RContractNumber.allowEdit(!allowedit);
RContractTable_BusinessNum.allowEdit(!allowedit);
RContractTable_PrivateNum.allowEdit(!allowedit);
RContractTable_ContractAmount.allowEdit(!allowedit);
RContractTable_RContractStatus.allowEdit(!allowedit);
RContractTable_PostingProfile.allowEdit(!allowedit);
RContractTable_Sign_DeferredCharges.allowEdit(!allowedit);
RContractTable_MainContractAccount.allowEdit(!allowedit);
LongContract.allowEdit(!allowedit);


}

// <--

}


P.S. Перенесла тему из раздела Функционал. Советовали перекрыть метод active. Мне бы примеры. Спасибо.
Старый 11.04.2018, 11:18   #2  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2155 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Я бы начал с постановки задачи. Прям вот сразу как только сохранил - сразу ничего больше нельзя редактировать? Это не очень правильно и совсем не удобно. Если уж нужны разграничения, то нужно делать статусы и, например, документам и справочникам в статусе "в работе" действительно ограничивать доступ по группам.
__________________
Ivanhoe as is..
Старый 11.04.2018, 12:49   #3  
Natali77 is offline
Natali77
Участник
 
39 / 10 (1) +
Регистрация: 05.09.2016
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Я бы начал с постановки задачи. Прям вот сразу как только сохранил - сразу ничего больше нельзя редактировать? Это не очень правильно и совсем не удобно. Если уж нужны разграничения, то нужно делать статусы и, например, документам и справочникам в статусе "в работе" действительно ограничивать доступ по группам.
Дальнейшее редактирование должно оставаться возможным для группы пользователей "Бухгалтерия". Группа "Закупка" должна только создавать и сохранять.Статусов на форме нет, это справочник Поставщиков, договоров.
Старый 11.04.2018, 12:52   #4  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2155 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
В Аксапте нет явной кнопки "Сохранить" - непроизвольно для пользователя может произойти сохранение при переходе по гриду, вкладкам и т.п. (в связи со структурой таблиц и не только). И вы предлагаете сразу же не давать ничего поправить? Моментально помойкой станет справочник.
__________________
Ivanhoe as is..
Старый 11.04.2018, 16:07   #5  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Я бы посоветовал все-таки настроить безопасность для групп, чем вот так извращаться. Если у вас меняются функции персонала сейчас, то ничто не гарантирует стабильности в этом направлении завтра. Так что теперь, при смене регламента на предприятии каждый раз код переписывать?
__________________
// no comments
Старый 11.04.2018, 16:11   #6  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2155 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Судя по коду, это не AX 2012. Соответственно стандартно группы можно либо к доступу на форму привязать (а там создание - выше чем редактирование), либо к видимости данных по RLS (т.е. только спрятать после создания получится), поэтому по любому доработка.
__________________
Ivanhoe as is..
Старый 11.04.2018, 16:13   #7  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Судя по коду, это не AX 2012. Соответственно стандартно группы можно либо к доступу на форму привязать (а там создание - выше чем редактирование), либо к видимости данных по RLS (т.е. только спрятать после создания получится), поэтому по любому доработка.
RLS - это Record Level Security. Т.е. можно ограничивать доступ к определённым записям, но никак не к полям.
И делается это на уровне ядра, т.е. манипуляциями пользователя, программировать ничего не надо.
__________________
// no comments

Последний раз редактировалось dech; 11.04.2018 в 16:15.
Старый 11.04.2018, 16:28   #8  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2155 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Это вы к чему? Как RLS позволит решить задачу "одни создают", другие "редактируют"?
__________________
Ivanhoe as is..
Старый 12.04.2018, 07:39   #9  
Natali77 is offline
Natali77
Участник
 
39 / 10 (1) +
Регистрация: 05.09.2016
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
В Аксапте нет явной кнопки "Сохранить" - непроизвольно для пользователя может произойти сохранение при переходе по гриду, вкладкам и т.п. (в связи со структурой таблиц и не только). И вы предлагаете сразу же не давать ничего поправить? Моментально помойкой станет справочник.
поправлять будет группа пользователей "Бухгалтерия"

Цитата:
Сообщение от dech Посмотреть сообщение
Я бы посоветовал все-таки настроить безопасность для групп, чем вот так извращаться. Если у вас меняются функции персонала сейчас, то ничто не гарантирует стабильности в этом направлении завтра. Так что теперь, при смене регламента на предприятии каждый раз код переписывать?
Настройкой прав групп доступа не получается

Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Судя по коду, это не AX 2012. Соответственно стандартно группы можно либо к доступу на форму привязать (а там создание - выше чем редактирование), либо к видимости данных по RLS (т.е. только спрятать после создания получится), поэтому по любому доработка.
Вы правы, здесь AX 4.0
Старый 12.04.2018, 09:46   #10  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Это вы к чему? Как RLS позволит решить задачу "одни создают", другие "редактируют"?
Сокращу, пожалуй, ваше сообщение, но смысл не потерян:
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
группы можно ... привязать ... к видимости данных по RLS
Так вот это я к тому, что RLS в данном случае в принципе не подходит, человек создаст запись и тут же её потеряет.
__________________
// no comments
Старый 12.04.2018, 10:46   #11  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Natali77 Посмотреть сообщение
Настройкой прав групп доступа не получается
Да, согласен, пункт Create включает в себя Edit.
__________________
// no comments
Старый 12.04.2018, 10:52   #12  
potential is offline
potential
Участник
 
84 / 35 (2) +++
Регистрация: 13.04.2012
Адрес: Санкт-Петербург
Цитата:
Сообщение от Natali77 Посмотреть сообщение
Дальнейшее редактирование должно оставаться возможным для группы пользователей "Бухгалтерия". Группа "Закупка" должна только создавать и сохранять.Статусов на форме нет, это справочник Поставщиков, договоров.
Кто будет удалять созданные по ошибке договоры, бухгалтерия? Или в саппорт будет обращение? Добавить статусы более эфективно и понятно
Старый 12.04.2018, 12:39   #13  
Natali77 is offline
Natali77
Участник
 
39 / 10 (1) +
Регистрация: 05.09.2016
Цитата:
Сообщение от potential Посмотреть сообщение
Кто будет удалять созданные по ошибке договоры, бухгалтерия? Или в саппорт будет обращение? Добавить статусы более эфективно и понятно
Удалять будет бухгалтерия при необходимости. Это требование Бухгалтерии.
Старый 12.04.2018, 13:45   #14  
online
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Как и писал Иван, в той постановке как Вы написали задача не то, чтобы не решаема, но приведет к массе проблем и недоразумений под девизом: я не успел изменить, а оно уже сохранилось...

Если код не для примера и речь действительно идет о договорах, то в таблице договоров есть поле "Статус".

Если не было переделок, то, по умолчанию, при создании нового договора, это поле будет иметь значение RContractStatus::Passive = 0 - "Не оформлен". Вот ориентируясь на значение этого поля и можно делать предположения о том, находится ли запись в стадии "создания" или уже "создано"

Тогда примерный код будет выглядеть так

\Forms\RContractTable\Data Sources\RContractTable\Methods\active

X++:
public int active()
{
    boolean     isCheckGroup;

    int ret;

    ret = super();
    if (ret)
    {
        // Определение принадлежности к нужной группе можно вынести в init-формы
        isCheckGroup = UserInfoHelp::userInUserGroup(curUserId(), 'Закупка');

       if (isCheckGroup)
       {
              if (RContractTable.RContractStatus == RContractStatus::Passive)
              {
                     MyObject.AllowEdit(true);
              }
              else
              {
                     MyObject.AllowEdit(false);
              }
        }
    }
    return ret;
}
Здесь важное отличие от метода init() заключается в том, что переопределение доступности редактирования объекта на форме надо делать ВСЕГДА. Вне зависимости от того, что будет определено true или false, поскольку метод срабатывает при переходе на каждую новую запись.

Т.е. здесь нельзя использовать только if() без else. Обязательно надо как устанавливать, так и снимать блокировку. Если, конечно, пользователь относится к нужной группе.

Также следует рассмотреть вариант блокировки не объекта на форме, а напрямую поля в DataSource формы. Ведь, в общем случае, одно и то же поле DataSource может быть указано как источник данных разных объектов на форме. Ну, например, отображается объект в Grid на закладке "Обзор" и в группе полей на закладке "Разное"

Непосредственно в методе active это будет выглядеть так

X++:
this.object(fieldnum(RContractTable,RContractAccount)).allowEdit(true);
Если будет создан отдельный метод для установки/снятия блокировок, то вместо ключевого слова "this" надо будет написать "RContractTable_ds"
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 12.04.2018, 14:37   #15  
Natali77 is offline
Natali77
Участник
 
39 / 10 (1) +
Регистрация: 05.09.2016
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Как и писал Иван, в той постановке как Вы написали задача не то, чтобы не решаема, но приведет к массе проблем и недоразумений под девизом: я не успел изменить, а оно уже сохранилось...

Если код не для примера и речь действительно идет о договорах, то в таблице договоров есть поле "Статус".

Если не было переделок, то, по умолчанию, при создании нового договора, это поле будет иметь значение RContractStatus::Passive = 0 - "Не оформлен". Вот ориентируясь на значение этого поля и можно делать предположения о том, находится ли запись в стадии "создания" или уже "создано"

Тогда примерный код будет выглядеть так

\Forms\RContractTable\Data Sources\RContractTable\Methods\active

X++:
public int active()
{
    boolean     isCheckGroup;

    int ret;

    ret = super();
    if (ret)
    {
        // Определение принадлежности к нужной группе можно вынести в init-формы
        isCheckGroup = UserInfoHelp::userInUserGroup(curUserId(), 'Закупка');

       if (isCheckGroup)
       {
              if (RContractTable.RContractStatus == RContractStatus::Passive)
              {
                     MyObject.AllowEdit(true);
              }
              else
              {
                     MyObject.AllowEdit(false);
              }
        }
    }
    return ret;
}
Здесь важное отличие от метода init() заключается в том, что переопределение доступности редактирования объекта на форме надо делать ВСЕГДА. Вне зависимости от того, что будет определено true или false, поскольку метод срабатывает при переходе на каждую новую запись.

Т.е. здесь нельзя использовать только if() без else. Обязательно надо как устанавливать, так и снимать блокировку. Если, конечно, пользователь относится к нужной группе.

Также следует рассмотреть вариант блокировки не объекта на форме, а напрямую поля в DataSource формы. Ведь, в общем случае, одно и то же поле DataSource может быть указано как источник данных разных объектов на форме. Ну, например, отображается объект в Grid на закладке "Обзор" и в группе полей на закладке "Разное"

Непосредственно в методе active это будет выглядеть так

X++:
this.object(fieldnum(RContractTable,RContractAccount)).allowEdit(true);
Если будет создан отдельный метод для установки/снятия блокировок, то вместо ключевого слова "this" надо будет написать "RContractTable_ds"
Cпасибо за отклик и детальный ответ. Данное требование нужно применить не только к Договорам, но и к справочнику Поставщиков, Клиентов, Номенклатур, Аналитик.

Владимир, Вы правы, тут некоторые данные отображаются в Grid на закладке "Обзор" и в группе полей на закладке "Разное" и т.д.

Поэтому как лучше и верно будет это сделать?
Старый 12.04.2018, 19:23   #16  
online
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Natali77 Посмотреть сообщение
Владимир, Вы правы, тут некоторые данные отображаются в Grid на закладке "Обзор" и в группе полей на закладке "Разное" и т.д.

Поэтому как лучше и верно будет это сделать?
Если будет блокировано поле на уровне DataSource, то разрешение редактирования на уровне объекта формы будет проигнорировано. Таким образом у Вас есть выбор

- Запретить редактировать поле DataSourse - один объект
- Запретить редактировать все объекты формы, у которых в качестве источника данных указано поле этого DataSource - много объектов

Выбор зависит от конкретной постановки задачи и личных предпочтений программиста.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 17.04.2018, 08:44   #17  
Natali77 is offline
Natali77
Участник
 
39 / 10 (1) +
Регистрация: 05.09.2016
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Если будет блокировано поле на уровне DataSource, то разрешение редактирования на уровне объекта формы будет проигнорировано. Таким образом у Вас есть выбор

- Запретить редактировать поле DataSourse - один объект
- Запретить редактировать все объекты формы, у которых в качестве источника данных указано поле этого DataSource - много объектов

Выбор зависит от конкретной постановки задачи и личных предпочтений программиста.
Спасибо за ответ, будем пробовать.
Старый 17.04.2018, 10:46   #18  
astralsun is offline
astralsun
Участник
 
16 / 19 (1) ++
Регистрация: 17.04.2018
сделайте отдельный ключ безопасности, в active() проверяйте доступ к данному ключу и по нему определяйте возможность редактирования определенных полей

ключ безопасности можно дать группе "бухгалтерия"
впоследствии, если появятся сотрудники в других отделах (а они скорее всего появятся), которым необходимо будет дать доступ на редактирование этих полей, вы сможете вынести ключ в отдельную группу безопасности
Старый 17.04.2018, 12:53   #19  
Natali77 is offline
Natali77
Участник
 
39 / 10 (1) +
Регистрация: 05.09.2016
Цитата:
Сообщение от Natali77 Посмотреть сообщение
Спасибо за ответ, будем пробовать.
Что-то не работает (

Цитата:
Сообщение от astralsun Посмотреть сообщение
сделайте отдельный ключ безопасности, в active() проверяйте доступ к данному ключу и по нему определяйте возможность редактирования определенных полей

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

Как можно сделать ключ безопасности, не подскажете, может есть примеры?
Старый 17.04.2018, 13:23   #20  
astralsun is offline
astralsun
Участник
 
16 / 19 (1) ++
Регистрация: 17.04.2018
Цитата:
Сообщение от Natali77 Посмотреть сообщение
Как можно сделать ключ безопасности, не подскажете, может есть примеры?
AOT - DD - Security Keys
делаете новый ключ RcotractRestrictedFields

в active() прописываете
allowEdit = !(hassecuritykeyaccess(securitykeynum(RcotractRestrictedFields), AccessType::Edit) && RContractTable.RecId);

this.object(fieldnum(RContractTable,RContractAccount)).allowEdit(allowEdit);
и далее список ваших полей, к которым необходимо ограничить доступ
За это сообщение автора поблагодарили: S.Kuskov (5).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
В некоторых случаях не отображаются элементы дерева на форме Права групп пользователей McArrow DAX: Программирование 0 17.06.2013 18:30
DAX 2009 некорректный SPID в форме активных пользователей Logger DAX: Программирование 2 05.07.2010 17:19
Закрыть доступ к компаниям без создания домена и группы пользователей Рустем Гизатуллин DAX: Администрирование 3 04.12.2007 09:38
Перемещение полей на форме Swetik DAX: Функционал 12 15.09.2004 19:29
доступ к свойствам полей DataSource andreynikolai DAX: Программирование 2 06.06.2002 16:55
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:14.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.