Оптимизация производительности динамических списков в 1С 8.3
Симптомы деградации производительности динамических списков
При открытии форм списков документов, справочников или журналов пользователи сталкиваются с длительным зависанием интерфейса (от нескольких секунд до минут), появлением диалогового окна «Ожидание ответа сервера», резким ростом очередей на дисковую подсистему СУБД и жалобами на «фризы» при динамической прокрутке записей колесиком мыши.
| Симптом / Поведение | Место фиксации | Причина возникновения |
|---|---|---|
| Задержка 5–15 секунд при первичном открытии формы списка | Клиент 1С / APDEX | Вычисление общего количества строк (ОтображатьКоличество = Истина) или неоптимизированный произвольный запрос |
| Зависание при листании списка вниз | SQL Server Profiler (запросы с TOP 45) | Отсутствие индекса под текущий порядок сортировки динамического списка |
| Высокая загрузка TempDB / Spills to disk | План выполнения MS SQL (Sort/Hash Join) | Использование левых соединений с виртуальными таблицами итогов и подзапросов в тексте запроса списка |
Методы оптимизации и устранения узких мест динамических списков
- Отключение подсчета общего числа строк:
Подсчет количества записей принудительно заставляет СУБД сканировать всю таблицу (Table Scan / Index Scan), игнорируя порционную выборку
TOP N:// В свойствах элемента формы 'Список' или программно при создании на сервере: Элементы.Список.ОтображатьКоличество = Ложь; Список.ДинамическоеСчитываниеДанных = Истина; - Отказ от соединений с виртуальными таблицами и подзапросов:
Не используйте в запросе динамического списка конструкции
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки(...). Виртуальные таблицы рассчитывают остатки на лету на «точку времени», что приводит к блокировкам и сканированию миллионов строк. Выносите расчет остатков в контекст формы или используйте денормализованные реквизиты объектов. - Настройка правильной индексации под порядок сортировки:
Динамический список считывает порции записей (обычно по 20–45 строк) с условием
WHERE ПолеСортировки > @ПоследнееЗначение ORDER BY ПолеСортировки ASC. Если поле сортировки (например, реквизит «Автор» или «СуммаДокумента») не проиндексировано в СУБД, сервер выполнит полную сортировку всей таблицы в памяти.// Включение индексации реквизита в метаданных: // Конфигуратор -> Свойства реквизита -> Индексировать -> Индексировать (или С доп. упорядочиванием) - Принудительное ограничение используемых колонок:
Уберите флаг «Использовать всегда» у всех колонок динамического списка, кроме системных (Ссылка, ПометкаУдаления). Если флаг активен, поле выгружается с сервера даже тогда, когда колонка скрыта пользователем в настройках формы.
Важное архитектурное правило: Избегайте использования функций ВЫРАЗИТЬ(... КАК СТРОКА) и логических блоков ВЫБОР КОГДА ... ТОГДА в секции ГДЕ произвольного запроса динамического списка. Они делают предикат не sargable, исключая применение индексов таблицы.
Частые вопросы (FAQ)
Почему включение галочки 'Динамическое считывание данных' иногда не помогает?
Динамическое считывание автоматически отключается платформой 1С, если в свойствах списка установлен флаг подсчета итогов, если в коде вызывается метод Список.Количество(), либо если в запросе отсутствует возможность однозначного упорядочивания по уникальному ключу (Ссылка).
Как влияет условное оформление динамического списка на производительность?
Если условное оформление наложено на строки с проверкой тяжелых условий (например, анализ реквизитов через точку), платформа вычисляет правила для каждой отображаемой строки на клиенте, вызывая задержки при отрисовке интерфейса.
Можно ли использовать временные таблицы в динамическом списке?
Нет, механизм динамических списков платформы 1С не поддерживает пакетные запросы с оператором создания временных таблиц ПОМЕСТИТЬ. Допускается только одиночный запрос SELECT.
Как увидеть реальный SQL-запрос, который динамический список отправляет в базу?
Необходимо настроить сбор технологического журнала 1С (событие SDBL или DBMSSQL с фильтром по контексту формы) либо использовать трассировку через MS SQL Profiler / Extended Events.