При изучении типовых шаблонов ограничения доступа на уровне записей (RLS) в конфигурациях на платформе 1С:Предприятие (например, УТП, УПП 1.3, КА 1.1, УТ 10.3) часто встречается специфическая конструкция с вложенным запросом (ВЫБРАТЬ 1 КАК ПолеОтбора) КАК Оптмизация. Разберем подробно, какую роль выполняет данный фрагмент кода, как он влияет на формирование плана запроса в СУБД и какие современные альтернативы существуют.
Рассмотрим типовой пример подзапроса ограничения прав доступа к данным:
ВЫБРАТЬ ПЕРВЫЕ 1
1
ИЗ
(ВЫБРАТЬ
1 КАК ПолеОтбора
) КАК Оптмизация
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
ПО НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(1)
И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
И (НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей
ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи))
Проанализируем работу данного фрагмента по шагам:
EXISTS (...). Для проверки наличия хотя бы одной разрешающей записи используется условие вида ГДЕ 1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ ...). Если в регистре прав есть подходящая строка, подзапрос возвращает одну строку с единицей, условие становится истинным, и доступ к объекту разрешается. Если разрешающих записей нет, результат подзапроса пуст, и доступ блокируется.Оптмизация: Подзапрос (ВЫБРАТЬ 1 КАК ПолеОтбора) генерирует виртуальную таблицу, состоящую ровно из одной строки и одного поля (аналог системной таблицы DUAL в реляционных СУБД).ГДЕ при трансляции в SQL не всегда позволяло оптимизатору СУБД (например, MS SQL Server) эффективно применить поиск по индексу. Соединение однострочной таблицы через конструкцию ВНУТРЕННЕЕ СОЕДИНЕНИЕ ... ПО принудительно направляло оптимизатор на выполнение операции точечного поиска по индексам измерений (Index Seek), предотвращая полное сканирование таблицы регистра (Table Scan) или неэффективные алгоритмы соединения.Несмотря на применение оптимизирующих конструкций, классический RLS на подзапросах обладает рядом существенных ограничений:
Выясним, какие механизмы применяются в современных конфигурациях для замены устаревших шаблонов с подзапросами:
КлючиДоступаКОбъектам и КлючиДоступаКРегистрам. В этом случае RLS сводится к простому и быстрому соединению по числовому идентификатору ключа.УстановитьПривилегированныйРежим(Истина) или выносить логику в привилегированные общие модули.