При разработке конфигурации с нуля часто возникает задача разграничения прав доступа к данным. Типичный пример: в справочнике Сотрудники пользователь должен видеть только тех людей, которые относятся к его организации или за которых он назначен ответственным. Рассмотрим подробнее, как реализовать это ограничение, используя механизмы платформы 1С:Предприятие 8.3, особенно если разработка ведется на обычных формах.
Это наиболее правильный и надежный способ с точки зрения архитектуры системы. RLS — это ограничение доступа на уровне записей. Даже если пользователь попытается открыть список через универсальную обработку или консоль запросов, он все равно не увидит «чужие» данные, так как ограничение накладывается на уровне SQL-запроса платформой.
Разберем по шагам, как настроить RLS для справочника Сотрудники:
ПараметрСеанса с именем ТекущаяОрганизация.
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
// Находим организацию текущего пользователя
ОрганизацияПользователя = НайтиОрганизациюПо ТекущемуПользователю();
ПараметрыСеанса.ТекущаяОрганизация = ОрганизацияПользователя;
КонецПроцедуры
Сотрудники. На вкладке «Права» выберем право «Чтение».
ГДЕ Организация = &ТекущаяОрганизация
Важный нюанс: Если справочник иерархический и вы хотите ограничить видимость групп, убедитесь, что в условии RLS учитывается логика иерархии. Если пользователь не имеет прав на чтение родительской группы, элементы внутри нее могут отображаться некорректно. Рассмотрим вариант использования конструкции В ИЕРАРХИИ, однако помните, что для «чистой» и быстрой базы лучше использовать простое равенство по реквизиту Организация.
Если ваша конфигурация использует обычные формы (как указано в условиях задачи) и использование RLS кажется избыточным, можно применить программный отбор. Проанализируем, как это работает в объекте СправочникСписок.
Рассмотрим реализацию в модуле формы списка справочника Сотрудники в событии ПриОткрытии:
Процедура ПриОткрытии()
// Определяем организацию, по которой нужно фильтровать
НужнаяОрганизация = ПолучитьОрганизациюТекущегоПользователя();
// Устанавливаем отбор в элементе управления СправочникСписок
// СправочникСписок - это стандартное имя табличного поля на форме
Попытка
ЭлементОтбора = СправочникСписок.Отбор.Организация;
ЭлементОтбора.Значение = НужнаяОрганизация;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
// Чтобы пользователь не мог отключить отбор вручную:
ЭлементОтбора.Доступность = Ложь;
Исключение
Сообщить("Не удалось установить фильтр по организации");
КонецПопытки;
КонецПроцедуры
Выясним причину, почему этот метод считается менее безопасным: продвинутый пользователь все равно может программно или через встроенные консоли запросов получить доступ к данным. Однако для интерфейсного разделения работы сотрудников разных филиалов этот метод вполне подходит.
Как справедливо заметили участники обсуждения, привязка «один пользователь — одна организация» может со временем стать тесной. Бизнес может потребовать, чтобы один ответственный видел данные двух или трех организаций.
В этом случае рекомендуется создать периодический Регистр Сведений НастройкиПравДоступа с измерениями Пользователь и ОбъектДоступа (тип — СправочникСсылка.Организации). Это позволит:
Посмотрим на пример запроса в RLS с использованием регистра сведений:
Сотрудники ГДЕ Сотрудники.Организация В
(ВЫБРАТЬ Рег.ОбъектДоступа
ИЗ РегистрСведений.НастройкиПравДоступа КАК Рег
ГДЕ Рег.Пользователь = &ТекущийПользователь)
Такой подход делает систему гибкой и масштабируемой. Мы рекомендуем закладывать эту логику на этапе проектирования базы «с нуля», чтобы потом не переписывать код во множестве форм.
Разберем кратко преимущества и недостатки каждого метода:
Проанализировав ситуацию, можно сделать вывод: для чистой базы на платформе 8.3 оптимальным будет сочетание Параметров сеанса (для хранения текущей настройки доступа) и RLS (для физического ограничения чтения данных). Это обеспечит надежность и порядок в данных с самого начала разработки.