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

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

создает разрешения автоматически, а от вас требуется только сформировать в обработчике набор экземпляров ключей, которые надо записать в конкретное разрешение.

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

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

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

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

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

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

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

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

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