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