Настройка RLS по структурным единицам в 1С:УНФ 3.0 через расширение: почему механизм не работает сразу?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет Торговля и дистрибуция
← На главную

В процессе внедрения управленческого учета в «1С:Управление нашей фирмой» (УНФ) часто возникает необходимость ограничить доступ менеджеров к конкретным складам или подразделениям. На первый взгляд, типовой механизм RLS (Record Level Security) должен справляться с этой задачей через стандартные настройки групп доступа. Однако на практике, особенно в последних редакциях УНФ 3.0, специалисты часто обнаруживают, что даже при верных настройках пользователи продолжают видеть лишние данные. В некоторых случаях проще использовать готовое ограничение списка документов по складу реализации и поступления, но для глубокой кастомизации важно понимать внутреннюю логику системы.

В данном материале мы разберем причины, по которым «коробочный» RLS может игнорировать настройки, научимся правильно переопределять права доступа через механизм расширений и разберем, как активировать производительный режим RLS для корректной работы форм выбора.

Анализ причин: роль «БазовыеПраваПриложения»

Первое препятствие при включении ограничений по складам — ситуация, когда пользователь видит все документы и справочники без исключения. Анализ ролей выявляет важную особенность архитектуры системы.

В конфигурации присутствует роль БазовыеПраваПриложения (или её аналоги в составе БСП), которая назначается практически всем пользователям для обеспечения базового доступа к системе. Проблема заключается в том, что в ряде релизов эта роль предоставляет право на Чтение ключевых справочников (включая СтруктурныеЕдиницы) без каких-либо ограничений.

Поскольку в платформе 1С права суммируются по принципу «Разрешено всё, что разрешено хотя бы одной ролью», наличие доступа без RLS в базовой роли полностью нивелирует ограничения в других ролях. Для диагностики таких пересечений удобно использовать инструмент на анализ и сравнение ролей, а чтобы понять, кому именно назначены избыточные права, пригодится список профилей с отбором по роли.

Шаг 1. Перенос RLS-ограничений в расширение

Чтобы сохранить конфигурацию на поддержке, внесем изменения через механизм расширений. Нам потребуется заимствовать роль БазовыеПраваПриложения в расширение и задать для неё корректный шаблон ограничений доступа. При разработке логики в расширении важно убедиться в отсутствии конфликтов.

В правах заимствованной роли для справочника СтруктурныеЕдиницы на право «Чтение» добавим код ограничения, учитывающий текущий режим работы системы (стандартный или производительный):


#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
// Для универсального (производительного) режима RLS 
// Мы можем вернуть ЛОЖЬ, чтобы система ориентировалась на другие роли,
// либо применить стандартные шаблоны БСП.
ЛОЖЬ
#Иначе
// Для стандартного режима используем типовой шаблон БСП
#ПоЗначениям( "Справочник.СтруктурныеЕдиницы","Чтение","",
"Склады","Ссылка","","","","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )
#КонецЕсли

Далее необходимо зарегистрировать изменения в механизмах БСП. Для этого в расширении нужно перехватить функции, описывающие виды ограничений. Используем аннотацию &ИзменениеИКонтроль для функции определения видов ограничений:


&ИзменениеИКонтроль("ВидыОграниченийПравСправочниковИПлановВидовХарактеристик")
Функция Расш1_ВидыОграниченийПравСправочниковИПлановВидовХарактеристик()
    // ... выполнение типового кода ...
    
    #Вставка
    // Регистрируем связку Справочник + Вид доступа
    Результат = Результат + "Справочник.СтруктурныеЕдиницы.Чтение.Склады";
    #КонецВставки
    
    // ... возврат значения Результат
КонецФункции

Аналогичным образом регистрируем справочник в списке объектов, поддерживающих RLS:


&ИзменениеИКонтроль("СправочникиСОграничениемДоступа")
Функция Расш1_СправочникиСОграничениемДоступа()
    // ... инициализация функции ...
    
    #Вставка
    Результат.Добавить(Метаданные.Справочники.СтруктурныеЕдиницы);
    #КонецВставки
    
    // ...
КонецФункции

Шаг 2. Особенности производительного режима RLS

Если после внесения изменений в код расширения настройки всё равно не применяются, следует обратить внимание на константу ОграничениеДоступаНаУровнеЗаписейУниверсально. Если в системе включен Производительный режим RLS, права не вычисляются «на лету».

В этом режиме используются Ключи доступа, хранящиеся в регистрах сведений. При изменении логики (шаблонов) в конфигураторе или расширении эти данные не обновляются автоматически.

Для актуализации прав выполните следующие действия:

  1. Запустите базу с параметром командной строки: /c ЗапуститьОбновлениеИнформационнойБазы.
  2. В случае необходимости выполнить процедуру выборочно, можно применить точечный пересчет прав доступа для пользователя или для группы.
  3. Или используйте типовую обработку БСП ОбновлениеВспомогательныхДанных.epf. В разделе «Управление доступом» необходимо запустить процедуру полного пересчета.

Только после обновления ключей доступа новые правила из расширения начнут действовать для уже созданных объектов базы.

Шаг 3. Решение проблемы с выбором Подразделений

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

Причина: В типовых механизмах УНФ часто прописана жесткая фильтрация структурных единиц. В некоторых контекстах система принудительно отображает только элементы с типами «Склад» или «Магазин», исключая «Подразделение».

Для исправления этого поведения нужно вмешаться в процесс формирования параметров выбора. Пример корректировки процедуры ЗаполнитьПараметрыВыбораЗначенияДоступа через расширение:


&НаСервере
&ИзменениеИКонтроль("ЗаполнитьПараметрыВыбораЗначенияДоступа")
Процедура Расш1_ЗаполнитьПараметрыВыбораЗначенияДоступа()
    Если Не Параметры.Свойство("ЭтоВыборЗначенияДоступа") Тогда
        Возврат;
    КонецЕсли;

    // Снимаем жесткое ограничение на типы структурных единиц
    ДопустимыеТипыЗначенияДоступа = Новый Массив;
    Для Каждого ТекущийТип Из Перечисления.ТипыСтруктурныхЕдиниц Цикл
        
        #Удаление
        // Ранее здесь могло быть условие, отсекающее Подразделения
        // Если ТекущийТип <> Перечисления.ТипыСтруктурныхЕдиниц.Подразделение Тогда 
        #КонецУдаления    
            
            ДопустимыеТипыЗначенияДоступа.Добавить(ТекущийТип); 
            
        #Удаление    
        // КонецЕсли;
        #КонецУдаления    
        
    КонецЦикла;
    
    // Обновляем параметры отбора для формы выбора
    Параметры.Отбор.Вставить("ТипСтруктурнойЕдиницы", ДопустимыеТипыЗначенияДоступа);
КонецПроцедуры

Итоги

Чтобы успешно настроить RLS по структурным единицам в 1С:УНФ 3.0, необходимо применить комплексный подход:

  1. Скорректировать роль БазовыеПраваПриложения в расширении, внедрив в неё шаблоны RLS.
  2. Зарегистрировать справочник и виды доступа в переопределяемых модулях БСП.
  3. Выполнить обязательное обновление вспомогательных данных (ключей доступа) для корректной работы производительного режима.
  4. При необходимости адаптировать программные фильтры в формах выбора через расширение для корректного отображения Подразделений.

Такой алгоритм позволяет реализовать гибкую систему прав доступа, сохраняя при этом возможность беспрепятственного обновления типовой конфигурации.

← На главную