В типовой конфигурации «Управление торговлей», редакция 10.3, отсутствует встроенный механизм «Группы доступа номенклатуры», который привычен пользователям более тяжелых решений, таких как УПП. Задача по разграничению прав, при которой каждый менеджер может изменять данные только в своей папке, требует программной доработки. Рассмотрим наиболее эффективные способы реализации этой задачи, проанализируем технические нюансы и выберем оптимальный подход.
Механизм RLS (ограничение доступа на уровне записей) позволяет наложить фильтр на данные непосредственно на уровне SQL-запроса платформы. Это наиболее надежный метод, так как он работает «под капотом» и ограничивает доступ вне зависимости от того, как пользователь пытается изменить данные (через форму или обработкой).
Проанализируем особенности настройки RLS для иерархических справочников:
В ИЕРАРХИИ в запросах RLS для справочника Номенклатура при большом количестве позиций может привести к серьезным тормозам. Платформа будет вынуждена постоянно вычислять дерево папок при каждом обращении к таблице.Номенклатура новый реквизит, например, ГруппаДоступа. В обработчике ПередЗаписью значение этого реквизита должно автоматически копироваться из родительской папки. Тогда в правилах RLS можно будет использовать простое сравнение на равенство, что работает значительно быстрее поиска по иерархии.Если внедрение RLS кажется слишком сложным или избыточным (например, если нужно ограничить только изменение, а чтение оставить доступным для всех), можно использовать событийную модель. Разберем, как это сделать программно.
Для реализации контроля изменения данных необходимо внести изменения в модуль объекта справочника Номенклатура или использовать Подписки на события. Последний вариант предпочтительнее, так как он упрощает дальнейшее обновление конфигурации.
Алгоритм реализации в обработчике ПередЗаписью:
Отказ = Истинный и выведем предупреждение.Пример логики для обработчика ПередЗаписью:
Процедура ПередЗаписью(Отказ)
Если ЭтоНовый() Тогда
ПроверитьДоступКПапке(Родитель, Отказ);
Иначе
// Проверяем доступ как к текущей папке, так и к той,
// в которую, возможно, перемещают элемент
ПроверитьДоступКПапке(Родитель, Отказ);
// Дополнительно можно проверить, не изменился ли Родитель
КонецЕсли;
КонецПроцедуры
Чтобы повысить удобство работы пользователей, важно пресекать попытки несанкционированного создания данных еще на этапе открытия формы. Для этого стоит задействовать процедуру ОбработкаЗаполнения.
Разберем ситуацию: менеджер нажимает кнопку «Добавить», находясь в чужой папке. Система должна сразу выдать ошибку или подставить разрешенную папку. Также необходимо предусмотреть обработку копирования элементов, чтобы пользователь не мог обойти запрет, скопировав чужой товар в свою группу без прав на родительскую директорию.
Рассмотрим специфические моменты, с которыми мы столкнемся при внедрении данных доработок в УТ 10.3:
ПараметрыСеанса при старте системы.Для реализации разграничения доступа по папкам в УТ 10.3 наиболее надежным и «чистым» решением является комбинация RLS (на изменение) и подписок на события (для программных проверок). Это позволит избежать создания элементов в «чужих» группах и защитит данные от случайного перемещения менеджерами, при этом не создавая критической нагрузки на производительность системы при формировании отчетов.