При администрировании прав пользователей в конфигурациях на базе БСП (Библиотеки Стандартных Подсистем), таких как 1С:ERP Управление предприятием, часто возникает нетипичная ситуация. Пользователь имеет полные права на сам отчет (например, «Исполнение плана производства»): он может без ограничений открывать его через командный интерфейс или панель отчетов, выбирать варианты, изменять параметры и формировать результат. Однако стоит коллеге отправить ему прямую навигационную ссылку на конкретный вариант отчета, как при попытке перехода система выдает исключение: «Недостаточно прав для просмотра» или «Вариант отчета не существует».
Разберем детально механизм возникновения этой коллизии, проанализируем типовой код подсистемы вариантов отчетов БСП и рассмотрим пути решения возникшей проблемы.
Проанализируем механику работы платформы и библиотеки БСП в обоих случаях:
Просмотр на объект метаданных Отчет.<ИмяОтчета>. Если право есть, открывается основная форма отчета, после чего применяются стандартные настройки схемы компоновки данных (СКД). Полномочия на чтение служебных справочников при этом могут даже не задействоваться в явном виде.e1cib/data/Справочник.ВариантыОтчетов?ref=.... При переходе по такому адресу система запускает сценарий поиска и инициализации сохраненного варианта отчета в контексте справочника ВариантыОтчетов.Посмотрим на типовой алгоритм, который выполняется на стороне сервера при попытке открыть вариант отчета по переданной ссылке:
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВариантыОтчетов.Отчет,
| ВариантыОтчетов.ТипОтчета,
| ВариантыОтчетов.КлючВарианта,
| ВариантыОтчетов.ПредопределенныйВариант.КлючЗамеров КАК КлючЗамеров
|ИЗ
| Справочник.ВариантыОтчетов КАК ВариантыОтчетов
|ГДЕ
| ВариантыОтчетов.Ссылка = &Ссылка";
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", ВариантСсылка);
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();
Если Не Выборка.Следующий() Тогда
УстановитьПривилегированныйРежим(Истина);
Выборка = Запрос.Выполнить().Выбрать();
УстановитьПривилегированныйРежим(Ложь);
Если Выборка.Следующий() Тогда
ВызватьИсключение(НСтр("ru = 'Недостаточно прав для просмотра.';
|en = 'Insufficient rights to view the report.'"), КатегорияОшибки.НарушениеПравДоступа);
Иначе
ВызватьИсключение НСтр("ru = 'Вариант отчета не существует.';
|en = 'The report option does not exist.'");
КонецЕсли;
КонецЕсли;
Выясним причину такого поведения запроса. В тексте присутствует ключевое слово РАЗРЕШЕННЫЕ. Сначала запрос выполняется в обычном пользовательском сеансе. Если на справочник ВариантыОтчетов наложены ограничения на уровне записей (RLS) или у пользователя вовсе нет роли на чтение данного справочника, запрос не вернет ни одной строки.
Далее срабатывает ветка проверки: код повторно выполняет этот же запрос, но уже внутри блока УстановитьПривилегированныйРежим(Истина). Если в привилегированном режиме строка успешно находится, система однозначно делает вывод: запись в базе существует, но текущему пользователю закрыт к ней доступ по правам. В этот момент и генерируется исключение Недостаточно прав для просмотра.
Даже если у пользователя есть общие права на чтение справочника вариантов, в действие может вступить шаблон RLS. Посмотрим на типовое ограничение, наложенное на справочник ВариантыОтчетов:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
ВариантыОтчетов ГДЕ (ВариантыОтчетов.Пользовательский = ЛОЖЬ
ИЛИ ВариантыОтчетов.ТолькоДляАвтора = ЛОЖЬ
ИЛИ ВариантыОтчетов.Автор = &АвторизованныйПользователь)
#КонецЕсли
Из этого условия видно, что обычный пользователь может прочитать вариант только в трех ситуациях:
Пользовательский = ЛОЖЬ).ТолькоДляАвтора = ЛОЖЬ).Автор = &АвторизованныйПользователь).Если отправитель сохранил вариант отчета со статусом «Только мне», то получатель ссылки гарантированно натолкнется на блокировку RLS.
Разберем по шагам, как исправить эту ошибку и обеспечить стабильную работу пользователей с навигационными ссылками.
В первую очередь необходимо убедиться, что у пользователя в профиле групп доступа включены роли, отвечающие за чтение вариантов отчетов. В типовых конфигурациях для этого используются специализированные роли:
Чтение вариантов отчетов;Добавление и изменение вариантов отчетов (или Чтение вариантов отчетов (кроме личных)).Добавьте соответствующие роли в профиль доступа пользователя и проверьте повторное открытие ссылки.
Если роли назначены, но ошибка сохраняется, проанализируем настройки видимости самого варианта:
В современных версиях 1С:ERP используется режим производительного («универсального») ограничения доступа на уровне записей. В этом режиме права рассчитываются заранее фоновыми заданиями и записываются в регистры сведений ключей доступа. Если права были назначены недавно, а регламентные процедуры еще не завершились, доступ по ссылке будет заблокирован.
Для принудительного обновления ключей перейдите в раздел «НСИ и администрирование» → «Обслуживание» → «Управление доступом» (или «Корректировка данных») и выполните процедуру срочного обновления прав доступа.
Если требуется передать коллеге именно исходную форму отчета без привязки к конкретной записи справочника личных настроек, используйте навигационную ссылку на команду открытия отчета вида e1cib/app/Отчет.<ИмяОтчета>. По такой ссылке пользователь сразу попадет в стандартную форму объекта метаданных без проверок прав на личные варианты других сотрудников.