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