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