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

Периодические регистры сведений в силу своего внутреннего устройства требуют разную логику при установке права Чтение и права Изменение. Поэтому в отличие от других видов элементов проекта (и в отличие от непериодических регистров сведений), для вычисления разрешений на отдельные записи (RLS) они используют не одно событие ВычислитьРазрешенияДоступаДляОбъектов, а два события, каждое для своего права:
  • ВычислитьКлючиДоступаДляЧтения
  • ВычислитьКлючиДоступаДляИзменения

Поскольку каждое из этих событий «обрабатывает» одно право, «1С:Шина» облегчает вам жизнь и создает разрешения самостоятельно. От вас только требуется в обработчике сформировать тот набор экземпляров ключей, которые надо записать в конкретное разрешение. Этот факт отражается и в именах этих событий — «ВычислитьКлючи...».

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

Особенность этого события заключается в том, что «1С:Шина» создает разрешение доступа не для одной записи, а для всех записей регистра, которые отличаются только значением поля Период. Для этого используется тип имя-регистра-сведений.КлючИзмерений (подробнее).

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

@Обработчик
метод ВычислитьКлючиДоступаДляЧтения(Ключи: ЧитаемыйМассив<УчетнаяПолитикаОрганизаций.КлючИзмерений>
    ): ЧитаемоеСоответствие<УчетнаяПолитикаОрганизаций.КлючИзмерений, ЧитаемыйМассив<КлючДоступа>>
 
    знч Результат = <УчетнаяПолитикаОрганизаций.КлючИзмерений, Массив<КлючДоступа>>{:}
    для Ключ из Ключи
        Результат.Вставить(Ключ, [КлючДоступаОрганизации.Получить(Ключ.Организация)])
    ;
    возврат Результат
;
Примечание: Событие ВычислитьКлючиДоступаДляЧтения также вызывается в результате вызова метода ПересчитатьРазрешенияДоступаДляОбъектов(). Поскольку этот метод позволяет пересчитать разрешения сразу для нескольких или для всех записей, первый параметр в обработчике ВычислитьКлючиДоступаДляЧтения является массивом ключей измерений. Эти ключи измерений «1С:Шина» формирует самостоятельно из переданных записей.

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

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

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

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

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