База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как оптимизировать SQL-запрос динамического списка в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 3 часа, 22 минуты назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
11 марта 2026 в 13:15 #36091
Проверь текст запроса динамического списка на предмет оптимальности. Что можно сделать для ускорения его работы ВЫБРАТЬ
ДокументыПредприятия.Документ КАК Ссылка,
ДокументыПредприятия.ПометкаУдаления КАК ПометкаУдаления,
ДокументыПредприятия.РегистрационныйНомер КАК РегистрационныйНомер,
ДокументыПредприятия.ДатаРегистрации КАК ДатаРегистрации,
ДокументыПредприятия.ДатаСортировки КАК ДатаСортировки,
ДокументыПредприятия.ВидДокумента КАК ВидДокумента,
ДокументыПредприятия.Наименование КАК Наименование,
ВЫРАЗИТЬ(ДокументыПредприятия.Содержание КАК СТРОКА(500)) КАК Содержание,
ВЫРАЗИТЬ(ДокументыПредприятия.КонтрагентыДляСписков КАК СТРОКА(1000)) КАК Контрагенты,
ДокументыПредприятия.Папка КАК Папка,
ДокументыПредприятия.Подготовил КАК Подготовил,
ДокументыПредприятия.Подразделение КАК Подразделение,
ДокументыПредприятия.Утвердил КАК Утвердил,
ДокументыПредприятия.ВопросДеятельности КАК ВопросДеятельности,
ДокументыПредприятия.Дело КАК Дело,
ДокументыПредприятия.СрокИсполнения КАК СрокИсполнения,
ДокументыПредприятия.Зарегистрировал КАК Зарегистрировал,
ДокументыПредприятия.Ответственный КАК Ответственный,
ДокументыПредприятия.ЧисловойНомер КАК ЧисловойНомер,
ДокументыПредприятия.Заголовок КАК Заголовок,
ДокументыПредприятия.Код КАК ВнутреннийНомер,
ДокументыПредприятия.ДатаСоздания КАК ДатаСоздания,
ДокументыПредприятия.Организация КАК Организация,
ДокументыПредприятия.НеДействует КАК НеДействует,
ДокументыПредприятия.НоменклатураДел КАК НоменклатураДел,
ДокументыПредприятия.Сумма КАК Сумма,
ДокументыПредприятия.Валюта КАК Валюта,
ДокументыПредприятия.ДатаНачалаДействия КАК ДатаНачалаДействия,
ДокументыПредприятия.ДатаОкончанияДействия КАК ДатаОкончанияДействия,
ДокументыПредприятия.Проект КАК Проект,
ДокументыПредприятия.ПредставлениеСостояния КАК Состояние,
ДокументыПредприятия.СодержитОригинал КАК СодержитОригинал,
ДокументыПредприятия.РегистрационныйНомерИДата КАК РегистрационныйНомерИДата,
ДокументыПредприятия.ЕстьФайлы КАК ЕстьФайлы,
ВЫБОР
КОГДА ДокументыПредприятия.СостояниеОбработки = ЗНАЧЕНИЕ(Перечисление.СостоянияОбработкиОбъектов.Завершена)
ТОГДА 0
КОГДА ДокументыПредприятия.СостояниеОбработки = ЗНАЧЕНИЕ(Перечисление.СостоянияОбработкиОбъектов.Выполняется)
ТОГДА 1
КОГДА ДокументыПредприятия.СостояниеОбработки = ЗНАЧЕНИЕ(Перечисление.СостоянияОбработкиОбъектов.Остановлена)
ТОГДА 2
КОГДА ДокументыПредприятия.СостояниеОбработки = ЗНАЧЕНИЕ(Перечисление.СостоянияВыполненияДействий.Выполняется)
ТОГДА 1
ИНАЧЕ 3
КОНЕЦ КАК Задачи,
ДокументыПредприятия.ПодписанЭП КАК ПодписанЭП,
ДокументыПредприятия.Исполнен КАК Исполнен,
ДокументыПредприятия.ЕстьКатегории КАК ЕстьКатегорииДанных,
ДокументыПредприятия.СтатусЭП КАК СтатусЭП,
ВЫБОР
КОГДА ДокументыПредприятия.СтатусЭП = ЗНАЧЕНИЕ(Перечисление.СтатусПроверкиЭП.ПодписиНет)
ТОГДА 0
КОГДА ДокументыПредприятия.СтатусЭП = ЗНАЧЕНИЕ(Перечисление.СтатусПроверкиЭП.ПодписьНеПроверена)
ТОГДА 1
КОГДА ДокументыПредприятия.СтатусЭП = ЗНАЧЕНИЕ(Перечисление.СтатусПроверкиЭП.ПодписьДействительна)
ТОГДА 2
КОГДА ДокументыПредприятия.СтатусЭП = ЗНАЧЕНИЕ(Перечисление.СтатусПроверкиЭП.ПодписьНедействительна)
ТОГДА 3
ИНАЧЕ ВЫБОР
КОГДА ДокументыПредприятия.ПодписанЭП
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ КАК СтатусПроверкиЭП,
ВЫБОР
КОГДА ДокументыПредприятия.СостояниеКонтроля = ЗНАЧЕНИЕ(Перечисление.СостоянияКонтроля.НаКонтроле)
ТОГДА ВЫБОР
КОГДА ДокументыПредприятия.СрокКонтроля = ДАТАВРЕМЯ(1, 1, 1)
ИЛИ ДокументыПредприятия.СрокКонтроля >= &ТекущаяДата
ТОГДА 1
ИНАЧЕ 3
КОНЕЦ
КОГДА ДокументыПредприятия.СостояниеКонтроля = ЗНАЧЕНИЕ(Перечисление.СостоянияКонтроля.СнятсКонтроля)
ТОГДА 4
КОГДА ДокументыПредприятия.СостояниеКонтроля = ЗНАЧЕНИЕ(Перечисление.СостоянияКонтроля.НаКонтролеНесколько)
ТОГДА ВЫБОР
КОГДА ДокументыПредприятия.СрокКонтроля = ДАТАВРЕМЯ(1, 1, 1) -
11 марта 2026 в 13:15 #36092
Разбор и рекомендации по оптимизации вашего запроса динамического списка:
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/
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.