При работе с отчетами в системе 1С:Предприятие часто возникает ситуация, когда пользователю нужно видеть информацию о документах (например, их номер и дату), но при этом он не имеет доступа к самим объектам из-за настроенных ограничений прав доступа RLS. В результате вместо ожидаемого представления система выводит сообщение Объект не найден. Разберем, почему это происходит и как грамотно решить данную задачу.
Когда отчет выводит ссылку на документ, платформа 1С пытается автоматически получить строковое представление этого объекта для отображения. Если у пользователя недостаточно прав на чтение, система блокирует доступ к данным и, не имея возможности «дочитать» объект, подставляет строку Объект не найден. Это поведение является стандартным механизмом защиты данных.
Этот подход является наиболее надежным и безопасным. Суть его заключается в том, чтобы не полагаться на автоматическое вычисление представления платформой, а подготовить его вручную, используя Привилегированный режим.
Рассмотрим алгоритм действий:
СКД) используйте общий модуль, у которого установлен флаг Привилегированный.Пример программной реализации:
// Выполняется в привилегированном модуле
Функция ПолучитьПредставлениеДокумента(СсылкаНаДокумент) Экспорт
Если ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
Выборка = ВыбратьДанные(СсылкаНаДокумент); // Получаем номер и дату
Возврат СтрШаблон("%1 №%2 от %3",
СсылкаНаДокумент.Метаданные().Синоним,
Выборка.Номер,
Формат(Выборка.Дата, "ДЛФ=Д"));
КонецЕсли;
Возврат "";
КонецФункции
Если отчет построен на запросе, попробуйте изменить структуру получения данных. Вместо запроса ссылки целиком, выберите отдельные реквизиты: Дата, Номер, Ссылка. Платформа не будет пытаться получить доступ ко всему объекту, если в запросе используются только примитивные поля заголовка. Далее представление можно собрать уже в коде отчета.
Важно помнить: если СКД видит, что поле имеет тип ДокументСсылка, она может попытаться «дотянуть» представление объекта автоматически. В таких случаях лучше выводить в отчет уже подготовленную строку, а ссылку скрывать или использовать только для внутренних нужд.
Иногда допустимо немного расширить права доступа, не открывая документ целиком. Можно создать роль, в которой для полей Номер и Дата задано условие ГДЕ ИСТИНА. Таким образом, платформа сможет самостоятельно получить значения реквизитов, необходимых для формирования стандартного представления, не предоставляя пользователю права на чтение содержимого самого документа.
Однако будьте осторожны: этот метод делает данные поля доступными повсеместно в системе, где используется данное RLS, что может привести к утечке информации в других отчетах или списках.
При выборе метода учитывайте следующие советы:
СКД старайтесь передавать во внешний набор данных уже готовые текстовые представления. Это избавит систему от необходимости «дочитывать» ссылки при выводе, что существенно повышает производительность отчета.Таким образом, решив задачу через формирование текстового представления в привилегированном коде, мы обеспечиваем корректное отображение отчетов для всех пользователей, независимо от их прав доступа к конкретным объектам, сохраняя при этом целостность системы безопасности.