Вычисление разрешений доступа для периодических регистров сведений
Периодические регистры сведений в силу своего внутреннего устройства требуют разной логики при установке прав Чтение и Изменение. Поэтому, в отличие от других видов элементов проекта (и в отличие от непериодических регистров сведений), для вычисления разрешений на отдельные записи (RLS) они используют не одно событие ВычислитьРазрешенияДоступаДляОбъектов
, а два события, каждое для своего права:
ВычислитьКлючиДоступаДляЧтения
,ВычислитьКлючиДоступаДляИзменения
.
«1С:Шина» создает разрешения автоматически, а от вас требуется только сформировать в обработчике набор экземпляров ключей, которые надо записать в конкретное разрешение.
Событие «ВычислитьКлючиДоступаДляЧтения»
Особенность этого события заключается в том, что «Шина» создает разрешение доступа не для одной записи, а для всех записей регистра с одинаковыми значениями измерений, перечисленных в настройке РасчетИзмеренийПо. Для этого используется тип имя-регистра-сведений.КлючРазрешенийИзмерений
(подробнее).
Например, пусть задан периодический регистр сведений КурсыВалют:
ВидЭлемента: РегистрСведений
Ид: b54b10ce-603f-43bf-8067-9716c4986df5
Имя: КурсыВалют
ОбластьВидимости: ВПроекте
КонтрольДоступа:
Разрешения:
Чтение: РазрешенияВычисляютсяДляКаждогоОбъекта
Изменение: РазрешенияВычисляютсяДляКаждогоОбъекта
РасчетРазрешенийПо:
- Валюта
Периодичность: День
Измерения:
-
Ид: 9900df46-d5bd-4826-8969-2b5bda07893c
Имя: Валюта
Т ип: Строка|СправочникВалют.Ссылка|?
МаксимальнаяДлина: 50
Ресурсы:
-
Ид: 734935b9-5911-4087-b29d-409bebcf4943
Имя: Курс
Тип: Число
ДлинаДробнойЧасти: 4
МинимальноеЗначение: 0
-
Ид: 05e1f67e-c22a-4c5b-a5ee-6834e83bf46e
Имя: Кратность
Тип: Число
МинимальноеЗначение: 0
Структура КлючРазрешенийИзмерений
будет содержать измерение Валюта. Обработчик ВычислитьКлючиДоступаДляЧтения может выглядеть следующим образом:
@Обработчик
метод ВычислитьКлючиДоступаДляЧтения(
Ключи: ЧитаемыйМассив<КурсыВалют.КлючРазрешенийИзмерений>
): ЧитаемоеСоответствие<КурсыВалют.КлючРазрешенийИзмерений, ЧитаемыйМассив<КлючДоступа.Объект>>
// Даем права на чтение всех записей,
// где валюта не равна ADR
пер Результат = <КурсыВалют.КлючРазрешенийИзмерений, ЧитаемыйМассив<КлючДоступа.Объект>>{:}
для Ключ из Ключи
если Ключ.Валюта != "ADR"
Результат.Вставить(Ключ, [новый КлючДоступаДляВсех.Объект()])
;
;
возврат Результат
;
Событие ВычислитьКлючиДоступаДляЧтения
также вызывается в результате вызова метода ПересчитатьРазрешенияДоступаДляОбъектов()
. Поскольку этот метод позволяет пересчитать разрешения сразу для нескольких или для всех записей, первый параметр в обработчике ВычислитьКлючиДоступаДляЧтения
является массивом ключей измерений. Эти ключи измерений «Шина» формирует самостоятельно из переданных записей.
Событие «ВычислитьКлючиДоступаДляИзменения»
Обработчик события ВычислитьКлючиДоступаДляИзменения
по своему смыслу ничем не отличается от обработчика ВычислитьРазрешенияДоступаДляОбъектов
. На вход он получает массив записей, для которых нужно создать разрешения.
Отличие заключается лишь в том, что, так как право всего одно — Изменение, вам не нужно создавать разрешение, «Шина» сделает это самостоятельно. Достаточно лишь вычислить экземпляры ключей, которые надо записать в разрешение той или иной записи.
Например, обработчик этого события может выглядеть следующим образом:
@Обработчик
метод ВычислитьКлючиДоступаДляИзменения(
Элементы: ЧитаемыйМассив<УчетнаяПолитикаОрганизаций.ДанныеРасчетаРазрешений>
): ЧитаемоеСоответствие<УчетнаяПолитикаОрганизаций.ДанныеРасчетаРазрешений, ЧитаемыйМассив<КлючДоступа.Объект>>
знч Результат = <УчетнаяПолитикаОрганизаций.ДанныеРасчетаРазрешений, Массив<КлючДоступа>>{:}
для Элемент из Элементы
если Элемент.Период > ПолучитьДатуЗапретаРедактирования()
Результат.Вставить(Элемент, [КлючДоступаОрганизации.Получить(Элемент.Организация)])
;
;
возврат Результат
;