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