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