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