Перейти к содержанию

Установка запретов или разрешений при создании или загрузке карточки

Установка запретов или разрешений при создании или загрузке карточки

Если необходимо установить запреты или разрешения на конкретные секции и поля карточки, то необходимо написать серверные расширения CardGetExtension (выполняется при открытии карточки) и CardNewExtension (выполняется при создании карточки), причём расширение должно выполняться в AfterRequest и только при условии, что карточка успешно создана (context.RequestIsSuccessful равен true). Такое расширение есть смысл отфильтровать по типу карточки при регистрации .WhenCardTypes(“ИмяМоегоТипаКарточки”).

Запреты и разрешения устанавливаются как флаги CardPermissionFlags, причём запреты Prohibit имеют больший приоритет, чем разрешения Allow на том же уровне вложенности. Например, если на поле строковой секции стоят флаги AllowModify и ProhibitModify, то поле будет запрещено редактировать. Если же на секции стоит флаг ProhibitModify, запрещающий редактирование всех полей секции, но на конкретном поле есть флагAllowModify, то все поля секции, кроме этого поля, будут запрещены для редактирования.

Пусть необходимо установить запрет на вставку строк в определённую коллекционную секцию MyTableSection. Этого можно добиться следующим образом:

if (context.RequestIsSuccessful) { CardSectionPermissionInfo permissions = context.Response.Card.Permissions.Sections.GetOrAdd("MyTableSection");

// если разрешения для этой секции устанавливаются впервые, то секция будет создана с типом Entry, т.е. как строковая секция // поскольку в карточке секция является коллекционной, то надо явно указать тип секции Table (для иерархической секции - аналогично) permissions.Type = CardSectionType.Table;

// устанавливаем запрет на вставку строк // даже если был установлено аналогичное разрешение, запрет имеет больший приоритет, // поэтому флаг разрешения AllowInsertRow можно не сбрасывать permissions.SectionPermissions |= CardPermissionFlags.ProhibitInsertRow; }

Если нужно установить полный запрет на редактирование всех секций, подпадающих под определённое условие (например, если имя секции начинается с префикса “TblPrefix”), то можно перечислить все секции в карточке, после чего создать и установить разрешения для этих секций, как показано в примере ниже. Следует учесть, что эти секции не относятся к карточкам файлов и заданий, “встроенных” в основную карточку.

// проверка context.RequestIsSuccessful опущена для краткости foreach (CardSection section in card.Sections.Values) { if (section.Name.StartsWith("TblPrefix")) { var permissions = card.Permissions.Sections.GetOrAdd(section.Name); permissions.Type = section.Type; permissions.SectionPermissions = section.Type == CardSectionType.Entry ? CardPermissionFlagValues.ProhibitAllEntry : CardPermissionFlagValues.ProhibitAllTable; } }

Если нужно установить полный запрет на редактирование карточки вместе с её файлами и заданиями, причём независимо от того, какие разрешения были установлены другими расширениями, то следует использовать следующий хэлпер:

CardHelper.ProhibitAllPermissions(card, removeOtherPermissions: true);

Back to top