Показать сообщение отдельно
Старый 12.04.2018, 13:45   #14  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
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"
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...