Показать сообщение отдельно
Старый 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 на закладке "Обзор" и в группе полей на закладке "Разное" и т.д.

Поэтому как лучше и верно будет это сделать?