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