Почему при открытии варианта отчета по навигационной ссылке возникает ошибка прав доступа?

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

При администрировании прав пользователей в конфигурациях на базе БСП (Библиотеки Стандартных Подсистем), таких как 1С:ERP Управление предприятием, часто возникает нетипичная ситуация. Пользователь имеет полные права на сам отчет (например, «Исполнение плана производства»): он может без ограничений открывать его через командный интерфейс или панель отчетов, выбирать варианты, изменять параметры и формировать результат. Однако стоит коллеге отправить ему прямую навигационную ссылку на конкретный вариант отчета, как при попытке перехода система выдает исключение: «Недостаточно прав для просмотра» или «Вариант отчета не существует».

Разберем детально механизм возникновения этой коллизии, проанализируем типовой код подсистемы вариантов отчетов БСП и рассмотрим пути решения возникшей проблемы.

В чем разница между интерактивным открытием отчета и переходом по ссылке

Проанализируем механику работы платформы и библиотеки БСП в обоих случаях:

  1. Интерактивное открытие через интерфейс. Когда пользователь выбирает отчет в меню подсистемы или на панели отчетов, платформа проверяет право Просмотр на объект метаданных Отчет.<ИмяОтчета>. Если право есть, открывается основная форма отчета, после чего применяются стандартные настройки схемы компоновки данных (СКД). Полномочия на чтение служебных справочников при этом могут даже не задействоваться в явном виде.
  2. Переход по внешней навигационной ссылке. Когда пользователь получает ссылку через меню («Получить ссылку»), формируется адрес навигации не на сам объект метаданных, а на конкретный элемент справочника: e1cib/data/Справочник.ВариантыОтчетов?ref=.... При переходе по такому адресу система запускает сценарий поиска и инициализации сохраненного варианта отчета в контексте справочника ВариантыОтчетов.

Анализ кода проверки прав в БСП

Посмотрим на типовой алгоритм, который выполняется на стороне сервера при попытке открыть вариант отчета по переданной ссылке:


ТекстЗапроса =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |    ВариантыОтчетов.Отчет,
    |    ВариантыОтчетов.ТипОтчета,
    |    ВариантыОтчетов.КлючВарианта,
    |    ВариантыОтчетов.ПредопределенныйВариант.КлючЗамеров КАК КлючЗамеров
    |ИЗ
    |    Справочник.ВариантыОтчетов КАК ВариантыОтчетов
    |ГДЕ
    |    ВариантыОтчетов.Ссылка = &Ссылка";

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", ВариантСсылка);
Запрос.Текст = ТекстЗапроса;

Выборка = Запрос.Выполнить().Выбрать();
Если Не Выборка.Следующий() Тогда
    УстановитьПривилегированныйРежим(Истина);
    Выборка = Запрос.Выполнить().Выбрать();
    УстановитьПривилегированныйРежим(Ложь);
    Если Выборка.Следующий() Тогда
        ВызватьИсключение(НСтр("ru = 'Недостаточно прав для просмотра.';
                                |en = 'Insufficient rights to view the report.'"), КатегорияОшибки.НарушениеПравДоступа);
    Иначе
        ВызватьИсключение НСтр("ru = 'Вариант отчета не существует.';
                                |en = 'The report option does not exist.'");
    КонецЕсли;
КонецЕсли;

Выясним причину такого поведения запроса. В тексте присутствует ключевое слово РАЗРЕШЕННЫЕ. Сначала запрос выполняется в обычном пользовательском сеансе. Если на справочник ВариантыОтчетов наложены ограничения на уровне записей (RLS) или у пользователя вовсе нет роли на чтение данного справочника, запрос не вернет ни одной строки.

Далее срабатывает ветка проверки: код повторно выполняет этот же запрос, но уже внутри блока УстановитьПривилегированныйРежим(Истина). Если в привилегированном режиме строка успешно находится, система однозначно делает вывод: запись в базе существует, но текущему пользователю закрыт к ней доступ по правам. В этот момент и генерируется исключение Недостаточно прав для просмотра.

Влияние механизма RLS (ограничения доступа на уровне записей)

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


#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
ВариантыОтчетов ГДЕ (ВариантыОтчетов.Пользовательский = ЛОЖЬ
            ИЛИ ВариантыОтчетов.ТолькоДляАвтора = ЛОЖЬ
            ИЛИ ВариантыОтчетов.Автор = &АвторизованныйПользователь)
#КонецЕсли

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

  1. Вариант является предопределенным (Пользовательский = ЛОЖЬ).
  2. Вариант общедоступен, то есть флаг «Только для автора» снят (ТолькоДляАвтора = ЛОЖЬ).
  3. Пользователь сам является создателем этого варианта (Автор = &АвторизованныйПользователь).

Если отправитель сохранил вариант отчета со статусом «Только мне», то получатель ссылки гарантированно натолкнется на блокировку RLS.

Способы решения проблемы

Разберем по шагам, как исправить эту ошибку и обеспечить стабильную работу пользователей с навигационными ссылками.

1. Назначение базовых ролей на справочник вариантов отчетов

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

  1. Чтение вариантов отчетов;
  2. Добавление и изменение вариантов отчетов (или Чтение вариантов отчетов (кроме личных)).

Добавьте соответствующие роли в профиль доступа пользователя и проверьте повторное открытие ссылки.

2. Проверка видимости варианта автором

Если роли назначены, но ошибка сохраняется, проанализируем настройки видимости самого варианта:

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

3. Актуализация ключей доступа RLS

В современных версиях 1С:ERP используется режим производительного («универсального») ограничения доступа на уровне записей. В этом режиме права рассчитываются заранее фоновыми заданиями и записываются в регистры сведений ключей доступа. Если права были назначены недавно, а регламентные процедуры еще не завершились, доступ по ссылке будет заблокирован.

Для принудительного обновления ключей перейдите в раздел «НСИ и администрирование» → «Обслуживание» → «Управление доступом» (или «Корректировка данных») и выполните процедуру срочного обновления прав доступа.

4. Альтернативный способ передачи ссылки

Если требуется передать коллеге именно исходную форму отчета без привязки к конкретной записи справочника личных настроек, используйте навигационную ссылку на команду открытия отчета вида e1cib/app/Отчет.<ИмяОтчета>. По такой ссылке пользователь сразу попадет в стандартную форму объекта метаданных без проверок прав на личные варианты других сотрудников.

← На главную