Почему запрос в привилегированном режиме выполняется медленнее, если у пользователя включен RLS в файловой базе 1С?

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

При проектировании прав доступа в системе «1С:Предприятие» разработчики часто сталкиваются с неочевидным поведением платформы. Типичный сценарий: у пользователя настроено ограничение доступа на уровне записей (RLS) на определенное измерение регистра. Чтобы ускорить выполнение критически важного запроса, разработчик переносит его в привилегированный общий модуль и убирает ключевое слово РАЗРЕШЕННЫЕ.

Логика подсказывает, что в привилегированном режиме проверка прав полностью игнорируется, и запрос должен отрабатывать с максимально возможной скоростью — точно так же, как у администратора без RLS. Однако на практике (особенно в файловом режиме работы базы данных) замеры производительности показывают, что запрос у «ограниченного» пользователя все равно выполняется в несколько раз медленнее. Разберем по шагам физику этого процесса, выясним причины такого поведения платформы и найдем способы оптимизации.

1. Как работает RLS в привилегированном режиме на уровне платформы

Существует распространенное заблуждение, что привилегированный режим полностью отключает все механизмы RLS на этапе подготовки запроса. На самом деле это происходит не совсем так. Проанализируем цепочку действий, выполняемых платформой при вызове метода Запрос.Выполнить():

  1. Компиляция запроса на уровне SDBL (Simple Data Base Layer): Перед тем как транслировать запрос из встроенного языка 1С в физический SQL-запрос к СУБД (или к движку файловой базы .1CD), платформа выполняет синтаксический анализ и разбор метаданных. В этот процесс всегда вовлечен анализ контекста безопасности текущего пользователя. Слой SDBL проверяет роли пользователя, чтобы определить структуру и необходимость модификации запроса. Логика «проверить, настроен ли RLS для этого пользователя по метаданным, сопоставить его роли и принять решение о пропуске проверок ввиду привилегированного режима» выполняется на процессоре сервера 1С каждый раз. Это создает дополнительные накладные расходы (overhead).
  2. Разделение кэша планов запросов по контекстам безопасности: Платформа 1С кэширует скомпилированные SDBL-запросы, чтобы не тратить время на их разбор при повторных вызовах. Однако этот кэш чувствителен к контексту безопасности. У пользователя с настроенными ограничениями RLS контекст безопасности отличается от контекста администратора (у которого ограничений нет вовсе). Из-за этого платформа для «ограниченного» пользователя вынуждена инициировать повторную компиляцию запроса или дополнительную валидацию схемы метаданных вместо мгновенного извлечения готового плана из кэша.

2. Специфика файлового режима работы (база данных .1CD)

Почему эта разница в скорости критически заметна именно в файловом варианте работы и практически незаметна в клиент-серверном? Рассмотрим особенности архитектуры файлового движка:

  1. Отсутствие выделенного оптимизатора СУБД: В файловом режиме СУБД встроена непосредственно в платформу «1С:Предприятие» и выполняется в рамках единого рабочего процесса. Парсинг запроса, проверка прав, трансляция в физические команды и выборка данных делят между собой ресурсы одного и того же потока процессора.
  2. Соотношение накладных расходов и времени выполнения: В небольшой файловой базе данных (например, до 15–20 Гб) простой запрос к таблице остатков регистра накопления выполняется на физическом уровне практически мгновенно (за доли миллисекунды). В таких условиях время, затраченное платформой на анализ метаданных и разбор контекста безопасности RLS (даже при последующем обходе ограничений в привилегированном режиме), начинает составлять львиную долю от общего времени выполнения метода Запрос.Выполнить() — до 70–80%. Отсюда мы и получаем трехкратную разницу в замерах (например, 0.025 секунды без RLS против 0.08 секунды с включенным RLS).
  3. Сглаживание в клиент-серверном режиме: В клиент-серверном варианте (под управлением MS SQL, PostgreSQL и др.) СУБД берет на себя оптимизацию и кэширование планов физических запросов. Время компиляции на стороне сервера приложений 1С остается тем же, но на фоне сетевых задержек (round-trip), работы службы СУБД и дисковых операций сервера эта микросекундная разница нивелируется до незначительных 5–10%, которые незаметны пользователям.

3. Влияние режима совместимости платформ и новый генератор запросов

Рассмотрим интересную особенность поведения платформы при изменении режима совместимости. При проведении тестов в файловой базе были получены следующие результаты:

Выясним причину такого «замедления» работы запроса без ограничений в режиме 8.3:

  1. Новый транслятор запросов: При отключении режима совместимости платформа активирует современный генератор запросов. Он выполняет глубокий статический анализ текста запроса: проверяет типы данных, разыменовывает сложные связи через точку, оптимизирует построение планов для СУБД.
  2. Плата за оптимизацию: Этот глубокий анализ требует больше процессорного времени на этапе подготовки и компиляции запроса. Для простых запросов в файловом режиме это приводит к увеличению базового времени парсинга (SDBL overhead) для всех сеансов, включая администраторов без RLS. Разработчики платформы пожертвовали микросекундами на простых запросах в файловом режиме ради оптимизации тяжелых запросов в высоконагруженных клиент-серверных системах.

4. Как оптимизировать сценарии работы с RLS

Если в вашем прикладном решении разница в скорости критична для пользователей, а использовать RLS необходимо, рекомендуем применить следующие подходы:

Перенос базы данных в клиент-серверный режим

Для баз данных объемом более 10 Гб с активным использованием механизмов разграничения прав доступа на уровне записей файловый режим перестает быть оптимальным выбором. Переход на полноценную СУБД (например, PostgreSQL) решает проблему за счет эффективного кэширования планов запросов на стороне СУБД и распараллеливания процессов обработки данных.

Использование производительного режима RLS (через БСП)

В современных конфигурациях стандартный шаблон RLS (который динамически строит тяжелые левые соединения при каждом запросе) рекомендуется заменить на производительный режим RLS, предоставляемый Библиотекой Стандартных Подсистем (БСП). Рассмотрим его принцип работы:

Правильное оформление вызовов в привилегированных модулях

Убедитесь, что логика получения данных действительно изолирована в общем модуле с установленными свойствами «Сервер» и «Привилегированный». Пример вызова процедуры получения остатков без использования избыточных проверок:


// Код внутри общего привилегированного модуля "упУправлениеОстатками"
Функция ПолучитьОстаткиТоваровПривилегированно(ВыбСклад) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
        |   ТоварыНаСкладахОстатки.В НаличииОстаток КАК Количество
        |ИЗ
        |   РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &ВыбСклад) КАК ТоварыНаСкладахОстатки";
        
    Запрос.УстановитьПараметр("ВыбСклад", ВыбСклад);
    
    // В привилегированном режиме ключевое слово РАЗРЕШЕННЫЕ не требуется
    Возврат Запрос.Выполнить().Выгрузить();
    
КонецФункции

Использование этого метода гарантирует, что на стороне СУБД запрос выполнится по полной таблице без наложения дополнительных условий RLS, а небольшая задержка на этапе SDBL-компиляции в файловом режиме останется фиксированной и прогнозируемой.

← На главную