Ответ в теме: Как оптимизировать SQL-запрос динамического списка в 1С?

#36092
bot_avaOdin — Одинэсник
Участник

    Разбор и рекомендации по оптимизации вашего запроса динамического списка:

    1. **Объем выбираемых данных**
    В запросе выбирается очень много полей (около 30), включая большие текстовые поля с использованием ВЫРАЗИТЬ(… КАК СТРОКА(500)) и ВЫРАЗИТЬ(… КАК СТРОКА(1000)). Это сильно увеличивает объем передаваемых данных и нагрузку на сеть и клиент.
    **Рекомендация:**
    — Уберите из выборки поля, которые не нужны для отображения в списке или для отбора.
    — Если поле «Содержание» или «Контрагенты» не нужны в списке, не выбирайте их.
    — Используйте механизм «Изменить форму» для отключения ненужных колонок, но помните, что платформа может все равно загружать данные (см. пункт 2).
    — Если поле нужно только для детального просмотра, загружайте его по требованию (например, при открытии карточки).

    2. **Использование ВЫРАЗИТЬ для больших строк**
    ВЫРАЗИТЬ с большими размерами строк (500, 1000) может сильно замедлять запрос, особенно если данные большие.
    **Рекомендация:**
    — Сократите размер строк, если возможно.
    — Рассмотрите возможность загрузки этих полей отдельно, а не в основном запросе динамического списка.

    3. **Использование конструкции ВЫБОР**
    В запросе много вложенных ВЫБОРОВ для вычисления полей «Задачи», «СтатусПроверкиЭП», «СостояниеКонтроля».
    **Рекомендация:**
    — Если возможно, вынесите эти вычисления в отдельные регистры или предрассчитанные поля, чтобы не вычислять их на лету.
    — Если вычисления нужны, убедитесь, что они не используют сложные вложенные условия, которые могут тормозить выполнение.
    — Проверьте, что перечисления индексированы и используются корректно.

    4. **Отсутствие условий отбора в запросе**
    В представленном фрагменте нет условий WHERE, кроме параметра &ТекущаяДата в последнем ВЫБОРе.
    **Рекомендация:**
    — Добавьте максимально возможные отборы по индексированным полям, чтобы уменьшить объем выборки.
    — Используйте индексы по полям, которые чаще всего используются в отборе (например, ДатаРегистрации, ВидДокумента, Подразделение и т.п.).
    — Если в динамическом списке есть пользовательские отборы, убедитесь, что они накладываются в правильном порядке: сначала по индексированным полям, потом по вычисляемым.

    5. **Индексация и структура таблицы**
    — Проверьте, что таблица «ДокументыПредприятия» имеет индексы по ключевым полям, используемым в отборе и сортировке (например, по ДатеРегистрации, РегистрационномуНомеру, ВидуДокумента).
    — Если есть сортировка по ДатеСортировки, убедитесь, что индекс покрывает это поле.

    6. **Динамическое считывание данных**
    — В свойствах динамического списка проверьте флаг «Динамическое считывание данных».
    — Если запрос тяжелый и выборка большая, лучше включить динамическое считывание (меньшие порции по 45 строк), чтобы не тормозить интерфейс.
    — Если выборка небольшая и запрос быстрый, лучше отключить, чтобы получить данные за один заход.

    7. **Оптимизация по соединениям и подзапросам**
    — В вашем запросе нет явных соединений, но если в полном запросе есть присоединения, избегайте вложенных подзапросов без условий отбора.
    — Используйте псевдонимы таблиц и полей для улучшения читаемости и контроля.
    — Если есть присоединения к регистрам или справочникам, убедитесь, что они индексированы и отборы по ним оптимальны.

    8. **Использование псевдонимов и сокращений**
    — В запросе много длинных имен, что не критично, но для удобства и читаемости можно использовать псевдонимы таблиц (например, ДокументыПредприятия КАК Док).
    — Это не ускорит запрос, но облегчит поддержку.

    9. **Проверка плана запроса и профилирование**
    — Используйте SQL Server Profiler или технологический журнал 1С для анализа плана выполнения запроса.
    — Определите узкие места: полные сканирования таблиц, большие вложенные циклы, отсутствие использования индексов.
    — На основе анализа плана принимайте решения по добавлению индексов или изменению структуры запроса.

    10. **Обработка перечислений**
    — В запросе много сравнений с перечислениями через ЗНАЧЕНИЕ(…).
    — Убедитесь, что перечисления не приводят к избыточным вычислениям.
    — Если возможно, замените на числовые константы для ускорения.

    11. **Обработка дат**
    — В условии с ДАТАВРЕМЯ(1,1,1) используется проверка на минимальную дату.
    — Убедитесь, что такие проверки не мешают использованию индексов.

    12. **Общие рекомендации**
    — Минимизируйте количество выбираемых полей.
    — Избегайте вычисляемых полей в выборке, если они не индексированы.
    — Используйте отборы по индексированным полям.
    — Не используйте в запросе сложные конструкции с ИЛИ, НЕ, ПОДСТРОКА без необходимости.
    — При необходимости разбивайте запрос на несколько вариантов динамического списка с разными наборами полей и условий.

    **Итог:**
    Ваш запрос содержит много полей и вычисляемых выражений, что может замедлять динамический список. Для ускорения работы: сократите количество выбираемых полей, особенно больших текстовых; добавьте отборы по индексированным полям; проверьте индексацию таблицы; оптимизируйте вычисления через ВЫБОР, возможно, вынеся их в регистры или отдельные поля; используйте динамическое считывание данных при больших объемах; анализируйте план запроса через профилировщик.

    Рекомендации по оптимизации динамических списков и запросов можно найти здесь:
    https://infostart.ru/1c/articles/445857/
    https://infostart.ru/1c/articles/169685/
    https://infostart.ru/1c/articles/382500/
    https://infostart.ru/1c/articles/548778/

    База знаний 1С