Как ускорить открытие формы «Задачи мне» в 1С:Документооборот?

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

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

Анализ кода и замер производительности

Первым делом нам необходимо локализовать проблему. Часто кажется, что «тормозит само открытие», но под капотом метода ОткрытьФорму скрывается цепочка серверных вызовов. Проанализируем вызовы в модуле БизнесПроцессыИЗадачиВызовСервера. Если замер производительности показывает, что основное время уходит на получение данных динамического списка, значит, проблема кроется в SQL-запросе, который формирует платформа.

Обратим внимание на то, как вызывается форма. Иногда замена программного вызова имени формы на фиксированную строку может незначительно сократить время на серверные вызовы, но основная причина обычно глубже:


// Вместо вызова функции, возвращающей имя:
// ОткрытьФорму(БизнесПроцессыИЗадачиВызовСервера.ИмяФормыЗадачиМне);

// Используем прямое указание (хотя это редко является корнем проблемы):
ОткрытьФорму("Задача.ЗадачаИсполнителя.Форма.ЗадачиМне");

Оптимизация текста запроса динамического списка

Разберем ситуацию, когда в запросе динамического списка присутствуют условия, которые заставляют СУБД выполнять полное сканирование таблиц вместо использования индексов. Одной из таких проблем является использование оператора ИЛИ в сочетании с проверкой на NULL.

Рассмотрим типичный фрагмент условия в 1С:ДО:


И (ЗадачиДляВыполнения.СостояниеВыполнения ЕСТЬ NULL 
   ИЛИ ЗадачиДляВыполнения.СостояниеВыполнения <> ЗНАЧЕНИЕ(Перечисление.СостоянияЗадачДляВыполнения.ГотоваКВыполнению))

Такая конструкция крайне неэффективна для оптимизатора SQL. Попробуем преобразовать её, используя функцию ЕСТЬNULL, что позволит СУБД более эффективно строить план запроса:


ГДЕ ЕСТЬNULL(ЗадачиДляВыполнения.СостояниеВыполнения, ЗНАЧЕНИЕ(Перечисление.СостоянияЗадачДляВыполнения.НеГотоваКВыполнению)) 
    <> ЗНАЧЕНИЕ(Перечисление.СостоянияЗадачДляВыполнения.ГотоваКВыполнению)

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

Настройка компоновки данных и составных типов

Одной из скрытых причин деградации производительности является автоматическое построение полей в динамическом списке. Если в списке присутствуют реквизиты составного типа (например, Предмет или Автор), платформа при включенном автозаполнении полей может пытаться вытянуть через LEFT JOIN данные из всех возможных таблиц, входящих в этот тип.

Выясним, как это исправить:

  1. Откроем свойства динамического списка и перейдем в Настройку списка.
  2. В конструкторе запроса на вкладке Компоновка данных найдем настройки полей.
  3. Снимем флаг Автозаполнение доступных полей.
  4. Вручную добавим только те поля, которые действительно нужны пользователю.
  5. Для полей составного типа обязательно отключим галку Использовать дочерние. Это предотвратит попытки системы обращаться к реквизитам объектов через точку в списке, что порождает чудовищные по сложности SQL-запросы.

Влияние RLS и механизмов замещения

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

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


// Пример логики фильтрации
СписокПользователей = Новый Массив;
СписокПользователей.Добавить(ПараметрыСеанса.ТекущийПользователь);
// Добавляем группы и замещаемых...
СписокЗадач.Параметры.УстановитьЗначениеПараметра("Пользователи", СписокПользователей);

В самом запросе условие будет выглядеть как ГДЕ Исполнитель В (&Пользователи). Это позволит SQL-серверу использовать индекс по полю Исполнитель.

Техническая диагностика на уровне СУБД

Если программные методы не помогают, проанализируем ситуацию через Технологический журнал (ТЖ). Нас интересуют события SDBL и DBMSSQL. Если время исполнения SDBL значительно превышает время в SQL, значит, платформа тратит ресурсы на генерацию сложного запроса (часто из-за RLS). Если же тормозит сам SQL — необходимо выполнить UpdateStatistic на стороне сервера базы данных. Для автоматизации сбора логов и локализации проблем подойдёт инструмент для замера производительности и поиска узких мест в 1С.

Также обратим внимание на наличие расширений. Если в конфигурации присутствуют модули с префиксами (например, АС_), проверим обработчик ПриПолученииДанныхНаСервере. Если в этом событии написан код, выполняющий запросы в цикле для каждой строки списка, это гарантированно приведет к длительному открытию формы. Такую логику следует выносить в основной запрос динамического списка или кэшировать данные.

Подводя итог, оптимизация формы «Задачи мне» — это всегда комплекс мер: от упрощения условий ГДЕ и очистки динамического списка от лишних соединений через точку, до настройки производительного режима прав доступа и актуализации статистики СУБД. При необходимости комплексного повышения быстродействия системы можно использовать решение для ускорения 1С:Документооборот.

← На главную