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

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

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

Влияние ограничений на уровне записей (RLS)

Основная и наиболее частая причина расхождения по времени — работа механизма ограничения прав на уровне записей и полей (RLS — Record Level Security). Даже если в конфигураторе написан одинаковый текст запроса, на сторону СУБД отправляются совершенно разные SQL-запросы в зависимости от назначенных ролей текущего пользователя.

Проанализируем механизм влияния прав на производительность:

  1. Неявная модификация запроса: Если у пользователя установлены ограничения (например, доступ только по разрешенным организациям или подразделениям), платформа 1С автоматически дописывает в итоговый SQL-запрос условия фильтрации. Часто это выражается в виде ресурсоемких конструкций с подзапросами EXISTS или IN.
  2. Отличие в правах чтения и изменения: Если у одного пользователя есть полные права или право на редактирование, а у второго — только чтение с RLS, планы выполнения запроса на уровне СУБД кардинально различаются. Для пользователя с RLS СУБД не всегда может эффективно применить индексы, что приводит к полному сканированию таблиц (Table Scan).

Почему тормозит процессор вывода СКД

Рассмотрим случай, когда разница во времени наблюдается на этапе программного вывода схемы компоновки данных (СКД):


РезТаблица = Новый ТаблицаЗначений;

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(РезТаблица);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

Метод ПроцессорВывода.Вывести(...) выполняет не только построчное чтение выборки, но и получение представлений ссылочных данных. Если для ссылочных полей не настроено явное выражение представления, платформа делает дополнительные соединения с таблицами справочников и документов. Если на эти объекты у пользователя действуют условия RLS, проверка прав накладывается на каждое ссылочное поле, кратно замедляя обработку.

Пошаговые способы решения и оптимизации

Разберем практические шаги для устранения проблемы разной скорости работы:

  1. Использование привилегированного режима для СКД: Если отчет или рабочее место выполняет расчетную функцию и не требует ограничения видимости строк на уровне бизнес-логики, выполнение необходимо обернуть в привилегированный режим. Обратите внимание: удерживать привилегированный режим нужно на всех этапах работы с СКД — при компоновке макета, инициализации процессора компоновки и выводе результата.
    
    УстановитьПривилегированныйРежим(Истина);
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    РезТаблица = Новый ТаблицаЗначений;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВывода.УстановитьОбъект(РезТаблица);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    УстановитьПривилегированныйРежим(Ложь);
    
  2. Индексация добавленных реквизитов: Если в регистр или таблицу был добавлен новый реквизит (например, флаг Оплачено), по которому строятся соединения или отборы, убедимся, что для него в свойствах конфигуратора включено свойство Индексировать. Отсутствие индекса в связке с наложенными условиями RLS заставляет СУБД повторно сканировать весь объем данных.
  3. Оптимизация представлений в СКД: В схеме компоновки данных на вкладке «Наборы данных» рекомендуется явно задавать выражения представлений для ссылочных колонок через операторы ПРЕДСТАВЛЕНИЕ() или обращение к реквизитам наименования. Также полезно отключить флаг «Автополе», чтобы исключить автоматическую выборку скрытых ссылочных данных.
  4. Проверка пользовательских настроек: Индивидуальные настройки рабочего места (сохраненные варианты, скрытые отборы, условное оформление или добавленные пользователем поля через точку) напрямую влияют на итоговый запрос. Очистим персональные настройки проблемного пользователя в режиме администрирования, чтобы исключить влияние пользовательского интерфейса.
  5. Анализ в технологическом журнале и профайлере СУБД: Для точной локализации проблемы запустим сбор технологического журнала с событиями DBMSSQL / DBPOSTGRS или воспользуемся трассировкой запросов СУБД (SQL Server Profiler). Это позволит увидеть реальный текст запроса с внедренным кодом RLS и оценить план выполнения.

Альтернативный вариант: отказ от СКД в пользу прямого запроса

Если результат выгружается напрямую в коллекцию ТаблицаЗначений без использования интерактивных группировок, надежнее использовать прямой запрос на языке 1С. В тексте запроса следует явно применить операторы ВЫРАЗИТЬ и функции получения представлений, после чего выгрузить данные методом Выгрузить(), что полностью исключит накладные расходы процессора компоновки данных.

← На главную