Перейти к основному содержимому

Вычисление разрешений доступа для периодических регистров сведений

Периодические регистры сведений в силу своего внутреннего устройства требуют разной логики при установке прав Чтение и Изменение. Поэтому, в отличие от других видов элементов проекта (и в отличие от непериодических регистров сведений), для вычисления разрешений на отдельные записи (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"
Результат.Вставить(Ключ, [новый КлючДоступаДляВсех.Объект()])
;
;
возврат Результат
;
примечание

Событие ВычислитьКлючиДоступаДляЧтения также вызывается в результате вызова метода ПересчитатьРазрешенияДоступаДляОбъектов(). Поскольку этот метод позволяет пересчитать разрешения сразу для нескольких или для всех записей, первый параметр в обработчике ВычислитьКлючиДоступаДляЧтения является массивом ключей измерений. Эти ключи измерений «Шина» формирует самостоятельно из переданных записей.

Событие «ВычислитьКлючиДоступаДляИзменения»​

Обработчик события ВычислитьКлючиДоступаДляИзменения по своему смыслу ничем не отличается от обработчика ВычислитьРазрешенияДоступаДляОбъектов. На вход он получает массив записей, для которых нужно создать разрешения.

Отличие заключается лишь в том, что, так как право всего одно — Изменение, вам не нужно создавать разрешение, «Шина» сделает это самостоятельно. Достаточно лишь вычислить экземпляры ключей, которые надо записать в разрешение той или иной записи.

Например, обработчик этого события может выглядеть следующим образом:

@Обработчик
метод ВычислитьКлючиДоступаДляИзменения(
Элементы: ЧитаемыйМассив<УчетнаяПолитикаОрганизаций.ДанныеРасчетаРазрешений>
): ЧитаемоеСоответствие<УчетнаяПолитикаОрганизаций.ДанныеРасчетаРазрешений, ЧитаемыйМассив<КлючДоступа.Объект>>

знч Результат = <УчетнаяПолитикаОрганизаций.ДанныеРасчетаРазрешений, Массив<КлючДоступа>>{:}
для Элемент из Элементы
если Элемент.Период > ПолучитьДатуЗапретаРедактирования()
Результат.Вставить(Элемент, [КлючДоступаОрганизации.Получить(Элемент.Организация)])
;
;
возврат Результат
;