Дня доброго.
Давненько тут не писал, но вот надо бы.
Пилим мы тут своё и столкнулся я с тем, что чёт запрос по маркам подтормаживает на ровном месте. Начал разбирать и обнаружил вот такие пироги с котятами:
Есть у нас справочник на 10000 элементов с одним реквизитом
реквизит1, из которого берется представление в виде:
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
Поля.Добавить("Реквизит1");
КонецПроцедуры
И есть у нас простой запрос вида:
ВЫБРАТЬ
Справочник1.Представление КАК Представление
ИЗ
Справочник.Справочник1 КАК Справочник1
отловив его через профайлер, мы увидим понятную картинку:
SELECT T1._Fld72
FROM dbo._Reference71 T1
но, поменяв вроде бы запрос на такой же:
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ(Справочник1.Ссылка) КАК Представление
ИЗ
Справочник.Справочник1 КАК Справочник1
мы увидим вот такой запрос:
SELECT T2._Fld72
FROM dbo._Reference71 T1
LEFT OUTER JOIN dbo._Reference71 T2
ON T1._IDRRef = T2._IDRRef
на 10000 элементов это чувствоваться не будет, SQL просто прочитает таблицу, но на многомиллионных таблицах уже будут значительные просадки.
Смысл этого левого соединения очевиден - функция ПРЕДСТАВЛЕНИЕ() может быть применена не к реквизиту Ссылка, а, например, к реквизиту "Автор" другого справочника, а 1С поленилась сделать исключение для реквизита Ссылка.
Вот такие пироги на ровном месте бывают, я вот этого не знал.