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