Почему во внешнем отчете 1С возникает ошибка «У пользователя недостаточно прав на исполнение операции над БД» и как ее исправить?

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

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

Причины возникновения ошибки прав доступа

Проанализируем основные факторы, приводящие к блокировке выполнения запроса отчета:

  1. Действие ограничений на уровне записей (RLS): В конфигурациях часто включено разграничение прав доступа по организациям, подразделениям или складам. Когда запрос пытается прочитать общую таблицу документов без явного указания модификатора выборки, СУБД пытается обработать все существующие записи. Если в выборку попадает хотя бы один документ организации, к которой у пользователя нет доступа, платформа прерывает выполнение запроса ошибкой «Отказ в доступе. Действие: Чтение».
  2. Пропуск ключевого слова в пакетных запросах: Если отчет использует пакетный запрос с созданием временных таблиц, указание ограничения только в одной из секций ВЫБРАТЬ не защищает от ошибки. Каждая отдельная выборка в пакете выполняет чтение таблиц базы данных и требует корректного модификатора.
  3. Неявные соединения при разыменовании полей: Использование обращений через точку от табличных частей (например, ТабличнаяЧасть.Ссылка.Дата) формирует скрытые левые соединения с таблицей шапки документа, что может накладывать дополнительные проверки RLS.
  4. Ограничения безопасного режима для внешних отчетов: По умолчанию внешние отчеты, открытые через системное меню «Файл — Открыть», работают в безопасном режиме платформы. В таком режиме программная инструкция УстановитьПривилегированныйРежим(Истина) игнорируется платформой.

Способ 1. Использование модификатора РАЗРЕШЕННЫЕ в тексте запроса

Если отчет должен показывать пользователю только те данные, к которым у него есть официальный доступ по RLS (по его организациям и подразделениям), необходимо добавить ключевое слово РАЗРЕШЕННЫЕ во все операторы ВЫБРАТЬ пакетного запроса.

Посмотрим на исходный запрос, вызывающий ошибку:


ВЫБРАТЬ
    ОтчетОРозничныхПродажах.Ссылка КАК Ссылка,
    СУММА(ОтчетОРозничныхПродажах.Сумма) КАК СуммаПК
ПОМЕСТИТЬ ТЗПК
ИЗ
    Документ.ОтчетОРозничныхПродажах.ОплатаПлатежнымиКартами КАК ОтчетОРозничныхПродажах
ГДЕ
    ОтчетОРозничныхПродажах.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
СГРУППИРОВАТЬ ПО
    ОтчетОРозничныхПродажах.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ОтчетОРозничныхПродажах.Ссылка КАК Отчет,
    ОтчетОРозничныхПродажах.Подразделение КАК Подразделение,
    ОтчетОРозничныхПродажах.Организация КАК Организация,
    ОтчетОРозничныхПродажах.СуммаДокумента - ЕСТЬNULL(ОплатаПК.СуммаПК, 0) КАК СуммаНаличные,
    ОплатаПК.СуммаПК КАК СуммаПК,
    ОтчетОРозничныхПродажах.СуммаДокумента КАК СуммаДокумента
ИЗ
    Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
    ЛЕВОЕ СОЕДИНЕНИЕ ТЗПК КАК ОплатаПК
    ПО ОтчетОРозничныхПродажах.Ссылка = ОплатаПК.Ссылка
ГДЕ
    ОтчетОРозничныхПродажах.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

Разберем исправленный вариант запроса. Обратите внимание, что слово РАЗРЕШЕННЫЕ добавлено как в запрос формирования временной таблицы, так и в финальную выборку:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ОтчетОРозничныхПродажах.Ссылка КАК Ссылка,
    СУММА(ОтчетОРозничныхПродажах.Сумма) КАК СуммаПК
ПОМЕСТИТЬ ТЗПК
ИЗ
    Документ.ОтчетОРозничныхПродажах.ОплатаПлатежнымиКартами КАК ОтчетОРозничныхПродажах
ГДЕ
    ОтчетОРозничныхПродажах.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
СГРУППИРОВАТЬ ПО
    ОтчетОРозничныхПродажах.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ОтчетОРозничныхПродажах.Ссылка КАК Отчет,
    ОтчетОРозничныхПродажах.Подразделение КАК Подразделение,
    ОтчетОРозничныхПродажах.Организация КАК Организация,
    ОтчетОРозничныхПродажах.СуммаДокумента - ЕСТЬNULL(ОплатаПК.СуммаПК, 0) КАК СуммаНаличные,
    ОплатаПК.СуммаПК КАК СуммаПК,
    ОтчетОРозничныхПродажах.СуммаДокумента КАК СуммаДокумента
ИЗ
    Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
    ЛЕВОЕ СОЕДИНЕНИЕ ТЗПК КАК ОплатаПК
    ПО ОтчетОРозничныхПродажах.Ссылка = ОплатаПК.Ссылка
ГДЕ
    ОтчетОРозничныхПродажах.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

Способ 2. Регистрация отчета в справочнике «Дополнительные отчеты и обработки»

Если отчет должен строиться по всем данным предприятия без учета RLS (например, сводная управленческая аналитика), модификатора РАЗРЕШЕННЫЕ будет недостаточно, так как он просто скроет недоступные строки. В этом случае требуется выполнение кода в привилегированном режиме.

Разберем по шагам, как настроить отчет через механизм БСП:

  1. Зарегистрируем отчет в информационной базе через раздел «НСИ и администрирование» — «Печатные формы, отчеты и обработки» — «Дополнительные отчеты и обработки».
  2. В карточке созданного элемента снимем флаг «Безопасный режим» (для этого требуются права администратора).
  3. В модуле объекта внешнего отчета добавим программное включение привилегированного режима перед выполнением запроса или формированием компоновки данных:

УстановитьПривилегированныйРежим(Истина);

// Формирование отчета или выполнение запроса
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Результат = Запрос.Выполнить();

УстановитьПривилегированныйРежим(Ложь);

После снятия безопасного режима в справочнике вызов метода УстановитьПривилегированныйРежим(Истина) успешно отключит проверку RLS на время формирования отчета.

Способ 3. Перенос отчета в расширение конфигурации

Если использование внешнего файла неудобно, хорошей альтернативой является создание отчета внутри расширения конфигурации:

  1. Создадим новое расширение или откроем существующее.
  2. Добавим отчет в состав объектов расширения.
  3. Для серверных процедур формирования данных создадим общий модуль расширения с установленными свойствами «Сервер» и «Привилегированный».
  4. Назначим права на запуск отчета пользователям через роли расширения.

Такой подход позволяет полностью контролировать права доступа без снятия основной конфигурации с поддержки и гарантирует корректную работу логики в обход RLS.

← На главную