Ограничение доступа на уровне записей по кассам











В типовой конфигурации УПП нет ограничения доступа на уровне записей по кассам, а очень хотелось бы.
Наверно, предполагается, что достаточно ограничить по организации-подразделению, и этого должно хватить. Но когда в одной организации есть несколько касс, этого сочетания недостаточно: кассиры в документах и отчетах видят «чужие» кассы.
В статье приводится список доработок, которые необходимо сделать, чтобы ограничение действительно работало.
Думаю, что аналогичные доработки можно воспроизвести в конфигурациях «Управление Торговлей 10.3» и «Комплексная автоматизация 1.1».
Также публикация поможет понять, как добавить свой вид ограничения доступа: по расчетным счетам например.

Чтобы понять, как это все работает, пришлось покопаться в конфигураторе. Но в итоге объем доработок сравнительно небольшой, конфигурацию легко будет обновлять в дальнейшем. Надеюсь, это кому-нибудь пригодится и облегчит реализацию в своей базе.

1. Перечисление «ВидыОбъектовДоступа» — добавляем новое значение «Кассы». В результате в параметрах доступа увидим желанную строку с кассой:

2. Перечисление «ОбластиДанныхОграниченияПравДоступа» — добавляем новое значение «КассыДанные».

3. В параметры сеанса добавляем «ИспользоватьОграничениеПоКассы» с типом «булево».

4. В общем модуле  «НастройкаПравДоступа» в функцию «ПолучитьВидОбъектаДоступа» добавляем 2 строки:

ИначеЕсли ТипЗнч(ОбъектДоступа) = Тип("СправочникСсылка.Кассы") Тогда
Возврат Перечисления.ВидыОбъектовДоступа.Кассы;

5. В регистре сведений «НастройкиПравДоступаПользователей» в два измерения «ОбъектДоступа» и «ВладелецПравДоступа», которые уже имеют составной тип данных добавляем тип «СправочникСсылка.Кассы».

6. В обработке «НастройкаПравДоступа»  — в панель «ПанельОбластейДанных» добавляем новую страницу «Кассы» с табличным полем «ТаблицаПарвДоступа_Кассы», а также пару строк в процедуры. Сама обработка приложена к публикации. Ее кстати можно будет вставить во внешние обработки и вызывать оттуда, а не заменять встроенную.

6. Создаем новую роль «Т_Кассир» (название любым может быть) путем копирования встроенной роли «Кассир». Эту роль необходимо будет дать всем пользователям, которым хотим ограничить кассы, а типовую роль «Кассир» у них убрать. Можно и типовую роль «сломать», но с добавлением новой роли будет легче обновлять конфигурацию.

7. И самое сложное — настроить ограничения доступа у новой роли.

Открываем роль, находим документ «Приходный кассовый ордер», выбираем право «Чтение» , слева жмем кнопку «Установить ограничение данных для полей» и текст ограничения меняем на такой:

ТекущаяТаблица
ИЗ
#ТекущаяТаблица КАК ТекущаяТаблица
#Если &ИспользоватьОграничениеПоКонтрагенты ИЛИ &ИспользоватьОграничениеПоОрганизации
ИЛИ &ИспользоватьОграничениеПоПодразделения ИЛИ &ИспользоватьОграничениеПоСклады ИЛИ &ИспользоватьОграничениеПоКассы #Тогда
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
СоставГруппы.Ссылка КАК ГруппаПользователей
ИЗ
Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
ГДЕ
СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей
ПО (ИСТИНА)
#КонецЕсли
ГДЕ
ТекущаяТаблица.ВидОперации <> ЗНАЧЕНИЕ(Перечисление.ВидыОперацийПКО.ВозвратДенежныхСредствРаботником)
И ТекущаяТаблица.ВидОперации <> ЗНАЧЕНИЕ(Перечисление.ВидыОперацийПКО.РасчетыПоКредитамИЗаймамСРаботниками)

#Если &ИспользоватьОграничениеПоКонтрагенты ИЛИ &ИспользоватьОграничениеПоОрганизации
ИЛИ &ИспользоватьОграничениеПоПодразделения ИЛИ &ИспользоватьОграничениеПоСклады ИЛИ &ИспользоватьОграничениеПоКассы #Тогда
И НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL
И
(НЕ 1 В
(ВЫБРАТЬ ПЕРВЫЕ 1
1
ИЗ
РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа

#Если &ИспользоватьОграничениеПоКонтрагенты #Тогда
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Контрагенты.Ссылка = ТекущаяТаблица.Контрагент
#КонецЕсли

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
ПО
НастройкиПравДоступаПользователей.ОбъектДоступа = ВЫБОР

#Если &ИспользоватьОграничениеПоКонтрагенты #Тогда
КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Контрагенты)
ТОГДА ЕСТЬNULL(Контрагенты.ГруппаДоступаКонтрагента, ЗНАЧЕНИЕ(Справочник.ГруппыДоступаКонтрагентов.ПустаяСсылка))
#КонецЕсли

#Если &ИспользоватьОграничениеПоОрганизации #Тогда
КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
ТОГДА ТекущаяТаблица.Организация
#КонецЕсли

#Если &ИспользоватьОграничениеПоПодразделения #Тогда
КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Подразделения)
ТОГДА ТекущаяТаблица.Подразделение
#КонецЕсли

#Если &ИспользоватьОграничениеПоСклады #Тогда
КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады)
ТОГДА ТекущаяТаблица.Контрагент
#КонецЕсли

#Если &ИспользоватьОграничениеПоКассы #Тогда
КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Кассы)
ТОГДА ТекущаяТаблица.Касса
#КонецЕсли

КОНЕЦ
И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа
И
НастройкиПравДоступаПользователей.ОбластьДанных =
#Если &ИспользоватьОграничениеПоКонтрагенты #Тогда
ВЫБОР КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Контрагенты)
ТОГДА ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.КонтрагентыДанные)
ИНАЧЕ
ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ПустаяСсылка)
КОНЕЦ
#Иначе
ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ПустаяСсылка)
#КонецЕсли

И НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей
ГДЕ
НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей
И НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа В (
ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.ПустаяСсылка)

#Если &ИспользоватьОграничениеПоКонтрагенты #Тогда
, ВЫБОР КОГДА ТекущаяТаблица.Контрагент ССЫЛКА Справочник.Контрагенты
ТОГДА ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Контрагенты)
КОНЕЦ
#КонецЕсли

#Если &ИспользоватьОграничениеПоОрганизации #Тогда
, ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
#КонецЕсли

#Если &ИспользоватьОграничениеПоПодразделения #Тогда
, ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Подразделения)
#КонецЕсли

#Если &ИспользоватьОграничениеПоКассы #Тогда
, ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Кассы)
#КонецЕсли

#Если &ИспользоватьОграничениеПоСклады #Тогда
,
ВЫБОР КОГДА ТекущаяТаблица.Контрагент ССЫЛКА Справочник.Склады
ТОГДА ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады)
КОНЕЦ
#КонецЕсли
)

И НастройкиПравДоступаПользователей.ОбъектДоступа ЕСТЬ NULL))
#КонецЕсли

Думаю нетрудно догадаться, какие куски добавлены, чтобы заработало ограничение по кассам.

Аналогично необходимо сделать для права «Добавление», «Изменение».

Точно таким же образом допиливаем ограничения роли для документа «Расходный кассовый ордер», а также для журнала документов «Кассовые документы».

Такая доработка скроет для пользователя в списках этих документов те, которе не относятся к «его» кассе.

Чтобы скрыть данные в отчетах (Ведомость по денежным средствам, Движения денежных средств) необходимо исправить текст ограничений для регистров накопления «ДвижениеДенежныхСредств» и «ДенежныеСредства», по которым строятся эти отчеты. Это делается аналогично, как сделано в документах.

(кстати в типовой роли «Кассир» для регистра накопления «Денежные средства» вообще нет никаких ограничений доступа, так что даже сочетанием настроек  ограничений по организации-подразделению не удастся ограничить в него доступ без доработки).

Если непонятно, как писать эти ограничения — текст готовых кодов для каждого объекта приложен к публикации.

В результате пользователь, у которого стоит ограничение по одной кассе видит в документах и отчетах следующее:

При этом пользователь без ограничений видит все документы:

13 Comments

  1. Азверин

    Спасибо за статью и пример. Очень помогло!

    Reply
  2. j3d

    Приветствую!

    спасибо за замечательную публикацию . Решил интегрировать ее в КА 1.1.101.1.

    Все прошло на ура.

    Создал две кассы (Москва, Воронеж).

    Добавил коды ограничений согласно инструкции.

    (Роль Кассир скопировал назвал как и у вас Т_Кассир)

    Регистр Денежные средства срабатывает нормально

    а вот Движение денежных средств все равно открыт

    хотя код внес согласно инструкции

    Reply
  3. Bacemo

    Спасибо. Публикация помогла.

    Reply
  4. zayden

    то есть без скачивания обработки не взлетит?

    Reply
  5. Mikeware

    (4) почему? все работает..

    Жалко, что не видел этой публикации раньше — сэкономил бы изрядно времени…

    Reply
  6. acanta

    Спасибо огромное, лучший пример и очень доступно о такой сложной и нелюбимой области как rls. Единственное — в шапках отчета как можно определить по каким ограничениям они построены?

    Reply
  7. zayden

    (5) тогда сос

    6. В обработке «НастройкаПравДоступа» — в панель «ПанельОбластейДанных» добавляем новую страницу «Кассы» с табличным полем «ТаблицаПарвДоступа_Кассы», а также пару строк в процедуры. Сама обработка приложена к публикации. Ее кстати можно будет вставить во внешние обработки и вызывать оттуда, а не заменять встроенную.

    это как вот? Делается? — а также пару строк в процедуры — что именно и в какие процедуры

    Reply
  8. Diego_Iv

    (6) В отчетах никак не отображаются наложенные ограничения.

    Это касается не только ограничения по кассам, а и любого другого.

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

    Reply
  9. Mikeware

    (7) в

    Функция ПолучитьСписокОбластейДанных(ТипДанных)

    Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

    — смотри и делай по аналогии, например с Организациями

    Reply
  10. Mikeware

    (8) Это если RLS настроена на регистры(вообще данные) по которыми строится отчет. иначе получится, что отчет построен — а вот вместо запрещенных объектов <Объект не найден…>

    Reply
  11. zayden

    (9) паасип

    Reply
  12. Diego_Iv

    (10) Да, совершенно верно. Спасибо за уточнение.

    Reply
  13. Mikeware

    Интересна кому-нибудь обработка тестирования RLS от имени пользователя? (а то есть сделанная на основе https://infostart.ru/public/288530/, но надо причесать-пригладить прежде чем выкладывать)

    Reply

Leave a Comment

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