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

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

Разберем распространенную ситуацию при разработке отчетов в системе компоновки данных (СКД): разработчик настраивает отчет, под полными правами администратора отчет формируется корректно и выводит все необходимые строки, однако при запуске под пользователем с ограниченными правами отчет формируется абсолютно пустым или в нем пропадают ключевые колонки и группировки.

При попытке разобраться в схеме компоновки данных многие обращают внимание на вкладку Наборы данных и колонку Ограничение доступности полей-реквизитов, замечая, что там автоматически установлены флажки, которые невозможно снять вручную. Выясним причину такого поведения платформы и рассмотрим рабочие способы вывода данных.

Почему колонка «Ограничение доступности полей-реквизитов» заблокирована

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

  1. Примитивный тип данных: если поле имеет тип Число, Строка, Дата или Булево, а также если это числовой ресурс или вычисляемое поле, у него физически нет дочерних реквизитов. В таком случае платформа отключает возможность изменения этой колонки.
  2. Ограничено само поле: если в соседней колонке Ограничение доступности поля уже установлены запреты на использование поля, управление его дочерними реквизитами блокируется автоматически.
  3. Отключено автозаполнение: если в запросе набора данных отключено автозаполнение и поля не задекларированы явным образом в секциях компоновщика, интерактивная настройка полей-реквизитов также может быть заблокирована.

Таким образом, флажки в этой колонке не являются причиной отсутствия данных в сформированном отчете.

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

Рассмотрим, как платформа 1С:Предприятие разграничивает права доступа к данным. В системе существуют два базовых права:

  1. Чтение: разрешает низкоуровневый доступ к таблицам базы данных (на уровне выполнения запросов и работы с объектной моделью в коде).
  2. Просмотр: разрешает интерактивное отображение данных пользователю в элементах интерфейса (формах, динамических списках, отчетах).

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

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

Также похожий эффект наблюдается при использовании Функциональных опций: если реквизит или объект привязаны к отключенной опции, СКД исключает его аналогично отсутствию права на просмотр.

Способ 1. Корректировка прав в роли (без лишнего доступа)

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

Чтобы при этом не дать пользователю лишних интерактивных возможностей, снимем флажки интерактивных прав:

  1. Оставляем право Просмотр для чтения данных в СКД.
  2. Снимаем права Интерактивное добавление, Редактирование и другие управляющие права.
  3. Исключаем объект из подсистем командного интерфейса, чтобы он не отображался в основном меню конфигурации.

Способ 2. Программное формирование отчета в привилегированном режиме

Если по соображениям безопасности пользователю категорически нельзя выдавать право на просмотр таблицы в пользовательском сеансе, сформируем отчет программно, переведя выполнение в привилегированный режим.

Для этого в модуле объекта отчета переопределим обработчик события ПриКомпоновкеРезультата:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	УстановитьПривилегированныйРежим(Истина);
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(
		СхемаКомпоновкиДанных, 
		КомпоновщикНастроек.ПолучитьНастройки(), 
		ДанныеРасшифровки
	);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры

В привилегированном режиме проверки прав Чтение и Просмотр отключаются, благодаря чему платформа сформирует макет со всеми полями схемы.

Способ 3. Отключение проверки доступности полей в макете

Посмотрим на расширенные параметры метода Выполнить у объекта КомпоновщикМакетаКомпоновкиДанных. Данный метод имеет параметр ПроверятьДоступностьПолей, значение которого по умолчанию равно Истина.

Если передать в этот параметр значение Ложь, компоновщик не станет проверять права на интерактивный просмотр и состояние функциональных опций:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	
	// Четвертый параметр отключает проверку доступности полей
	МакетКомпоновки = КомпоновщикМакета.Выполнить(
		СхемаКомпоновкиДанных, 
		КомпоновщикНастроек.ПолучитьНастройки(), 
		ДанныеРасшифровки, 
		, 
		, 
		Ложь
	);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры

Обратите внимание: для успешного выполнения этого варианта у пользователя обязательно должно быть право Чтение на исходные таблицы, иначе возникнет системная ошибка ограничения прав доступа при выполнении запроса.

Способ 4. Использование набора данных «Объект» (Таблица значений)

Еще один надежный подход — разделение получения данных и их компоновки. Если перенести выборку данных в отдельный запрос и передать результат в СКД в виде таблицы значений, механизм проверки прав на просмотр исходных таблиц задействован не будет.

  1. Создаем в схеме компоновки данных Набор данных - объект и указываем имя содержащего объекта (например, ТаблицаДанных).
  2. В модуле отчета программно выполняем обычный запрос к базе данных (при необходимости используя УстановитьПривилегированныйРежим(Истина) или запрос с конструкцией ВЫБРАТЬ РАЗРЕШЕННЫЕ).
  3. Выгружаем результат запроса в таблицу значений и передаем ее в процессор компоновки через структуру внешних наборов данных:

ВнешниеНаборы = Новый Структура;
ВнешниеНаборы.Вставить("ТаблицаДанных", РезультатЗапросаТаблица);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы, ДанныеРасшифровки);

Так как набор данных типа «Объект» работает с готовой коллекцией в памяти, СКД не накладывает на поля ограничения метаданных исходных регистров.

← На главную