Как разрешить полный доступ к документу Перемещение товаров при включенном RLS по складам и магазинам

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

При настройке системы прав доступа (RLS) в 1С:Розница часто возникает ситуация, когда глобальные ограничения на справочники Склады или Магазины начинают мешать работе с конкретными типами документов. Например, пользователю необходимо видеть все документы ПеремещениеТоваров по всей сети, несмотря на то, что его права ограничены только одним конкретным магазином. Разберем детально, как решить эту задачу, сохранив общую логику безопасности системы.

Понимание проблемы наследования ограничений

В системе 1С права доступа работают иерархично. Если вы наложили ограничение на справочник Склады через шаблон #ПоЗначениям, то любое упоминание склада в документах будет проходить проверку. Если у пользователя нет прав на склад «Западный», то в документе перемещения в поле склада он увидит надпись «Объект не найден», а сам документ может вообще не отобразиться в списке, если на него также наложен RLS, использующий эти значения.

Рассмотрим несколько эффективных способов решения этой проблемы, от простых манипуляций с ролями до программной настройки БСП.

Способ 1. Использование принципа логического «ИЛИ» при объединении ролей

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

  1. Создадим новую роль, например, ПолныйДоступКПеремещениям.
  2. В этой роли для объекта Документ.ПеремещениеТоваров установим полные права (Чтение, Просмотр, Изменение и т.д.) без использования шаблонов RLS.
  3. Назначим эту роль пользователю в дополнение к его основным ролям, где RLS включен.

В этом случае система увидит, что в основной роли есть ограничение, а в новой роли — нет. Согласно логике платформы, будет выбран наиболее широкий доступ, и ограничения RLS для этого конкретного документа перестанут действовать.

Способ 2. Разделение прав на «Чтение» и «Просмотр»

Проанализируем ситуацию: почему в документе отображается «Объект не найден»? Это происходит потому, что ограничение RLS наложено на право Чтение справочника Склады. Если пользователь не может «прочитать» ссылку, платформа скрывает её везде.

Рекомендуется следующая схема настройки RLS для справочников:

Способ 3. Модификация шаблона запроса RLS

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

Типовой запрос RLS через шаблон выглядит примерно так:


#ПоЗначениям( "Документ.ПеремещениеТоваров","Чтение","",
"Склады","СкладОтправитель","Магазины","Магазин", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )

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


ГДЕ (1 = 1) // Это условие всегда истинно, что фактически отключает фильтрацию для текущего объекта

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

Способ 4. Настройка через механизмы БСП (для современных конфигураций)

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

Найдем процедуру ПриЗаполненииСпискаТиповОбъектовСОтключеннымДоступом и добавим туда наш документ. Это позволит системе игнорировать стандартные механизмы проверки для конкретного типа метаданных, не затрагивая при этом логику работы со справочниками.

Проблема производительности и динамические списки

Важно помнить, что любые сложные условия в RLS могут замедлять работу динамических списков. Если мы полностью отключаем RLS для документа ПеремещениеТоваров, система будет работать максимально быстро. Если же мы начинаем прописывать сложные условия «ИЛИ», например:


ГДЕ Склад В (&ДоступныеСклады)
ИЛИ ТИПЗНАЧЕНИЯ(Ссылка) = ТИП(Документ.ПеремещениеТоваров)

...это может привести к существенному росту нагрузки на SQL-сервер, так как платформе придется строить тяжелые подзапросы для каждой строки списка. Поэтому вариант с разделением ролей (Способ 1) является наиболее предпочтительным с точки зрения производительности.

Резюме и рекомендации

Для решения задачи по предоставлению доступа к перемещениям при закрытых складах, выполним следующие шаги:

  1. Проверим настройки прав на справочник Склады. Убедимся, что право Чтение разрешено (это уберет ошибку «Объект не найден»).
  2. Для документа ПеремещениеТоваров создадим отдельную роль без ограничений RLS.
  3. Если требуется, чтобы пользователь видел только «свои» перемещения в обычном режиме, но мог найти «чужое» через поиск, используем разделение прав на Просмотр (ограничен) и Чтение (разрешено).

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

← На главную