Оптимизация 1С

1С Динамический Список - Рекомендации по проектированию

Замечания по динамическим спискам с произвольным запросом:
Списки без динамического считывания не предназначены для скроллинга более 1000 строк, поэтому должны возвращать не больше 1000 строк!
В списках без динамического считывания при скроллинге выполняется "ВЫБРАТЬ ПЕРВЫЕ 1000", "ВЫБРАТЬ ПЕРВЫЕ 2000", "ВЫБРАТЬ ПЕРВЫЕ 3000" - чем дальше скролишь, тем медленнее...
Если в списке более 1000 строк необходимо использовать динамическое считывание!
В списках с динамическим считыванием всегда "ВЫБРАТЬ ПЕРВЫЕ 35-50 (зависит от разрешения экрана)" начиная с условия след. порции данных (определяется упорядочиванием и уникальным ключем осн. Таблицы)

Использование соединения основной таблицы с вложенными запросами в динамических списках:
1. Надо стараться что бы вложенные запросы или виртуальные таблицы возвращали как можно меньшее кво строк
2. Обязательно подумать над тем что кво строк вложенного запроса или вирт. таблицы не росло линейно со временем!!!
3. Хорошо подходит вирт. таблица остатков или среза последних с условиями по измерениям и без условия на период (что бы использовались текущие итоги)
4. Начиная с 8.3.8 в динамических списках можно применять временные таблицы... Это может улучшить производительность по сравнению с использованием подзапросов, но усложняет отладку запросов...

УПОРЯДОЧИВАНИЕ
Надо применять только по индексированным полям основной таблицы!!! иначе динамическое считываение порций работает плохо!!!

ОТБОРЫ/ПОИСК
1. Отборы необходимо применять только по индексированным полям основной таблицы (лучший вариант) или таблицам просоединенным внутр. соединением!!! Иначе платформа добавлет ISNULL и отбор по индексу может не работать!
2. Использование ПОДОБНО: по началу строки (с % в конце!)
3. Использование "ИЛИ": Несколько ИЛИ в "ГДЕ" можно заменить на "Ссылка В (запрос с несколькими объединениями)"
"ГДЕ Наименование = &Наименование ИЛИ Код = &Код" меняем на "ГДЕ Ссылка В (ВЫБРАТЬ Ссылка ИЗ... ГДЕ Наименование = &Наименование ОБЪЕДИНИТЬ ВЫБРАТЬ Ссылка ИЗ... ГДЕ Код = &Код)"

RLS !!!
Ссылки получаются без RLS: ВЫБРАТЬ ОснТаблица.Контрагент - RLS по контрагентам в запрос добавлен не будет
Представления ссылок для отображения - отдельный запрос на список отображаемых ссылок (аналогично "ПриПолученииДанных"), к запросу добавляется RLS
Использование "ПРЕДСТАВЛЕНИЕ()" в запросе добавит RLS в основной запрос, при этом запроса на получения представления этой ссылки для отображения уже не будет...

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

Недавно разбирался с тормозами дин. списков у одного из клиентов:
Две причины:
1. Отсутствие индекса по полю упорядочивания списка (не работает первые N по индексу)
2. Большое кво строк (>100000) из вложенных запросов

Первая проблема решается использоваением упорядочивания списков только по индексированным полям основной таблицы

Вторая проблема имеет несколько вариантов решения:
- Отказаться от вложенных запросов (все засунуть в спец. регистр сведений/регистр накопления)
- Вынести вложенные запросы во временные таблицы (режим совместимости 8.3.8)
- Устанавливать отбор (какой-то признак разделения старых и актуальных данных) внутри вложенных запросов (для уменьшения кво строк)

Придумать какой-то признак актуальности мне кажется очень даже реально...
Что бы из вложенных запросов не выходило 100 тыс строк из которых 90 тыс уже совсем старые и их точно не надо пытаться соединять с основной таблицей...

Полезные ссылки:
http://www.develplatform.com/2013/01/blog-post.html
http://its.1c.ua/db/metod8dev/content/4123/hdoc

Вот несколько замечаний, которые надо донести до пользователей, что бы списки работали быстрее:
1. Список должен быть упорядочен по полю "Дата" (или другому индексированному полю осн. таблицы списка).
Надо определится с такими полями и проиндексировать их! Например на скрине видно что список упорядочен по полю "Срок выполнение" - по которому нет индекса
2. Не злоупотреблять добавлением новых полей в список, с помощью диалога "Настройка списка"/"Настройка формы"
3. Ну и поиск выполнять "по точному совпадению" или "с начала строки"
Эти условия не обязательно выполнять, но тогда надо понимать что список будет тормозить!

1С Динамический Список