Как ограничить кассирам просмотр отчетов и документов по чужим кассам ККМ в 1С

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

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

Разберем основные архитектурные подходы решения данной задачи в конфигурации 1С:Розница и платформе 1С:Предприятие 8.3 — от настройки прав на уровне записей (RLS) до программной фиксации отборов в отчетах на СКД и динамических списках.

Вариант 1. Настройка ограничения доступа на уровне записей (RLS)

Самый надежный способ ограничить чтение данных на уровне платформы — использование механизма RLS (Record Level Security). Если ограничить доступ только к справочнику касс, при отключении отбора в отчете платформа все равно выведет агрегированные суммы из регистров. Поэтому ограничение необходимо накладывать не только на справочники или документы, но и на регистры накопления (например, Продажи или регистры движения денежных средств).

Рассмотрим логику реализации RLS по шагам:

  1. Создаем отдельную роль для пользователей касс (например, ЧтениеПродажПоСвоейКассе).
  2. В правах роли для требуемого регистра накопления на право Чтение задаем ограничение доступа. В упрощенном виде условие выборки записей выглядит следующим образом:

ГДЕ КассаККМ В
    (ВЫБРАТЬ
        КассаККМ
    ИЗ
        РегистрСведений.ОбъектыДоступаПользователей
    ГДЕ
        Пользователь = &ТекущийПользователь)
  1. Для администраторов и управляющих магазином назначаются типовые полные роли, в которых RLS отключен. В результате администраторы видят данные всех касс, а кассиры — только разрешенные.

Важно: в типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) не рекомендуется писать прямые тексты RLS вручную в свойствах роли. Типовая подсистема использует предопределенные шаблоны (#ПоЗначениям) и механизмы ключей доступа. В типовой «1С:Рознице» достаточно включить функциональную опцию «Ограничивать доступ на уровне записей» и в профилях групп доступа настроить виды доступа по конкретным кассам ККМ или магазинам.

Вариант 2. Фиксированные отборы в отчетах на СКД

Если задача заключается исключительно в ограничении формирования аналитических отчетов без глобального включения RLS (которое может создавать дополнительную нагрузку на СУБД при проведении документов), отбор можно жестко зафиксировать в Системе компоновки данных.

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

Рассмотрим пример кода в модуле объекта отчета (в обработчике ПриКомпоновкеРезультата) или в модуле формы отчета:


Если Не РольДоступна("Администратор") Тогда
    ОтборФиксированный = КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборФиксированный.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КассаККМ");
    ОтборФиксированный.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ОтборФиксированный.ПравоеЗначение = ТекущаяКассаПользователя;
    ОтборФиксированный.Использование = Истина;
КонецЕсли;

Также можно использовать управление видимостью элементов пользовательских настроек через свойство РежимОтображения:


ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

Вариант 3. Программное ограничение в динамических списках документов

Чтобы кассир в форме списка документов «Отчет о розничных продажах» или «Чек ККМ» не мог снять отбор по своей кассе, наложим неудаляемый отбор на динамический список. Доработку удобно вынести в расширение конфигурации.

Разберем программную установку отбора в обработчике ПриСозданииНаСервере формы списка:


&НаСервере
Процедура Расш_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    Если Не РольДоступна("ПолныеПрава") И Не РольДоступна("Администратор") Тогда
        ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КассаККМ");
        ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбора.ПравоеЗначение = ПараметрыСеанса.ТекущееРабочееМесто;
        ЭлементОтбора.Использование = Истина;
        ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    КонецЕсли;
КонецПроцедуры

Сравнение и выбор оптимального решения

Выясним, какой подход лучше применить в зависимости от требований к безопасности и архитектуре системы:

  1. Использование штатного RLS БСП: гарантирует максимальную защиту на уровне платформы. Данные чужих касс невозможно получить ни через списки, ни через отчеты, ни через внешние обработки. Подходит для строгих требований безопасности.
  2. Фиксированные отборы СКД и динамических списков: оптимальны, если требуется легкое решение без изменения прав доступа и снижения производительности СУБД. Легко реализуются через механизм расширений конфигурации.
  3. Специализированный интерфейс РМК: для оперативной работы кассиров наиболее правильным подходом является запрет доступа к общим журналам документов и предоставление работы только через стандартное «Рабочее место кассира» (РМК), где контекст кассы и смены жестко привязан к текущему рабочему месту.
← На главную