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