Почему отчет СКД выдает ошибку доступа к полям, хотя консоль запросов работает корректно?

Программист 1С v8.3 (Обычные формы) 1С:Зарплата и Управление Персоналом
← На главную

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

Выясняем причину возникновения ошибки

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

Метод 1: Настройка прав доступа на уровне метаданных

Самый простой и очевидный способ — это корректировка профиля доступа пользователя. Если СКД требует права на просмотр реквизита, нам необходимо убедиться, что пользователю разрешен доступ к данному объекту.

  1. Откроем Конфигуратор и перейдем в ветку Роли.
  2. Найдем роль, назначенную пользователю.
  3. Для необходимого документа или справочника установим право Просмотр.
  4. Сохраним изменения и протестируем отчет.

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

Метод 2: Программное отключение проверки доступности полей

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

Рассмотрим пример того, как программно запустить компоновку с игнорированием проверки прав:


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

Использование параметра ПроверятьДоступностьПолей = Ложь в методе Выполнить позволяет системе СКД проигнорировать отсутствие прав на просмотр полей, при этом запрос будет исполняться в контексте текущих прав пользователя, что обеспечит безопасность данных.

Метод 3: Использование внешних наборов данных

Если предыдущие варианты не подходят, мы можем предварительно выбрать необходимые данные запросом в Таблицу значений, используя ключевое слово РАЗРЕШЕННЫЕ, и передать эту таблицу в СКД как внешний источник. Таким образом, к моменту обработки отчетом, данные уже будут отфильтрованы согласно правам пользователя, и СКД не потребуется проверять доступность каждого реквизита в метаданных.

Заключение:

Проанализировав ситуацию, мы пришли к выводу, что ошибка СКД — это штатная проверка безопасности платформы. Для решения задачи рекомендуется:

Работая вместе, мы сможем сделать отчеты более стабильными и безопасными, избегая лишних проблем с правами доступа!

← На главную