Почему пропадает группировка в отчете СКД под ограниченными правами?

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

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

Различие между правами «Чтение» и «Просмотр»

Первое и самое важное, что нам необходимо проанализировать — это разницу между правами доступа в метаданных. Многие разработчики полагают, что права Чтение достаточно для того, чтобы СКД могла выбрать данные. Однако это не совсем так.

Разберем механизм работы компоновщика:

  1. Право «Чтение» позволяет коду запроса получить данные из таблицы базы данных.
  2. Право «Просмотр» определяет, будет ли это поле доступно в пользовательском интерфейсе и механизмах компоновки.

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

Влияние конструкции «ВЫБРАТЬ РАЗРЕШЕННЫЕ»

Использование в запросе конструкции ВЫБРАТЬ РАЗРЕШЕННЫЕ является стандартом для работы в условиях ограниченных прав (RLS). Однако важно понимать, что эта директива лишь предотвращает возникновение ошибки «Недостаточно прав для работы с таблицей». Она не «чинит» группировки.

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

Проблема доступа к регистраторам в регистрах

Одной из неочевидных причин исчезновения группировок является работа с регистрами (накопления или сведений). Выясним причину, связанную с полем Регистратор.

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

Если группировка строится по измерению, которое связано с типом данных, на который у пользователя нет прав, или если логика компоновщика «спотыкается» о недоступный тип в составном поле, группировка пропадет. Решением здесь будет предоставление прав на чтение и просмотр всех документов-регистраторов данного регистра.

Роли полей в схеме компоновки данных

Рассмотрим еще один технический нюанс — настройки на закладке «Наборы данных» в СКД. У каждого поля есть колонка «Роли». Проанализируем следующие параметры:

  1. Ограничение поля: Если стоит галочка в колонке «Ограничение группировки», то это поле в принципе нельзя будет использовать для группировки в пользовательских настройках.
  2. Обязательное поле: Если поле помечено как обязательное, но на него нет прав, отчет может вообще не сформироваться.
  3. Игнорировать значения NULL: Если из-за ограничений прав доступа поле превращается в NULL, настройки группировки могут заставить систему «схлопнуть» эти записи.

Влияние функциональных опций

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

Для СКД это равносильно тому, что поля не существует в метаданных. Если ваша группировка настроена по полю Партнер, а функциональная опция «Использовать партнеров» выключена, группировка исчезнет без каких-либо предупреждений и ошибок.

Автозаполнение и защитные механизмы СКД

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

Разберем по шагам, что делает компоновщик при нехватке прав:

  1. Система анализирует запрос и права текущего пользователя.
  2. Если обнаруживается соединение с таблицей, на которую нет прав, СКД пытается «спасти» отчет и исключает из итогового запроса все поля, связанные с этой запрещенной таблицей.
  3. Если исключенное поле было единственным полем в группировке, группировка удаляется из макета компоновки.

Как провести диагностику (пошаговый алгоритм)

Чтобы понять, куда именно пропадают данные, выполним следующие действия:

  1. Вывод детальных записей: Временно добавим в настройки отчета группировку «Детальные записи» и выведем туда все поля, которые используются в «проблемной» группировке. Если в детальных записях колонки пусты или отсутствуют — проблема точно в правах Просмотр или RLS.
  2. Проверка прав на регистраторы: Если отчет по регистру, дадим пользователю права на чтение всех документов, которые являются регистраторами для этого регистра.
  3. Анализ RLS: Попробуем временно отключить RLS для этого объекта в тестовой базе. Если группировка появится — нужно копать в сторону условий ограничения доступа на уровне записей.
  4. Проверка ФО: Убедимся, что все функциональные опции, влияющие на реквизиты, включены.

Пример правильной настройки доступа в коде

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

Пример проверки прав программным способом перед выполнением отчета:


Если НЕ ПравоДоступа("Просмотр", Метаданные.Справочники.Партнеры) Тогда
    Сообщить("У вас недостаточно прав для отображения группировки по партнерам!");
КонецЕсли;

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

← На главную