Почему документы видны в списках и отчетах после настройки RLS и как их скрыть?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

Разграничение прав доступа на уровне записей (RLS — Record Level Security) — один из самых мощных, но в то же время коварных инструментов платформы «1С:Предприятие 8». Часто разработчики сталкиваются с ситуацией, когда после настройки ограничения на чтение документа (например, по реквизиту НеОтображатьДокумент в конфигурации «Бухгалтерия предприятия 3.0») пользователи всё равно продолжают видеть этот документ в списках, журналах или бухгалтерских отчетах вроде «Карточки счета», хотя зайти в него уже не могут.

В этой статье мы подробно разберем, почему так происходит, проанализируем внутренние механизмы платформы и рассмотрим несколько практических способов полного скрытия документов как в интерфейсе, так и в отчетности.

---

Причина №1: Неправильно выбранные поля ограничения в роли

Проанализируем типичную ошибку при создании роли в конфигураторе. При настройке ограничения доступа на чтение для объекта метаданных (например, Документ.ПоступлениеНаРасчетныйСчет) разработчик часто указывает в качестве ограничиваемых полей значение <Прочие поля>.

Почему это не работает для скрытия документов?

В платформе «1С» права на чтение могут накладываться на отдельные реквизиты объекта. Если мы накладываем ограничение только на <Прочие поля>, то ключевые стандартные реквизиты — такие как Ссылка, Дата, Номер, Проведен и ПометкаУдаления — остаются доступными для чтения без каких-либо условий. Платформа делает это умышленно, чтобы в связанных объектах или отчетах, где присутствует ссылка на данный документ, не возникало критических ошибок доступа и пугающей пользователя надписи <Объект не найден>.

Поскольку динамические списки и журналы документов в первую очередь запрашивают именно ссылку и стандартные реквизиты для построения представления (например, «Поступление на расчетный счет № 15 от 10.10.2023»), строки документов отображаются в списке. Но как только пользователь пытается открыть форму документа, система пытается прочитать «прочие поля» (содержимое шапки и табличных частей), натыкается на ограничение и выдает ошибку «Недостаточно прав».

Решение:

Чтобы документ полностью исчез из стандартных списков самого объекта, необходимо наложить ограничение на поле <Все поля> или отдельно продублировать условие ограничения для поля Ссылка.

Рассмотрим пример правильного текста ограничения в конфигураторе для роли на чтение документа:


ПоступлениеНаРасчетныйСчет ГДЕ НЕ ПоступлениеНаРасчетныйСчет.НеОтображатьДокумент

Это условие должно быть применено ко <Всем полям> таблицы документа.

---

Причина №2: Оптимизированные журналы БСП и регистр «Данные первичных документов»

Даже если мы полностью закрыли права на уровне самого документа (включая <Все поля>), в современных конфигурациях на базе БСП (включая «Бухгалтерию предприятия 3.0») документ может продолжать отображаться в общих журналах (например, «Банковские выписки» или «Документы покупателей»).

Выясним причину:

Для ускорения работы интерфейса динамические списки многих журналов строятся не по физическим таблицам документов, а по специальному вспомогательному регистру сведений «Данные первичных документов». При записи или проведении документов их основные реквизиты (дата, номер, сумма, контрагент, организация) дублируются в этот регистр. Если мы закрыли сам документ, но не закрыли записи в этом регистре, система спокойно прочитает строку из регистра сведений и выведет её в журнал.

Решение:

Необходимо добавить аналогичные условия RLS на чтение для регистра сведений РегистрСведений.ДанныеПервичныхДокументов. Ограничение должно проверять тип и реквизиты документа-источника:


ДанныеПервичныхДокументов ГДЕ НЕ (ВЫРАЗИТЬ(ДанныеПервичныхДокументов.Документ КАК Документ.ПоступлениеНаРасчетныйСчет).НеОтображатьДокумент)

---

Причина №3: Бухгалтерские отчеты и Регистр бухгалтерии

Самая большая сложность возникает с отчетами, такими как «Карточка счета» или «Оборотно-сальдовая ведомость». Пользователи продолжают видеть проводки скрытых документов.

Проанализируем ситуацию:

Любые стандартные бухгалтерские отчеты получают данные не из документов, а напрямую из таблиц регистра бухгалтерии «Хозрасчетный». Документ там фигурирует лишь как значение субконто или в системном поле Регистратор. Если мы закрыли доступ к самому документу, но не трогали регистр бухгалтерии, то:

  1. Все суммы проводок и движения по счетам останутся полностью видимыми для пользователя.
  2. Если у пользователя есть доступ к ссылке документа (был ограничен только <Прочие поля>), в колонке «Регистратор» будет отображаться название документа.
  3. Если доступ к ссылке закрыт полностью (ограничены <Все поля>), то вместо названия документа в отчете отобразится строка <Объект не найден...>, но сами финансовые данные пользователь всё равно увидит!

Почему сложно настроить RLS на регистр бухгалтерии?

Попытка наложить ограничение RLS на регистр бухгалтерии «Хозрасчетный» с проверкой реквизитов регистратора через соединение (LEFT JOIN) приведет к катастрофическому падению производительности всей системы. СУБД будет вынуждена при формировании любого отчета выполнять сложнейшие проверки для миллионов записей проводок.

Решение:

В типовых конфигурациях разграничение прав в отчетах на уровне записей реализуют только по балансовым измерениям — например, по Организациям или Подразделениям. Если вам критически важно скрыть определенные операции (например, выплату зарплаты или конфиденциальные расходы):

---

Альтернативное решение: Использование расширений конфигурации

Если внедрение классического RLS кажется слишком громоздким или существенно замедляет работу базы данных, мы можем пойти по пути программного ограничения видимости в формах списков с помощью механизма расширений.

Рассмотрим, как это реализовать по шагам:

Шаг 1. Создание расширения и заимствование формы

Создадим новое расширение конфигурации. Заимствуем в него форму списка документа (например, ФормаСписка документа ПоступлениеНаРасчетныйСчет).

Шаг 2. Программное наложение отбора в динамическом списке

В модуле заимствованной формы напишем обработчик события ПриСозданииНаСервере, в котором установим фиксированный отбор для динамического списка. Этот отбор будет срабатывать только для пользователей, у которых нет административных прав.

Посмотрим на пример кода:


&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Проверяем, нужно ли применять ограничение для текущего пользователя
    Если Не РольДоступна("ПолныеПрава") Тогда
        
        // Находим или создаем элемент отбора динамического списка
        СписокАдрес = ДинамическийСписокСтрокой(Список);
        
        // Используем стандартные механизмы БСП для установки отбора
        ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
            Список, 
            "НеОтображатьДокумент", 
            Ложь, 
            ВидСравненияКомпоновкиДанных.Равно, 
            "ИсключитьСкрытыеДокументы", 
            Истина
        );
        
    КонецЕсли;
    
КонецПроцедуры

Этот способ гарантирует, что в самом списке документов пользователь никогда не увидит отмеченные флажком документы. При этом производительность системы останется на высоком уровне.

Однако помните: программное скрытие строк в форме списка не является полноценной защитой безопасности. Продвинутый пользователь сможет увидеть эти данные через универсальные отчеты, консоль запросов или получив к ним доступ программно через внешнюю обработку. Поэтому для надежной защиты конфиденциальных данных всегда следует комбинировать программные интерфейсные ограничения с архитектурным разделением прав доступа на уровне СУБД.

← На главную