Популярная задача на собеседовании - оптимизировать запрос к виртуальной таблице регистра накопления, например
ВЫБРАТЬ
...
ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки() КАК ТоварыНаСкладах
Где &Условие
При этом экзаменатор ждет ответа, что &Условие лучше помещать не в секции "ГДЕ", а параметром виртуальной таблицы "Остатки".
Не нужно его разочаровывать.
Хотя в статье https://its.1c.ru/db/metod8dev/content/5457 указано, что это не всегда так. Вкратце, условие должно быть простым и эффективным - то есть отсеивать значительную часть данных. Других условий нужно избегать, или даже их помещать в секцию "ГДЕ".
Но мне особенно повезло: попалось условие типа Номенклатура в (&СписокНоменклатуры) и я предложил не только поместить условие внутрь виртуальной таблицы, но и индексировать &СписокНоменклатуры. Чтобы ускорить обработку списка на случай, если список будет большим.
Слово "ускорить" вызывает положительные эмоции даже у тех, кто равнодушен к фотографиям котиков и собачек. Даже у меня вызывает.
Для индексирования нужно создать дополнительную временную таблицу. В итоге получилось как-то так:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ПОМЕСТИТЬ тТовары
ИЗ Справочник.Номенклатура КАК Номенклатура
ГДЕ Номенклатура.Ссылка В(&СписокНоменклатуры)
ИНДЕКСИРОВАТЬ ПО Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
*
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(,
Номенклатура В (ВЫБРАТЬ тТовары.Ссылка ИЗ тТовары КАК тТовары))
КАК ТоварыНаСкладах
Собеседование прошло в позитивном ключе.
Когда я вернулся на свое рабочее место, решил проверить на своих данных. В качестве &Условие я взял "Номенклатура в Иерархии(&Товары)" которое согласно статье https://its.1c.ru/db/metod8dev/content/5457 является сложным (генерирует много подзапросов при трансляции в SQL) и неэффективным (сюда попадает 99% справочника). Но оно необходимо - исключить Материалы. Это условие у меня дает список 10 тысяч элементов.
Ниже замеры времени на моих данных, которые показывают порядок разницы в скорости. Если кто-то сочтет пример неподробным - может проверить на своих данных.
1. Условие в секции "ГДЕ" - 94 сек.
2. Условие внутри виртуальной таблицы - 94 сек.
3. Предварительное индексирование временной таблицей, в секции "ГДЕ" 3 сек.
4. Предварительное индексирование временной таблицей, внутри виртуальной таблицы 3 сек.
В данном случае ожидания от индексации оправдались. Но конечно индексировать все подряд, на "всякий случай" - бессмысленно.
В первой редакции статьи запрос был к регистру оборотов "Продажи". Заменил на остатки, регистр Товары на складах.