Как оптимизировать работу RLS в динамических списках при подборе товаров?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке высоконагруженных систем на платформе 1С, особенно в конфигурации Управление торговлей 11, разработчики часто сталкиваются с проблемой замедления динамических списков. Основной причиной является механизм RLS (ограничение доступа на уровне записей), который при определенных условиях может значительно увеличивать время выполнения запросов, вызывая избыточные соединения (JOIN) с таблицами ограничений.

Рассмотрим пошагово, как разобраться с этой проблемой, почему не всегда срабатывает принудительная смена параметров сеанса и как правильно реализовать управление RLS «на лету».

Понимание проблемы с параметрами сеанса

Частой ошибкой при попытке ускорить работу формы является попытка «переключить» RLS через изменение констант или параметров сеанса при открытии формы. Однако, платформа 1С использует механизм «ленивой» инициализации параметров сеанса.

Когда система выполняет запрос к данным (в том числе запрос динамического списка), она обращается к параметру сеанса. Если вы попытались изменить его значение при создании формы, фоновое задание или даже серверный вызов запроса может сбросить это значение, вызвав процедуру инициализации параметра сеанса заново. В итоге ваши настройки игнорируются, и таблица ограничений снова подставляется в SQL-запрос.

Правильная настройка через обработчики БСП

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

Разберем шаги по настройке собственного обработчика:

  1. Откройте общий модуль ОбщегоНазначенияПереопределяемый.
  2. Добавьте процедуру ПриДобавленииОбработчиковУстановкиПараметровСеанса с использованием директивы &После.
  3. Зарегистрируйте свой параметр сеанса в списке обработчиков:

Процедура ЛМ_ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт
    Обработчики.Вставить("ЛМ_ОтключениеRLS", "ЛМ_ОбщийМодуль.УстановкаПараметровСеанса");
КонецПроцедуры

Теперь создайте свой общий модуль ЛМ_ОбщийМодуль, в котором опишите процедуру инициализации. Это обеспечит стабильность: при первом обращении к параметру платформа сама вызовет этот код.


Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт
    Если ИмяПараметра = "ЛМ_ОтключениеRLS" Тогда
        // Инициализируем значение по умолчанию (например, Ложь, чтобы безопасность сохранялась)
        ПараметрыСеанса.ЛМ_ОтключениеRLS = Ложь;
        УстановленныеПараметры.Добавить("ЛМ_ОтключениеRLS");
    КонецЕсли;
КонецПроцедуры

Управление RLS в форме подбора

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

Пример кода в модуле формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    УстановитьПривилегированныйРежим(Истина);
    ПараметрыСеанса.ЛМ_ОтключениеRLS = Истина;
    УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры

Если после этого возникнет необходимость сбросить значение параметра, просто очистите его через ПараметрыСеанса.Очистить("ЛМ_ОтключениеRLS"). Это заставит систему при следующем обращении вызвать ваш обработчик и восстановить значение по умолчанию.

Рекомендации по диагностике

Прежде чем «бороться» с RLS, проанализируйте план выполнения SQL-запроса:

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

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

← На главную