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