Ограничение доступа на уровне записей в платформе 1С:Предприятие 7.7 — это классическая архитектурная задача, требующая комплексного подхода. Поскольку встроенного механизма RLS (Record Level Security) в «семерке» не существует, нам предстоит реализовать логику фильтрации самостоятельно. Давайте разберем, как подойти к этой задаче профессионально, избегая создания РИБ.
Прежде всего, нам необходимо иметь признак, по которому система поймет, что конкретный элемент или группа номенклатуры относится к ограниченному доступу. Для этого мы вводим дополнительный реквизит в справочник Номенклатура.
ГруппаДоступа (тип — Справочник.ГруппыДоступа).ПриЗаписи() в модуле формы или модуля справочника, чтобы актуализировать этот признак.Самый очевидный, но не единственный шаг — это ограничение видимости непосредственно в интерфейсе пользователя. Для этого используем метод ИспользоватьСписок(). Разберем реализацию подробнее:
В модуле формы списка или формы подбора номенклатуры при открытии (событие ПриОткрытии()) мы должны сформировать список допустимых элементов:
// Пример логики ограничения в ПриОткрытии
Процедура ПриОткрытии()
Если НуженФильтр() Тогда
СписокРазрешенных = СоздатьОбъект("СписокЗначений");
// Заполняем список запросом по условию ГруппыДоступа
// ...
ИспользоватьСписок(СписокРазрешенных);
КонецЕсли;
КонецПроцедуры
Этот метод позволяет скрыть «лишние» товары из общего списка, однако помните: это лишь «защита от дурака». Пользователь с навыками работы с отчетами все равно сможет увидеть запрещенные данные, если отчеты не будут доработаны.
Чтобы система безопасности работала надежно, необходимо вмешаться в формирование любого запроса к базе данных. Здесь есть два пути:
Путь А: Ручная доработка. Вы создаете глобальную функцию, которая возвращает текстовую строку с условием (фильтром) для запроса. Например: Номенклатура.ГруппаДоступа = :ВыбраннаяГруппа. Каждое обращение к базе данных в отчетах должно принудительно дополняться этим условием в блоке ГДЕ.
Путь Б: Централизованный класс доступа. Создайте специализированный класс или модуль, который будет отвечать за «политику безопасности». Суть в том, чтобы все отчеты обращались к этому классу для получения текста фильтра. Это упрощает поддержку — при изменении логики вам не придется переписывать каждый отчет отдельно.
Если проект требует высокого уровня безопасности, программных методов внутри конфигурации может быть недостаточно. Рассмотрим два альтернативных подхода:
WHERE. Это самый эффективный способ защитить данные, не затрагивая код всех отчетов.При реализации системы ограничения доступа всегда держите в уме следующие принципы:
ИспользоватьСписок() работает только в интерактивных формах. Для фоновых заданий или отчетов, запускаемых программно, он бесполезен.Реализация ограничения доступа — это сложная, но решаемая задача. Главное — подходить к ней системно, обеспечивая покрытие фильтрами всех точек доступа к данным.