Как корректно отобразить представление документа в отчете, если у пользователя нет прав на чтение объекта?

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

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

Причина возникновения проблемы

Когда отчет выводит ссылку на документ, платформа 1С пытается автоматически получить строковое представление этого объекта для отображения. Если у пользователя недостаточно прав на чтение, система блокирует доступ к данным и, не имея возможности «дочитать» объект, подставляет строку Объект не найден. Это поведение является стандартным механизмом защиты данных.

Способ 1: Ручное формирование представления в привилегированном режиме

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

Рассмотрим алгоритм действий:

  1. При получении данных для отчета (например, при заполнении набора данных СКД) используйте общий модуль, у которого установлен флаг Привилегированный.
  2. Вместо передачи ссылок на документы, для которых нет прав, или в дополнение к ним, сформируйте отдельное текстовое поле с представлением.
  3. Используйте данные метаданных (синоним документа), номер и дату для сборки строки.

Пример программной реализации:


// Выполняется в привилегированном модуле
Функция ПолучитьПредставлениеДокумента(СсылкаНаДокумент) Экспорт
    Если ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
        Выборка = ВыбратьДанные(СсылкаНаДокумент); // Получаем номер и дату
        Возврат СтрШаблон("%1 №%2 от %3", 
            СсылкаНаДокумент.Метаданные().Синоним, 
            Выборка.Номер, 
            Формат(Выборка.Дата, "ДЛФ=Д"));
    КонецЕсли;
    Возврат "";
КонецФункции

Способ 2: Запрос примитивных полей

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

Важно помнить: если СКД видит, что поле имеет тип ДокументСсылка, она может попытаться «дотянуть» представление объекта автоматически. В таких случаях лучше выводить в отчет уже подготовленную строку, а ссылку скрывать или использовать только для внутренних нужд.

Способ 3: Настройка RLS на уровне полей

Иногда допустимо немного расширить права доступа, не открывая документ целиком. Можно создать роль, в которой для полей Номер и Дата задано условие ГДЕ ИСТИНА. Таким образом, платформа сможет самостоятельно получить значения реквизитов, необходимых для формирования стандартного представления, не предоставляя пользователю права на чтение содержимого самого документа.

Однако будьте осторожны: этот метод делает данные поля доступными повсеместно в системе, где используется данное RLS, что может привести к утечке информации в других отчетах или списках.

Рекомендации по реализации

При выборе метода учитывайте следующие советы:

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

← На главную