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