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