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