1С: Чтение всех контрагентов при включенном RLS

 
Исходные данные:
Есть платформа 8.3.13.1644, УТ 11.4.
Есть настроенное RLS по группам доступа партнеров.
Т.е. пользователи видят (и тем более могут использовать в документах) только «своих» партнеров/контрагентов.
 
Задача:
Нужно, чтобы юзеры могли видеть ВСЕХ контрагентов/партнеров, но использовать в документах только «своих».

 
Нюансы:
Уточнение по поводу «видеть всех». ВСЕ контрагенты должны отображаться только в какой-нибудь отдельной форме/отчете. А в полях выбора документов должны выводиться только «свои», чтобы не вводить менеджеров в заблуждение.
 

Немного теории:

RLS (Record Level Security) — ограничение доступа на уровне записей и полей.
Еще здесь отличное описание возможностей 1С по управлению доступом.
 
В 1С роли разграничивают общий доступ на объекты, а RLS — разграничивает то, что разрешено ролью, на уровне записей.
RLS является не механизмом запрета доступа, а механизмом фильтрации выдачи доступа.
RLS влияет только на ту конкретную связь «Роль» — «Право доступа», в которой он прописан. И не влияет на права доступа, выданные с помощью других ролей.
Поэтому если пользователю выдается несколько ролей, то фильтр с помощью RLS нужно ставить в каждой роли.
 
RLS применяется для следующих видов прав доступа (из всех 16-ти):
  • Чтение
  • Добавление
  • Изменение
  • Удаление
Это означает, что нельзя, например, дать пользователю одновременно право «Изменение» без фильтра (для возможности работать программно с любыми документами) и право «Редактирование» с фильтром RLS по организации для интерактивной работы. Если нам нужно, чтобы пользователь мог редактировать документы с фильтром RLS , мы обязаны наложить общий фильтр на верхнем уровне «Изменение» или «Чтение».
 

Вариант решения с ходу: настроить правила RLS для ролей, открывающих доступ к нужным справочникам.
 
Роли, открывающие нужный доступ:
ДобавлениеИзменениеИнформацииПоПартнерам
ЧтениеИнформацииПоПартнерам
 
В качестве формы для просмотра всех контрагентов использовался демони.. динамический список.
 
Пробовалось:
1) Выпилить правила RLS из нужных ролей для права Чтения.
Точнее: создать копию роли ЧтениеИнформацииПоПартнерам, но без правил RLS для права Чтения. Добавить ее юзеру, рядом с нетронутой ДобавлениеИзменениеИнформацииПоПартнерам.
Результат: юзеры видят и могут выбрать чужих контрагентов в полях выбора. Сохранить, правда, документ не получится — возникнет ошибка прав доступа. Какбэ можно работать и так, но нельзя.
 
 
2) Из роли ДобавлениеИзменениеИнформацииПоПартнерам выпилить RLS для права Чтение. Добавить только эту роль юзеру.
Результат: тот же.
 
3) Экспериментировать с самописными правилами RLS для ролей. Использовать ГДЕ ИСТИНА , ГДЕ ЛОЖЬ , баловаться со списком полей в правиле (как например здесь).
Результат: нулевой. Если у нас используется «глобальное» ограничение записей справочника на изменение, то нужно так же ограничивать и чтение, иначе будет несоответствие видомого и реального. Нельзя в одном месте открыть чтение записей, а в другом закрыть, ведь ограничения «глобальные». 
 
4) Использовать Параметры сеанса в правилах RLS (спасибо AllexSoft).
«делается параметр сеанса, скажем «ЧтениеВсехОрганизаций» — булево.. при установке сеанса инициализируем его в = Ложь.. делаем новую роль, или на вашу пользовательскую ограниченную роль цепляем RLS на справочник организации — чтение, типа «ГДЕ &ЧтениеВсехОрганизаций».. ну и в нужном месте (ну скажем в вашем случае при создании на сервере ставим ЧтениеВсехОрганизаций= истина» и все ) не забудьте только сбросить потом параметр сеанса ЧтениеВсехОрганизаций= ложь, когда форму закроют)»
Т.е. создаем булевый параметр сеанса ЧтениеВсехПартнеров. Добавляем его в правила RLS на право Чтения. Устанавливаем его, когда нужно прочитать все записи, затем сбрасываем.

 
Но! Пока параметр ЧтениеВсехПартнеров установлен, то в это время будут доступны чужие контрагенты и в других местах, кроме нашего списка — в документах, например. А
когда его отключать? У динамического списка нет событий ПослеЗагрузкиВсехДанных или что-то в этом роде (на то он и динамический, что подгружает данные по мере отображения). При закрытии формы? При завершении сеанса?:))
Даже если создавать список программно, и запилить включение/отключение параметра до и после кода, все равно это все бестолку — список то динамический.
 
5) Использовать УстановитьПривилегированныйРежим() 
Проблема та же, что и в предыдущем пункте. Когда отключать привилегированный режим?
 
6) Использовать отчет и вызывать УстановитьПривилегированныйРежим()  (или установить ЧтениеВсехПартнеров)
Результат: PROFIT!
С отчетом все просто, он формируется 1 раз. Опытным путем было установлено, что само выполнение запроса к БД происходит непосредственно во время вывода таблицы:

 

2 thoughts on “1С: Чтение всех контрагентов при включенном RLS”

  1. Здравствуйте!
    Нельзя ли более подробно раскрыть алгоритм, так скажем для «Чайника», к которым себя отношу, чтоб исполнить это в 1С ЕРП?
    (целый месяц в одиночестве пытаюсь сделать, то что раскрыто в этой замечательно и актуальной статье, но всё выглядит бесперспективно).
    Буду рад любому комментарию, который поможет мне исполнить задуманное в этой статье.
    Спасибо!

    1. Здравствуйте, уже несколько лет не занимаюсь 1С. Тем не менее, перечитал свою статью, и насколько помню, все получилось как описано в пункте 6.
      Т.е. с использованием отчета и включением привилегированного режима, которому пофиг на ограничения доступа.
      Создаем нужный отчет для отображение всех контрагентов/партнеров. Но формируем его программно из кода, чтобы иметь возможность сначала установить привилегированный режим ПЕРЕД непосредственным запросом в базу, а потом сразу отключить его, чтобы юзер уже не смог воспользоваться временным полным доступом к объектам.
      Ну т.е. получилось все сделать, по сути, в 3 строчки (не считая остальных «потрохов» по созданию и отображению самого отчета).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *