В процессе внедрения управленческого учета в «1С:Управление нашей фирмой» (УНФ) часто возникает необходимость ограничить доступ менеджеров к конкретным складам или подразделениям. На первый взгляд, типовой механизм RLS (Record Level Security) должен справляться с этой задачей через стандартные настройки групп доступа. Однако на практике, особенно в последних редакциях УНФ 3.0, специалисты часто обнаруживают, что даже при верных настройках пользователи продолжают видеть лишние данные. В некоторых случаях проще использовать готовое ограничение списка документов по складу реализации и поступления, но для глубокой кастомизации важно понимать внутреннюю логику системы.
В данном материале мы разберем причины, по которым «коробочный» RLS может игнорировать настройки, научимся правильно переопределять права доступа через механизм расширений и разберем, как активировать производительный режим RLS для корректной работы форм выбора.
Первое препятствие при включении ограничений по складам — ситуация, когда пользователь видит все документы и справочники без исключения. Анализ ролей выявляет важную особенность архитектуры системы.
В конфигурации присутствует роль БазовыеПраваПриложения (или её аналоги в составе БСП), которая назначается практически всем пользователям для обеспечения базового доступа к системе. Проблема заключается в том, что в ряде релизов эта роль предоставляет право на Чтение ключевых справочников (включая СтруктурныеЕдиницы) без каких-либо ограничений.
Поскольку в платформе 1С права суммируются по принципу «Разрешено всё, что разрешено хотя бы одной ролью», наличие доступа без RLS в базовой роли полностью нивелирует ограничения в других ролях. Для диагностики таких пересечений удобно использовать инструмент на анализ и сравнение ролей, а чтобы понять, кому именно назначены избыточные права, пригодится список профилей с отбором по роли.
Чтобы сохранить конфигурацию на поддержке, внесем изменения через механизм расширений. Нам потребуется заимствовать роль БазовыеПраваПриложения в расширение и задать для неё корректный шаблон ограничений доступа. При разработке логики в расширении важно убедиться в отсутствии конфликтов.
В правах заимствованной роли для справочника СтруктурныеЕдиницы на право «Чтение» добавим код ограничения, учитывающий текущий режим работы системы (стандартный или производительный):
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
// Для универсального (производительного) режима RLS
// Мы можем вернуть ЛОЖЬ, чтобы система ориентировалась на другие роли,
// либо применить стандартные шаблоны БСП.
ЛОЖЬ
#Иначе
// Для стандартного режима используем типовой шаблон БСП
#ПоЗначениям( "Справочник.СтруктурныеЕдиницы","Чтение","",
"Склады","Ссылка","","","","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )
#КонецЕсли
Далее необходимо зарегистрировать изменения в механизмах БСП. Для этого в расширении нужно перехватить функции, описывающие виды ограничений. Используем аннотацию &ИзменениеИКонтроль для функции определения видов ограничений:
&ИзменениеИКонтроль("ВидыОграниченийПравСправочниковИПлановВидовХарактеристик")
Функция Расш1_ВидыОграниченийПравСправочниковИПлановВидовХарактеристик()
// ... выполнение типового кода ...
#Вставка
// Регистрируем связку Справочник + Вид доступа
Результат = Результат + "Справочник.СтруктурныеЕдиницы.Чтение.Склады";
#КонецВставки
// ... возврат значения Результат
КонецФункции
Аналогичным образом регистрируем справочник в списке объектов, поддерживающих RLS:
&ИзменениеИКонтроль("СправочникиСОграничениемДоступа")
Функция Расш1_СправочникиСОграничениемДоступа()
// ... инициализация функции ...
#Вставка
Результат.Добавить(Метаданные.Справочники.СтруктурныеЕдиницы);
#КонецВставки
// ...
КонецФункции
Если после внесения изменений в код расширения настройки всё равно не применяются, следует обратить внимание на константу ОграничениеДоступаНаУровнеЗаписейУниверсально. Если в системе включен Производительный режим RLS, права не вычисляются «на лету».
В этом режиме используются Ключи доступа, хранящиеся в регистрах сведений. При изменении логики (шаблонов) в конфигураторе или расширении эти данные не обновляются автоматически.
Для актуализации прав выполните следующие действия:
/c ЗапуститьОбновлениеИнформационнойБазы.ОбновлениеВспомогательныхДанных.epf. В разделе «Управление доступом» необходимо запустить процедуру полного пересчета.Только после обновления ключей доступа новые правила из расширения начнут действовать для уже созданных объектов базы.
После корректной настройки RLS может возникнуть побочный эффект: в журналах документов менеджер видит только разрешенные записи, но при создании нового документа список выбора Подразделения пуст, хотя права на него есть.
Причина: В типовых механизмах УНФ часто прописана жесткая фильтрация структурных единиц. В некоторых контекстах система принудительно отображает только элементы с типами «Склад» или «Магазин», исключая «Подразделение».
Для исправления этого поведения нужно вмешаться в процесс формирования параметров выбора. Пример корректировки процедуры ЗаполнитьПараметрыВыбораЗначенияДоступа через расширение:
&НаСервере
&ИзменениеИКонтроль("ЗаполнитьПараметрыВыбораЗначенияДоступа")
Процедура Расш1_ЗаполнитьПараметрыВыбораЗначенияДоступа()
Если Не Параметры.Свойство("ЭтоВыборЗначенияДоступа") Тогда
Возврат;
КонецЕсли;
// Снимаем жесткое ограничение на типы структурных единиц
ДопустимыеТипыЗначенияДоступа = Новый Массив;
Для Каждого ТекущийТип Из Перечисления.ТипыСтруктурныхЕдиниц Цикл
#Удаление
// Ранее здесь могло быть условие, отсекающее Подразделения
// Если ТекущийТип <> Перечисления.ТипыСтруктурныхЕдиниц.Подразделение Тогда
#КонецУдаления
ДопустимыеТипыЗначенияДоступа.Добавить(ТекущийТип);
#Удаление
// КонецЕсли;
#КонецУдаления
КонецЦикла;
// Обновляем параметры отбора для формы выбора
Параметры.Отбор.Вставить("ТипСтруктурнойЕдиницы", ДопустимыеТипыЗначенияДоступа);
КонецПроцедуры
Чтобы успешно настроить RLS по структурным единицам в 1С:УНФ 3.0, необходимо применить комплексный подход:
БазовыеПраваПриложения в расширении, внедрив в неё шаблоны RLS.Такой алгоритм позволяет реализовать гибкую систему прав доступа, сохраняя при этом возможность беспрепятственного обновления типовой конфигурации.