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