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