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