Одной из наиболее частых причин медленной работы списков в 1С:Документооборот является использование сложных запросов, которые обращаются к полям составного типа через точку. В частности, при фильтрации задач по Предмету и его реквизитам (например, ВидДокумента) платформа вынуждена генерировать множество соединений LEFT JOIN ко всем таблицам, входящим в составной тип. Это критически замедляет выполнение кода на стороне SQL Server.
Когда вы обращаетесь к полю Предмет.ВидДокумента, SQL Server не знает заранее, к какому именно справочнику или документу относится ссылка в конкретной строке. В результате оптимизатор вынужден строить план запроса с учетом всех возможных вариантов таблиц, что приводит к огромным нагрузкам. В ходе анализа мы выяснили, что даже простое исключение таких полей из ВЫБРАТЬ или оптимизация условий ГДЕ может сократить время выполнения запроса с десятков секунд до долей секунды.
Первым делом необходимо пересмотреть условия, в которых используется точечная нотация. Если вам нужно отфильтровать только определенные типы документов, лучше всего использовать ВЫРАЗИТЬ. Это позволяет явно указать платформе, к какой таблице нужно обратиться. Однако стоит помнить, что это работает эффективно только в том случае, если тип значения заранее известен или ограничен.
Попробуйте заменить стандартное обращение на использование ВЫРАЗИТЬ:
ВЫРАЗИТЬ(ПредметыЗадач.Предмет КАК Справочник.ВнутренниеДокументы).ВидДокумента
В (&ВидПредмета_КассовыеДокументы)
Важно: проверяйте наличие реквизитов у конкретного типа, к которому вы приводите данные, так как у разных объектов 1С структура может сильно отличаться.
Если ВЫРАЗИТЬ не дает ощутимого прироста или архитектура запроса не позволяет его использовать, переходите к стратегии разделения логики. Не пытайтесь получить все данные одним гигантским запросом. Создайте временную таблицу ВТ_Предметы, в которую предварительно поместите нужные идентификаторы, отобранные по конкретным условиям.
Соединение с заранее подготовленной ВТ работает значительно быстрее, чем сложные условия с ИЛИ и подзапросами, так как SQL Server выполняет соединение с уже отфильтрованным набором данных.
Наиболее эффективным решением при работе с разными областями делегирования или группами предметов является разделение основного запроса на блоки с помощью ОБЪЕДИНИТЬ ВСЕ. Это позволяет платформе построить несколько независимых, простых планов выполнения для каждой части запроса вместо одной громоздкой структуры.
Разберем пример реструктуризации логики:
ВЫБРАТЬ ... ИЗ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
ГДЕ ... И (Условие1)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ... ИЗ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
ГДЕ ... И (Условие2)
Этот подход позволил нам сократить время выполнения с 58 секунд до менее чем 1 секунды. После объединения результатов не забудьте применить группировку, если в исходном запросе были дубликаты записей.
Часто в запросах 1С встречаются длинные цепочки ВЫБОР КОГДА для преобразования значений перечислений в числовые коды (например, для отображения иконок в интерфейсе). Если таких условий много или они часто меняются, рассмотрите вариант использования Таблицы Значений, которую можно передать в запрос как параметр и соединить с основным результатом. Это сделает код чище и избавит SQL от выполнения избыточных вычислений в каждой строке выборки.
Table Scan по большим таблицам задач.Применяя эти подходы, вы сможете добиться высокой скорости работы даже в тех частях системы, где нагрузка на базу данных 1С:Документооборот является максимальной.