Почему медленно формируется отчет под неполными правами в 1С и как это исправить?

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

Проблема низкой производительности отчетов при использовании механизма RLS (Record Level Security) — одна из самых распространенных и неприятных в практике разработчика 1С. Особенно остро она проявляется в файловых базах данных, где возможности оптимизатора запросов сильно ограничены по сравнению с SQL-системами. Рассмотрим ситуацию, когда отчет под полными правами «летает», а у рядового пользователя с ограниченным доступом — «висит» несколько минут.

Проанализируем причину замедления

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

Рассмотрим основные факторы, которые заставляют отчет тормозить:

  1. Неявные соединения (обращения через точку): Использование полей типа ЗаказКлиента.Склад заставляет систему проверять права не только на сам регистратор, но и на все связанные объекты.
  2. Особенности файловой СУБД: Файловая база плохо справляется со сложными планами запросов, которые генерирует RLS. Вместо использования индексов часто происходит полное сканирование таблиц (Table Scan).
  3. Объем базы: При размере базы около 7 ГБ и работе через веб-клиент накладные расходы на обработку прав становятся критическими.

Решение 1: Использование привилегированного режима в СКД

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

Для начала переопределим стандартную процедуру ПриКомпоновкеРезультата. Нам нужно запретить стандартную обработку и запустить процесс формирования вручную, предварительно установив привилегированный режим.


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; 
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Выполним предварительную проверку прав, если это необходимо по логике
    // Например, проверим доступ к конкретному складу
    Склад = Неопределено;
    Для Каждого Строка Из Настройки.ПараметрыДанных.Элементы Цикл
        Если Строка.Параметр = Новый ПараметрКомпоновкиДанных("Склад") Тогда
            Склад = Строка.Значение;
        КонецЕсли;
    КонецЦикла;

    // Включаем привилегированный режим для обхода RLS
    УстановитьПривилегированныйРежим(Истина);
    
    Если ПривилегированныйРежим() Тогда
        // Сформируем отчет, используя серверную процедуру
        СформироватьОтчетПривРеж(ДокументРезультат, СхемаКомпоновкиДанных, ДанныеРасшифровки, КомпоновщикНастроек);
    КонецЕсли;
    
    УстановитьПривилегированныйРежим(Ложь);
    
КонецПроцедуры

Затем создадим вспомогательную процедуру, которая будет отвечать за вывод данных. Важно помнить, что в СКД метод Инициализировать() процессора компоновки данных должен вызываться именно в тот момент, когда привилегированный режим активен.


Процедура СформироватьОтчетПривРеж(ТабличныйДокумент, СхемаКомпоновкиДанных, ДанныеРасшифровки, КомпоновщикНастроек) Экспорт 
    
    ТабличныйДокумент.Очистить();  
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;     
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Генерация макета без учета прав текущего пользователя
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки, , , Ложь);
    
    ВнешниеНаборыДанных = Новый Структура;
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    
КонецПроцедуры

Важный нюанс: Если вы используете веб-клиент, убедитесь, что код выполняется на сервере. Привилегированный режим не работает на клиенте.

Решение 2: Оптимизация запроса (убираем «точки»)

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

Проанализируем фрагмент кода:


ВЫБРАТЬ разрешенные
    РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Партнер КАК Партнер,
    РасчетыСКлиентами.ЗаказКлиента.Склад КАК Склад
ИЗ
    РегистрНакопления.РасчетыСКлиентами.ОстаткиИОбороты(...) КАК РасчетыСКлиентами
ГДЕ
    {(ЗаказКлиента.Склад = &Склад)}

Для оптимизации рекомендуется:

Решение 3: Очистка пользовательских настроек и кэша

Заметим интересную особенность: иногда отчет начинает работать быстро после очистки пользовательских настроек, но через некоторое время снова замедляется. Это связано с тем, что 1С кэширует настройки компоновки и планы исполнения для конкретных комбинаций отборов.

Разберем, как с этим бороться:

  1. Проверьте кэш метаданных: Регулярная чистка кэша на стороне пользователя (папки %AppData%\1C\1Cv8) может временно решить проблему, но это не системный подход.
  2. Программная очистка: В коде формирования отчета можно принудительно устанавливать стандартные настройки, если обнаружено аномальное замедление.
  3. Регламентные операции: Для файловой базы жизненно необходимо регулярно выполнять тестирование и исправление (ТиИ) с реиндексацией таблиц и пересчетом итогов.

Решение 4: Режим «Производительный» для RLS

Если вы работаете в современной конфигурации (например, УТ 11, ERP 2 или КА 2), проверьте настройки системы. В разделе НСИ и администрирование — Настройка пользователей и прав есть опция «Вариант работы системы прав доступа».

Существует два режима:

Переход на производительный режим часто является единственным способом заставить RLS работать быстро без переписывания кода всех отчетов.

Резюме

Подведем итоги нашего анализа. Если ваш отчет тормозит только под неполными правами в файловой базе:

  1. Первым делом попробуйте реализовать формирование через привилегированный режим в модуле объекта. Это самый быстрый путь.
  2. Оптимизируйте запрос, избавившись от обращений к реквизитам через точку (.), особенно в условиях и отборах.
  3. Убедитесь, что база регулярно проходит обслуживание (индексацию), так как RLS крайне чувствителен к актуальности индексов.
  4. Рассмотрите возможность перехода на SQL-вариант, если база выросла более 6-8 ГБ. Файловый движок имеет физические ограничения, которые невозможно преодолеть только оптимизацией кода.
← На главную