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