Имя: Пароль:
1C
1С v8
Когда построитель отчета/запроса фактически выполняет запрос?
0 Asmody
 
31.01.22
16:51
В СП написано:

ПостроительОтчета (ReportBuilder)
Выполнить (Execute)
Синтаксис:
Выполнить()
Описание:
Выполняет запрос, построенный для отчета

казалось бы, однако дальше написано:

Примечание:
Выставляет внутренний флаг необходимости перевыполнения запроса при выводе отчета (метод Вывести) и получении результата запроса.

т.е. по факту Выполнить() ничего не выполняет. Что, в общем-то, подтверждают замеры.

Внимание, вопрос - это оно давно так?
1 Ненавижу 1С
 
гуру
31.01.22
17:08
Надо этот тип пометить как obsolete/deprecated
2 Casey1984
 
31.01.22
17:09
(0) А если к полю Результат обратиться, выполняется запрос?
3 Casey1984
 
31.01.22
17:10
(2) А вот наверное ответ: "и получении результата запроса"
4 ale-sarin
 
31.01.22
17:15
Давно. По мне, так всегда было. Запрос к БД выполняется не при Выполнить(), а при обращении к результату.
Результат = Построитель.Выполнить(); // Запрос не выполняется
ТЗ = Результат.Выгрузить(); // Вот тут и будет выполнен запрос.
5 ale-sarin
 
31.01.22
17:16
В первый раз, конечно, тоже было неожиданно, надо признаться.
6 Casey1984
 
31.01.22
17:17
(0) Судя по посту https://forum.infostart.ru/forum9/topic53309/ давно/всегда :-)
7 ale-sarin
 
31.01.22
17:19
Опечатка у меня.
Построитель.Выполнить()
и
Построитель.Результат.Выгрузить()
8 VS-1976
 
31.01.22
18:27
(0) Ну как же не выполняет, а кто будет преобразовывать текст в текст запроса для объекта запрос? Просто второй раз не просит уже
9 acht
 
31.01.22
20:15
(8) "преобразовывать текст в текст запроса для объекта запрос" и обращаться к информационной базе - сильно разные вещи.
10 VS-1976
 
31.01.22
20:51
(9) ну так это же не .Выбрать(), а всего лишь .Выполнить()
11 ДедМорроз
 
31.01.22
22:29
Как бы,во взрослом sql есть отдельно prepare,когда формируется план запроса и execute,когда запрос выполняется.
Так что ничего удивительного.
12 pechkin
 
31.01.22
22:31
Интересно какой смысл в такой "оптимизации".
В каком сценарии нужно построитель выполнить, но ничего не получать?
13 Asmody
 
31.01.22
23:09
(12) давеча наткнулся на кусок 💩🐘 (или, как его называют, "легаси-кода"), где было получение результата построителя без Выполнить().
Вот тут меня сомнения накрыли.
14 pechkin
 
31.01.22
23:18
А у построителя запроса аналогично?
15 ale-sarin
 
01.02.22
09:55
(14) Да
16 fisher
 
01.02.22
12:47
Прикольно. Любопытный пример плохого дизайна.
17 Asmody
 
02.02.22
21:10
Сегодня нарвался на ещё один эффект: если тот самый построитель с тяжелым запросом открыть в отладчике до установки всяких отборов, то можно получить неслабую висюльку "на двоих".

Слушай, обидно, ничего не сделал, только вошёл
https://www.youtube.com/watch?v=ksRVC_UAYyA
18 mistеr
 
02.02.22
21:38
(16) Или плохой документации, как посмотреть.
19 sitex
 
naïve
02.02.22
21:53
(0) Если база SQL то включаем Profiler и анализируем
20 TormozIT
 
гуру
03.02.22
00:45
(17) 10 лет назад я пожаловался на эту особенность в 1С. Но исправлять не стали. https://partners.v8.1c.ru/forum/topic/1039031
21 TormozIT
 
гуру
03.02.22
00:50
(20)+ Забавный факт. Через 2 года переписки по этой проблеме я получил ответ "интересующая Вас ошибка еще готовится к публикации в системе". До сих пор видимо "публикуют".
22 fisher
 
03.02.22
10:22
(18) Если метод Выполнить() ничего не выполняет и не потому что кэш, а потому что выполнение будет в другом месте - это плохой дизайн API.
Во-первых, метод нужно было назвать иначе ибо его название вводит в заблуждение. Во-вторых, даже с учетом документации нифига неочевидно, зачем он нужен и как его правильно применять.
23 Asmody
 
03.02.22
11:50
(21) Понятно, что они давно забили на построители, ибо мейнстрим - это СКД. А проблемы индейцев шерифа, как известно, не пенетрируют.
24 TormozIT
 
гуру
04.02.22
12:12
Сегодня мне сообщили из 1С, что баг (20) 20003151 исправлен в 8.3.5
25 Курцвейл
 
04.02.22
12:24
если бы писали приложение на java или иных ООП языках, то было понятнее почему и зачем так сделано.