Особенность ВЫБРАТЬ РАЗРЕШЕННЫЕ в запросах 1С 8.3
РАЗРЕШЕННЫЕ — конструкция языка запросов 1С 8, которая используется при применении ограничения прав на уровне записей (RLS). Использование данного ключевого слова позволяет избежать ошибки при получении записей, прав на которых у пользователя нет.
Проблема: В некоторых случаях результат ограничений доступа к данным в 1С 8.3 может зависеть от плана запроса СУБД. В данной статье рассмотрены возможные ситуации и даны рекомендации, как этого избежать.
Условия возникновения проблемы
Проблема возможной зависимости результата ограничений доступа к данным от плана запроса СУБД может возникнуть при выполнении запроса к базе данных без ключевого слова РАЗРЕШЕННЫЕ, если для текущего пользователя имеются ограничения доступа к данным и при этом запрос содержит одно или несколько сравнений вида:
- <Выражение над полями> {В|НЕ В} (<Вложенный запрос>)
- (<Выражение над полями 1>, …, <Выражение над полями N>) {В|НЕ В} (<Вложенный запрос>)
Если в этом случае <Вложенный запрос> (запрос в запросе) использует таблицы базы данных, на которые наложены ограничения доступа, то возможно, что на одних СУБД запрос будет выполняться успешно, а на других будет выдаваться сообщение У пользователя недостаточно прав на исполнение операции над базой данных при условии полной идентичности данных в информационных базах.
Причина различий
Возможная разница в поведении объясняется реализацией ограничений доступа к данным без ключевого слова РАЗРЕШЕННЫЕ в 1С Предприятии 8.3.
Запрос без ключевого слова РАЗРЕШЕННЫЕ будет выполнен успешно только в том случае, если в процессе его выполнения не происходит обращений к запрещенным данным. Для этого в выборке данных добавляется специальное сигнальное поле, которое принимает значение Истина для тех записей, в формировании которых участвовали только разрешенные данные, и значение Ложь для всех остальных записей. Если хотя бы в одной записи выборки имеется значение Ложь в сигнальном поле, то выполнение запроса завершается аварийно.
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Такое же сигнальное поле добавляется и к результатам запросов, вложенных в сравнение В/НЕ В. Причем проверка значения сигнальной колонки в этом случае выполняется средствами СУБД. Таким образом, если в процессе выполнения вложенного запроса происходило обращение к запрещенным данным, то выполнение запроса должно завершиться с ошибкой У пользователя недостаточно прав на исполнение операции над базой данных.
Однако при построении плана запроса СУБД может не получать полную выборку <Вложенным запросом>, а получать только те записи, которые фактически необходимы для проверки условия В/НЕ В. В этом случае выполнение запроса может оказаться успешным, даже если при выполнении <Вложенного запроса> как самостоятельного запроса могли произойти обращения к запрещенным данным.
Пример и рекомендации
Рассмотрим простой пример. Пусть на таблицу Справочник.ФизическиеЛица наложены ограничения доступа к данным. В этом случае запрос:
ВЫБРАТЬ
Таблица.ФизЛицо КАК ФизЛица
ИЗ
Справочник.ФизическиеЛица КАК Таблица
будет выполнен с ошибкой из-за попытки обращения к запрещенным данным. Если же этот запрос участвует в сравнении, например:
ВЫБРАТЬ
ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо
ИЗ
Документ.ДоговорНаВыполнениеРаботСФизЛицом КАК ДоговорНаВыполнениеРаботСФизЛицом
ГДЕ
ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо В (
ВЫБРАТЬ
Таблица.ФизЛицо КАК ФизЛица
ИЗ
Справочник.ФизическиеЛица КАК Таблица)
то в зависимости от выбранного СУБД плана запроса запрос может быть выполнен как успешно, так и с ошибкой. Такое поведение запроса не является ошибочным, поскольку обращение к запрещенным данным в процессе выполнения этого запроса может произойти, а может и не произойти. Для получения более предсказуемого результата необходимо построить запрос таким образом, чтобы вложенный запрос гарантированно не выполнял обращений к заведомо ненужным данным. В частности, если предыдущий запрос переписать так:
ВЫБРАТЬ
ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо
ИЗ
Документ.ДоговорНаВыполнениеРаботСФизЛицом КАК ДоговорНаВыполнениеРаботСФизЛицом
ГДЕ
ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо В (
ВЫБРАТЬ
Таблица.ФизЛицо КАК ФизЛица
ИЗ
Справочник.ФизическиеЛица КАК Таблица
ГДЕ
Таблица.ФизЛицо = ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо)
Данный запрос отличается от предыдущего тем, что вложенный запрос не выбирает записей, которые заведомо не требуются для выполнения сравнения В. Поэтому он завершится успешно, если ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо ссылается только на разрешенные записи таблицы Справочник.ФизическиеЛица, и аварийно, если среди ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо имеются ссылки на запрещенные записи.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
СПРОСИТЕ в комментариях!