Как запретить просмотр документа-регистратора из регистра бухгалтерии в 1С

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

При разработке систем учета на базе платформы 1С часто возникает задача ограничить доступ пользователей к первичным документам. Типичный пример — необходимость скрыть подробности начисления заработной платы или конфиденциальные расчеты с контрагентами. Пользователь должен видеть итоги в оборотно-сальдовой ведомости, но не должен иметь возможности «провалиться» в сам документ (регистратор), чтобы посмотреть детали. В этой статье мы подробно разберем, как реализовать такой запрет, используя механизм RLS, подписки на события и настройки отчетов.

Особенности работы RLS в регистрах бухгалтерии

Проанализируем сначала стандартную ошибку: попытку наложить ограничение непосредственно на таблицу регистра бухгалтерии. Разберем, почему это не всегда эффективно. Если мы установим условие Где Счет <> &СчетЗарплаты в RLS регистра, пользователь просто перестанет видеть записи по этому счету. Итоги в отчетах (например, в ОСВ) «поползут», так как система физически не сможет прочитать данные для расчета сальдо и оборотов.

Выясним причину: для того чтобы отчеты строились корректно, пользователю необходимы права на Чтение регистра. Однако право на чтение регистра не означает автоматического права на просмотр самого документа-регистратора. Рассмотрим пошагово, как правильно настроить ограничения на уровне метаданных документов.

Метод 1. Настройка RLS на объекты метаданных (Документы)

Самый надежный способ — это ограничение прав на чтение самих типов документов, которые делают движения по «секретным» счетам. Однако здесь есть важный нюанс: если полностью запретить чтение документа, то в отчетах вместо названия документа пользователь увидит надпись Объект не найден. Это выглядит непрофессионально и мешает идентификации записей.

Рассмотрим правильный подход к настройке полей в RLS:

  1. Выберем роль, для которой нужно настроить ограничение.
  2. Найдем в списке документов те виды, которые являются регистраторами для интересующего нас регистра бухгалтерии.
  3. Для каждого документа создадим две строки ограничений доступа к данным.

Первая строка должна разрешать чтение стандартных реквизитов, необходимых для визуального представления в отчете. К ним относятся Дата, Номер и ПометкаУдаления. В поле «Поля» выберем эти реквизиты, а в условии укажем ГДЕ ИСТИНА.

Вторая строка будет ограничивать доступ к самому ссылочному полю и остальным реквизитам. Для поля Ссылка (и всех остальных данных) укажем условие, которое будет проверять, содержит ли документ проводки по запрещенным счетам. Проанализируем пример такого условия (запроса):


ГДЕ НЕ Ссылка В 
    (ВЫБРАТЬ РАЗЛИЧНЫЕ Т.Регистратор 
     ИЗ РегистрБухгалтерии.Хозрасчетный Т 
     ГДЕ Т.Счет В (&ЗапрещенныеСчета))

Важный момент: использование подзапросов к таблицам движений внутри RLS может существенно замедлить работу системы, если документов и проводок очень много. Поэтому рассмотрим более легкие способы реализации запрета.

Метод 2. Ограничение интерактивного открытия через расширение или подписки

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

Разберем вариант с использованием расширения. Мы можем создать общую процедуру для группы документов или перехватить событие ПриСозданииНаСервере для конкретных форм. Посмотрим на пример кода, который можно разместить в расширении формы документа:


&НаСервере
Процедура Запрет_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    Если Не РольДоступна("ПолныеПрава") Тогда
        Если Объект.СчетЗатрат = ПланыСчетов.Хозрасчетный.Зарплата Тогда
            ТекстСообщения = "У вас недостаточно прав для просмотра данного документа.";
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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


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

Метод 3. Использование прав «Чтение» и «Просмотр»

Выясним разницу между правами в конфигураторе. В 1С существует разделение на право Чтение и право Просмотр. Чтение — позволяет коду (серверу) получать данные из базы. Этого достаточно для формирования отчетов и итогов. Просмотр — позволяет пользователю видеть объект в интерфейсе (списки, формы).

Если в роли убрать галочку Просмотр для документа, но оставить Чтение, пользователь увидит представление документа в отчете, но при попытке дважды кликнуть по нему система просто ничего не сделает или выдаст стандартное предупреждение. Это самый простой способ «заблокировать» регистратор без написания сложного кода RLS или подписок.

Метод 4. Настройка расшифровки в СКД

Если основной доступ к регистраторам происходит через отчеты, построенные на Системе компоновки данных (СКД), мы можем программно управлять расшифровкой. Рассмотрим подробнее, как это работает. В настройках полей набора данных для поля Регистратор можно указать выражение расшифровки.

Проанализируем алгоритм:

  1. В схеме компоновки данных найдем поле Регистратор.
  2. В колонке «Оформление» или через настройки параметров поля укажем, что расшифровка недоступна, если выполняется определенное условие (например, если в группировке присутствует защищенный счет).
  3. Также можно в обработчике события ОбработкаРасшифровки в модуле формы отчета прописать проверку прав перед тем, как открыть документ.

Рекомендации по производительности и безопасности

Подведем итог и выберем оптимальную стратегию. Использование RLS — это наиболее защищенный метод, так как он работает на уровне СУБД и его невозможно обойти через внешние обработки или поиск ссылок. Но он требует тщательной настройки полей (Дата, Номер), чтобы не испортить интерфейс отчетов надписями Объект не найден.

Если же требования безопасности не столь критичны и нужно просто «спрятать» документ от случайного открытия, лучше использовать сочетание прав Чтение/Просмотр и подписки на события. Это обеспечит высокую скорость работы системы и при этом решит задачу пользователя.

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

← На главную