В практике разработки на платформе 1С:Предприятие 8.3 часто встречается ситуация: отчет, созданный с помощью Системы компоновки данных (СКД), прекрасно работает под полными правами, но стоит запустить его пользователю с ограниченными ролями, как структура отчета «рассыпается». Чаще всего это выражается в том, что настроенные группировки просто исчезают из итогового результата. Рассмотрим подробно, почему это происходит и как исправить ситуацию, опираясь на механизмы работы платформы.
Первое и самое важное, что нам необходимо проанализировать — это разницу между правами доступа в метаданных. Многие разработчики полагают, что права Чтение достаточно для того, чтобы СКД могла выбрать данные. Однако это не совсем так.
Разберем механизм работы компоновщика:
Если у пользователя есть право Чтение, но отсутствует право Просмотр на поле, которое выбрано в качестве группировки, СКД считает это поле «недоступным». В результате система компоновки данных просто исключает группировку из итогового макета компоновки, так как «не видит» поля, по которому нужно объединять записи. Проверим настройки ролей и убедимся, что для всех полей, участвующих в группировках, флаг «Просмотр» установлен.
Использование в запросе конструкции ВЫБРАТЬ РАЗРЕШЕННЫЕ является стандартом для работы в условиях ограниченных прав (RLS). Однако важно понимать, что эта директива лишь предотвращает возникновение ошибки «Недостаточно прав для работы с таблицей». Она не «чинит» группировки.
Проанализируем ситуацию: если запрос возвращает пустой набор записей из-за ограничений RLS на уровне строк, СКД нечего будет группировать. В системе компоновки данных реализована логика: если в группировку не попадает ни одной записи (или все поля группировки скрыты правами), сама секция группировки может не отображаться в итоговом документе. Это особенно актуально, когда группировка является иерархической.
Одной из неочевидных причин исчезновения группировок является работа с регистрами (накопления или сведений). Выясним причину, связанную с полем Регистратор.
Поле Регистратор имеет составной тип данных, включающий в себя все документы, которые могут делать движения по данному регистру. Если вы строите отчет по регистру и в запросе или настройках компоновки неявно задействовано поле регистратора (например, через обращение к его реквизитам), отсутствие прав на просмотр хотя бы одного типа документа, входящего в состав регистратора, может привести к исключению поля из выборки.
Если группировка строится по измерению, которое связано с типом данных, на который у пользователя нет прав, или если логика компоновщика «спотыкается» о недоступный тип в составном поле, группировка пропадет. Решением здесь будет предоставление прав на чтение и просмотр всех документов-регистраторов данного регистра.
Рассмотрим еще один технический нюанс — настройки на закладке «Наборы данных» в СКД. У каждого поля есть колонка «Роли». Проанализируем следующие параметры:
NULL, настройки группировки могут заставить систему «схлопнуть» эти записи.Посмотрим на ситуацию со стороны функциональных опций (ФО). Если поле, по которому выполняется группировка, или реквизит, используемый в соединении таблиц, привязан к функциональной опции, которая отключена для текущего пользователя, это поле полностью исключается из системы компоновки.
Для СКД это равносильно тому, что поля не существует в метаданных. Если ваша группировка настроена по полю Партнер, а функциональная опция «Использовать партнеров» выключена, группировка исчезнет без каких-либо предупреждений и ошибок.
В настройках набора данных СКД часто включен флаг «Автозаполнение». Это удобный механизм, который сам определяет доступные поля и связи. Однако при ограничении прав он может сыграть злую шутку.
Разберем по шагам, что делает компоновщик при нехватке прав:
Чтобы понять, куда именно пропадают данные, выполним следующие действия:
Просмотр или RLS.Иногда проблему можно решить программно, принудительно устанавливая параметры доступа, но чаще всего это решается в конфигураторе. Тем не менее, если вы формируете отчет программно, убедитесь, что вы не используете привилегированный режим там, где это может скрыть ошибки настройки прав.
Пример проверки прав программным способом перед выполнением отчета:
Если НЕ ПравоДоступа("Просмотр", Метаданные.Справочники.Партнеры) Тогда
Сообщить("У вас недостаточно прав для отображения группировки по партнерам!");
КонецЕсли;
Подведем итог: исчезновение группировки в СКД — это не баг платформы, а следствие работы механизмов безопасности. Основные «точки входа» для решения проблемы: право «Просмотр», доступ к регистраторам и проверка функциональных опций. Внимательный аудит этих настроек позволяет вернуть отчету его правильный вид для любого пользователя. Для комплексного аудита ролей, профилей и ограничений доступа подойдёт обработка для анализа и настройки прав доступа.