Как оптимизировать сложный запрос в 1С:Документооборот при работе с задачами и составными типами данных?

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

Одной из наиболее частых причин медленной работы списков в 1С:Документооборот является использование сложных запросов, которые обращаются к полям составного типа через точку. В частности, при фильтрации задач по Предмету и его реквизитам (например, ВидДокумента) платформа вынуждена генерировать множество соединений LEFT JOIN ко всем таблицам, входящим в составной тип. Это критически замедляет выполнение кода на стороне SQL Server.

Разбор причины тормозов

Когда вы обращаетесь к полю Предмет.ВидДокумента, SQL Server не знает заранее, к какому именно справочнику или документу относится ссылка в конкретной строке. В результате оптимизатор вынужден строить план запроса с учетом всех возможных вариантов таблиц, что приводит к огромным нагрузкам. В ходе анализа мы выяснили, что даже простое исключение таких полей из ВЫБРАТЬ или оптимизация условий ГДЕ может сократить время выполнения запроса с десятков секунд до долей секунды.

Шаг 1: Устранение обращения к полям составного типа через точку

Первым делом необходимо пересмотреть условия, в которых используется точечная нотация. Если вам нужно отфильтровать только определенные типы документов, лучше всего использовать ВЫРАЗИТЬ. Это позволяет явно указать платформе, к какой таблице нужно обратиться. Однако стоит помнить, что это работает эффективно только в том случае, если тип значения заранее известен или ограничен.

Попробуйте заменить стандартное обращение на использование ВЫРАЗИТЬ:


ВЫРАЗИТЬ(ПредметыЗадач.Предмет КАК Справочник.ВнутренниеДокументы).ВидДокумента 
В (&ВидПредмета_КассовыеДокументы)

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

Шаг 2: Использование временных таблиц для фильтрации

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

Соединение с заранее подготовленной ВТ работает значительно быстрее, чем сложные условия с ИЛИ и подзапросами, так как SQL Server выполняет соединение с уже отфильтрованным набором данных.

Шаг 3: Применение конструкции ОБЪЕДИНИТЬ ВСЕ

Наиболее эффективным решением при работе с разными областями делегирования или группами предметов является разделение основного запроса на блоки с помощью ОБЪЕДИНИТЬ ВСЕ. Это позволяет платформе построить несколько независимых, простых планов выполнения для каждой части запроса вместо одной громоздкой структуры.

Разберем пример реструктуризации логики:


ВЫБРАТЬ ... ИЗ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя 
ГДЕ ... И (Условие1)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ... ИЗ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя 
ГДЕ ... И (Условие2)

Этот подход позволил нам сократить время выполнения с 58 секунд до менее чем 1 секунды. После объединения результатов не забудьте применить группировку, если в исходном запросе были дубликаты записей.

Шаг 4: Оптимизация выбора значений (CASE)

Часто в запросах встречаются длинные цепочки ВЫБОР КОГДА для преобразования значений перечислений в числовые коды (например, для отображения иконок в интерфейсе). Если таких условий много или они часто меняются, рассмотрите вариант использования Таблицы Значений, которую можно передать в запрос как параметр и соединить с основным результатом. Это сделает код чище и избавит SQL от выполнения избыточных вычислений в каждой строке выборки.

Итоговые рекомендации по поддержке производительности

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

← На главную