ВЫБРАТЬ РАЗРЕШЕННЫЕ в запросе 1С 8.3
Меню

ВЫБРАТЬ РАЗРЕШЕННЫЕ в запросе 1С 8.3

Содержание статьи
  1. Возникновение ошибки
  2. Как можно обойтись без «РАЗРЕШЕННЫЕ»?

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

Возникновение ошибки

Если по какой-то причине не использовалась конструкция «РАЗРЕШЕННЫЕ», а в запросе выбираются данные пользователями, у которых настроено RLS, возникнет ошибка. Система 1С сообщит нам о том, что у текущего пользователя не хватает прав, чтобы выполнить запрос. При обычной выборке 1С последовательно берет записи из таблицы базы данных и читает их с правами пользователя. Когда попадается строка с данными скрытыми от пользователя с помощью RLS, запрос останавливается с ошибкой.


ВЫБРАТЬ
        	РеализацияТоваровУслуг.Ссылка КАК Ссылка,
        	РеализацияТоваровУслуг.ВерсияДанных КАК ВерсияДанных,
        	РеализацияТоваровУслуг.ПометкаУдаления КАК ПометкаУдаления,
        	РеализацияТоваровУслуг.Номер КАК Номер,
        	РеализацияТоваровУслуг.Дата КАК Дата,
        	РеализацияТоваровУслуг.Проведен КАК Проведен,
        	РеализацияТоваровУслуг.Организация КАК Организация,
        	РеализацияТоваровУслуг.Контрагент КАК Контрагент,
        	РеализацияТоваровУслуг.Склад КАК Склад,
        	РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента,
        	РеализацияТоваровУслуг.Комментарий КАК Комментарий
ИЗ
        	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ВЫБРАТЬ РАЗРЕШЕННЫЕ в запросе 1С 8.3
ВЫБРАТЬ РАЗРЕШЕННЫЕ в запросе 1С 8.3

При добавлении команды «РАЗРЕШЕННЫЕ» после ключевого слова «ВЫБРАТЬ» ошибка уйдет, и наш запрос успешно выполнится независимо от настроек RLS. Помните, что данный оператор добавляется только в выборку верхнего уровня и влияет на весь запрос целиком и вложенные алгоритмы. Многие программисты так и поступают практически в каждом случае, считая это идеальным решением. Конечно, добавить «РАЗРЕШЕННЫЕ» – простейшее действие, но оно имеет существенный недостаток.

В некоторых случаях отчеты могут показывать недостоверную информацию без каких-либо сообщений. Ведь у пользователей отражаются данные по конкретным правам доступа и необходимо об этом помнить, когда есть желание получить общую информацию. Также неприятности могут возникнуть, если пользователь ошибется при изменении документа и выберет контрагента или подразделение, документы которого у него недоступны. После такой ошибки документ «пропадает» из списка у пользователя и вернуть его можно с помощью пользователя с расширенными правами.

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

Как можно обойтись без «РАЗРЕШЕННЫЕ»?

После решения о том, что для важных отчетов лучше обойтись без использования конструкции «РАЗРЕШЕННЫЕ», нужно решить, как избежать ошибок. Исходя из вышенаписанного, нам нужно, чтобы при выполнении запроса система выбирала только те записи, права на которые есть у пользователя. Существует два способа получить нужный результат.

Первый заключается в том, чтобы перенести данные с ограничениями во вложенный запрос. Некоторым СУБД вполне хватает этого, чтобы проверка доступа отработала без ошибок и выдала ограниченные записи. Успех зависит от варианта реализации ограничений доступа на этом уровне.


ВЫБРАТЬ
        	РеализацияТоваровУслуг.Номер КАК Номер,
        	РеализацияТоваровУслуг.Дата КАК Дата,
        	РеализацияТоваровУслуг.Проведен КАК Проведен,
        	РеализацияТоваровУслуг.Склад КАК Склад,
        	РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента
ИЗ
        	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
        	РеализацияТоваровУслуг.Контрагент В
                               	(ВЫБРАТЬ
                                           	контрагент.Ссылка
                               	ИЗ
                                           	справочник.Контрагенты КАК контрагент)

Второй метод заключается в том, чтобы в запросе задать отбор по настройкам для конкретного пользователя. Реализация этого может быть разной – можно использовать соединение с таблицей настроек прав доступа или же задать ограничение при помощи параметра.


ВЫБРАТЬ
        	РеализацияТоваровУслуг.Номер КАК Номер,
        	РеализацияТоваровУслуг.Дата КАК Дата,
        	РеализацияТоваровУслуг.Проведен КАК Проведен,
        	РеализацияТоваровУслуг.Склад КАК Склад,
        	РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента
ИЗ
        	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
        	РеализацияТоваровУслуг.Контрагент = &Контрагент

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

Избавиться от нее можно с помощью конструкции «Попытка», написав более дружелюбное сообщение об ошибке. Это поможет пользователям самостоятельно осознать свои ошибки и исправить их, не обращаясь за помощью к администраторам. Если отчет написан на СКД, то, чтобы воспользоваться этим методом, придется написать код исполнения отчета вручную в модуле объекта.

Разграничение прав доступа на уровне записей – достаточно сложная и тонкая настройка, особенно в системах с множеством пользователей. Оператор «РАЗРЕШЕННЫЕ» существенно облегчает учет ограничений в запросах. Но подходить к его использованию нужно, предварительно продумав, не возникнет ли впоследствии недопонимания между пользователями. Иногда лучше обязать сотрудников настраивать лишний фильтр, чем выискивать источники несоответствия в будущем.

Рассказать друзьям
Предыдущая статья статья
Настройка итогов в СКД 1С 8.3
Следующая статья статья
Внешняя обработка 1С: запуск, параметры, вызов
Комментарии