Имя: Пароль:
1C
1С v8
Чем плох запрос в цикле??
,
0 dubolom
 
22.11.21
08:26
В самом деле, пару раз слышал, что это - плохо. Но вот пример! Допустим, надо получить из регистра сведений ЦеныНоменклатуры цены по всей номенклатуре и нескольким складам.
Номенклатуру-то одним запросом выдернуть не проблема, но вот по каждому складу надо свой запрос формировать. То есть, во-первых, это необходимо, а во-вторых, ничем не плохо. Говорят, якобы тормозит сильно, но у меня выполняется моментально.
Зачем огород городить с запретом запросов в цикле?
1 ГеннадийУО
 
22.11.21
08:28
(0) Это смотря какой запрос, и какой цикл :)
2 Обработка
 
22.11.21
08:28
(0) Если не критично то можно юзать запрос цикле.
А вот если все можно одним запросом вытащить потом просто юзать почему бы не сделать?
3 DGorgoN
 
22.11.21
08:28
(0) По каждому складу тоже не проблема. Проблема когда запросы уж очень сложные. Тогда их построение вызывает вопросы.
4 Мимохожий Однако
 
22.11.21
08:31
(0) Достаточно сделать замеры, чтобы определиться. Зависит от конкретной базы и её заполненности.
Огород делают, чтобы его не затоптали. Если некому топтать, то можно и без огорода.
5 Обработка
 
22.11.21
08:35
Если циклов 1-2-3 Ну пусть даже 10 раз и это оправдано логикой обработки данных запроса то можно.
А вот если у тебя в цикле уже 100-200 раз запрос с неким параметром отбора то это гов-код. Стыдно за такое.
6 Merkalov
 
22.11.21
08:38
Из любого правила есть исключения. Не стоит повторять это как мантру "запросы цикле запрещены...запросы в цикле запрещены". Но у автора похоже не этот случай:)
7 ГеннадийУО
 
22.11.21
08:47
(2) Внезапно, запрос в цикле может оказаться быстрее одного запроса :)
8 dmpl
 
22.11.21
09:01
(0) Он плох тем, что те, кто задает такие вопросы, обычно получают медленно работающий код через 1-2 года эксплуатации базы. Или раньше.
9 Chai Nic
 
22.11.21
09:02
(8) Или не получают. Зависит от запроса. И от цикла. )
10 Garykom
 
гуру
22.11.21
09:05
(7) Нет
Правильный запрос в цикле может оказаться быстрее кривого и запутанного одного запроса
11 Garykom
 
гуру
22.11.21
09:06
Язык запросов прекрасно позволяет используя составные запросы и ВТ организовать цикл(ы) унутри субд
12 acht
 
22.11.21
09:07
(0) Запрос в цикле плох тем, что своим существованием дает скучающим пищу для троллинга.
И ты еще голосовалку прикрутить забыл.
13 dmpl
 
22.11.21
09:09
(9) Не, они - получают. Если только не в ларьке, где хватило бы Excel.
14 Strogg
 
22.11.21
09:10
(0) Глянь план построения какого нибудь тяжелого запроса, который строит кластер к базе sql и умножь его она количество итераций. И тогда увидишь, что будет эффективнее - либо каждую итерацию строящийся план запроса, либо запрос к БД 1 раз.
Но тут правильно сказали, что все зависито от цикла и от запроса.
15 acht
 
22.11.21
09:12
(14) Не корми
16 Garykom
 
гуру
22.11.21
09:15
теоретически субд может быть кластерная и можно цикл на разные потоки разбить да
17 Garykom
 
гуру
22.11.21
09:16
Кстати!

Когда в 1С появятся запросы на запись? Ну хотя бы для РС?
18 Chai Nic
 
22.11.21
09:17
(11) Язык запросов позволяет положить sql-сервер соединением журнала проводок самим с собой без условия. Тоже неплохо.
19 ГеннадийУО
 
22.11.21
09:17
(10) Не всегда можно для простого запроса для одного набора параметров построить эффективный запрос для нескольких наборов параметров.
20 Ненавижу 1С
 
гуру
22.11.21
09:26
Запрос в цикле обычно медленнее адекватного одного запроса.
Запретов нет прямых, можно использовать, но с оглядкой, что может просесть производительность.
Преждевременная оптимизация зло, но в 1С к коду редко возвращаются из-за оптимизации.
Если складов 5, то может и норм, а если это 100500 товаров, то нет.
21 mikecool
 
22.11.21
09:31
запрос в цикле - это нарушение принципа чистого кода, который ты так провозглашаешь в своей разработке
22 Garykom
 
гуру
22.11.21
09:33
(19) Это пока не умеешь в запросы
23 xkanix
 
22.11.21
09:34
(17) Скорее всего никогда :(
Ведь должна же "бизнес логигка" отрабатывать.
24 Garykom
 
гуру
22.11.21
09:35
(23) а как же случаи "ОбменДанными.Загрузка = Истина" ?
25 dmpl
 
22.11.21
09:36
(24) Это просто пожелание. Некоторый код выполняется и в этом режиме.
26 Garykom
 
гуру
22.11.21
09:36
(24)+ Да в РС можно прямыми запросами лить, но это не комильфо
27 Simod
 
22.11.21
09:39
(0) Тем, что возникает многократное обращение сервера 1С к СУБД.
Чаще всего подобное возникает в неявном виде - обращение к реквизитам объекта в выборке, которые можно было выбрать в основном запросе.

Есть вполне осознанное применение запроса в цикле - порционная обработка большого объема данных.

(17) Зачем?
28 youalex
 
22.11.21
09:40
(27) delete where как вариант
29 Ненавижу 1С
 
гуру
22.11.21
09:40
(26) например в узлах обмена не будет регистрации
30 NorthWind
 
22.11.21
09:40
(0) оно в каждом конкретном случае необязательно плохо. Но есть практика, которая показывает, что количество итераций цикла со временем может измениться в большую сторону, а количество данных для обработки запросом - увеличиться, что теоретически может привести к проблемам с производительностью. Поэтому рекомендуют лишний обращать внимание на оправданность такого решения и по возможности его избегать.
31 SleepyHead
 
гуру
22.11.21
09:41
(0) Как вариант - объединить тексты запросов, получится один запрос.
32 ADirks
 
22.11.21
09:47
Когда разум подменяют верой, то это хорошо, ибо уменьшает энергетические затраты на процесс мышления.
33 Garykom
 
гуру
22.11.21
09:50
(32) Ты не путай
Аксиома это тоже вера
Использовать готовые формулы, которые придумали и проверили другие люди, без собственной перепроверки тоже вера

Вопрос только во что и кому верить
Умным людям или жрецам
34 acht
 
22.11.21
09:52
(33) > и проверили
Вот тут как раз отличие веры от доверия
35 Garykom
 
гуру
22.11.21
09:53
(34) корень то один и суть одна
36 Zapal
 
22.11.21
09:54
я считаю что если выигрыш в производительности незаметен, то на первый план должна выходить простота и читаемость кода. Ибо именно эта вещь как правило представляет проблему, а не производительность

с этой точки зрения запросы в цикле вполне допустимая вещь, если они не приводят к просадкам производительности и с ними получается более понятный и надёжный код
37 ADirks
 
22.11.21
09:55
(35) слова похожие, а суть радикально разная
38 Garykom
 
гуру
22.11.21
09:55
39 ADirks
 
22.11.21
09:57
(33) и кстати аксиома, это не бездоказательное утверждение. Это утверждение типа "предположим, что ..." и далее на этом утверждении что-то строится. Никто не постулирует абсолютной истины в таких построениях.
40 Garykom
 
гуру
22.11.21
09:58
(39) "предположим что высшая сущность есть" так?
41 Dmitrii
 
гуру
22.11.21
09:58
(24) >> а как же случаи "ОбменДанными.Загрузка = Истина"?

Так в том то и дело, что ОбменДанными.Загрузка не отменяет полностью работу бизнес-логики. В коде может быть отключена только часть бизнес-логики по этому флагу, а может быть даже наоборот - настроено выполнение каких-либо дополнительных действий.
Если дать запросы на запись, то встанет проблема - как решать вопросы выполнения обработчиков событий объектной модели.
Не то чтобы это вообще невыполнимо. Но, как мне кажется, это неоправданно усложнило бы систему с соответствующим добавлением непредсказуемости и неконтролируемости.
Если сейчас, придя к заказчику и впервые увидев его конфигурацию, я точно могу быть уверенным, что при записи того или иного объекта отработает та или иная логика. То в случае наличия запросов на запись можно ожидать, что в любой момент в конфе может появиться какая-нибудь обработка, которая будет писать объекты напрямую в БД запросами в обход абсолютно любой логики.
42 sikuda
 
22.11.21
09:58
(35)(40) Такое надо уже собирать на свой канал - https://youtu.be/orBGBSn6XRE?t=36
43 Simod
 
22.11.21
10:00
(28) Большинство 1С-ников запросы на выборку писать не умеют.
44 ADirks
 
22.11.21
10:00
(40) да, вполне можно такое предположить
45 ГеннадийУО
 
22.11.21
10:01
(22) Ну да, конечно :)
46 dubolom
 
22.11.21
10:02
В общем очевидно что никто не смог толком сформулировать чем плохи зопросы в цикле.
Потому что на самом деле они вполне такие же.
Все перешли на высокие материи.
47 Garykom
 
гуру
22.11.21
10:04
(44) аксиома :)
48 dmpl
 
22.11.21
10:05
(46) См. (8). Использовать запросы в цикле может только тот, кто может обходиться без запросов в цикле.
49 K1RSAN
 
22.11.21
10:05
(0) А почему для каждого склада отдельный запрос надо? Там разные поля нужны? Почему нельзя просто сделать группировку склад-номенклатура, и просто запрос обходить 2 циклами вложенными по складу, а внутри склада по номенклатуре? Как минимум в двойке видел такие запросы, в тройке, конечно, накрутили кучу ВТ...
50 acht
 
22.11.21
10:05
(46)
"Стыдиться надо такие вопросы здесь задавать"
(С) dubolom, Посчитать сколько дней осталось дня рождения начиная с этого дня
51 Garykom
 
гуру
22.11.21
10:06
(46) для простоты проще принять на веру "запросы в цикле плохо" и все
и всегда стараться по максимуму сделать одним запросом

но если запрос становится слишком сложным для понимания на несколько экранов это тоже плохо
52 Dmitrii
 
гуру
22.11.21
10:06
(39) >> Никто не постулирует абсолютной истины в таких построениях.

Аксиома и постулат вообще-то синонимы.
Аксио́ма (др.-греч. ἀξίωμα «утверждение, положение»), или постула́т (от лат. postulatum — букв. требуемое), — исходное положение какой-либо теории, принимаемое в рамках данной теории истинным без требования доказательства и используемое при доказательстве других её положений, которые, в свою очередь, называются теоремами.

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

Возвращаясь к теме. "Не писать запросы в цикле" никак не может быть аксиомой или постулатом. Это всего лишь общее правило или рекомендация, из которых могут быть исключения. Исключения как оправданные производительностью, когда простой запрос в цикле будет работать быстрее большого и сложного. так и чисто практическими соображениями, например, при написании какой-нибудь одноразовой обработки, скорость выполнения которой не имеет никакого значения, а скорость написания и отладки кода может значительно вырасти из-за надуманной необходимости строго следовать подобным правилам.
53 K1RSAN
 
22.11.21
10:07
(46) Использовать запросы в цикле - это как не настраивать архивацию на другие носители. Кто-то может всю жизнь так работать и не иметь проблем, но стоит 1 раз положить базу - повторить не хочется
54 Casey1984
 
22.11.21
10:08
(0) Плох тем, что это потенциально узкое место, и если можно исправить, то нужно ;-)
55 Garykom
 
гуру
22.11.21
10:10
(54) именно

и ни в коем разе не надо логику (алгоритм) кода делать на запросах в цикле
ибо будет сложно оптимизировать убрав узкое место
56 Casey1984
 
22.11.21
10:12
(46) Для очевидного есть ИТС: https://its.1c.ru/db/pubqlang#content:150:hdoc:_top:запрос%20в%20цикле ;-)
57 Сергиус
 
22.11.21
10:13
(0)Это не плохо, а неоптимально. Из аналогии, примерно тоже самое как поднять сразу много грузов в лифте на 10-й этаж и там спокойно все разгрузить или же носить пешком по одному грузу туда-сюда. Если позволяют время и средства, то пожалуйста)
58 ADirks
 
22.11.21
10:14
(47) в качестве аксиомы вполне нормально, можно всякого на этом основании нагородить, не возражаю.
правда, конкретно с этим утверждением есть проблема - его принципиально нельзя проверить.
59 dubolom
 
22.11.21
10:16
Это всё лирика.
У меня прекрасно моментально работает запрос в цикле.
60 Волшебник
 
модератор
22.11.21
10:17
У профессионалов запросы в циклах не тормозят.
61 ГеннадийУО
 
22.11.21
10:17
(59) А тут все надеются, что с ростом бизнеса перестанет :) А если бизнес уже не растёт, то и не перестанет :)
62 Dmitrii
 
гуру
22.11.21
10:17
(59) Не у тебя одного.
63 dmpl
 
22.11.21
10:18
(59) Попробуй взять базу хотя бы на 300-500 Гб.
64 acht
 
22.11.21
10:18
(60) Профессионалы таких "обсуждений" не устраивают
65 Волшебник
 
модератор
22.11.21
10:19
(64) Профессионалы умеют делать замер производительности и смотреть план выполнения запроса.
66 dubolom
 
22.11.21
10:19
(64) У меня есть 1с: Профессионал
67 ГеннадийУО
 
22.11.21
10:19
(63) У меня база 12 ТБ... Не тормозят :(
68 Dmitrii
 
гуру
22.11.21
10:20
Лучше бы провели опрос, где каждый должен привести конкретные примеры таких запросов чья производительность в цикле была бы хотя бы не ниже, чем решение аналогичной задачи одном запросом. С замерами и объяснениями.
А так получается какое-то бесконечное бла-бла-бла ни о чём.
69 ГеннадийУО
 
22.11.21
10:21
(68) А смысл? Это будут специфические случаи, которые человек со стороны без погружения в контекст не поймёт.
70 Волшебник
 
модератор
22.11.21
10:21
(66) Я писал вопросы к тесту 1С Профессионал, а Вы засоряете форум глупыми ветками. Вам не стыдно?
71 Сергиус
 
22.11.21
10:23
(59)В 90% случаев можно сделать более оптимально)
72 acanta
 
22.11.21
10:23
(57) если время разноски одного пакета по этажу превышает время движения лифта и во время погрузки лифта все двери на всех этажах закрываются, то запрос в цикле норм.
Вероятно это вопрос блокировок, но это не точно.
73 Мимохожий Однако
 
22.11.21
10:24
(57) Хорошая аналогия )
74 TheRoofIsOn Fire
 
22.11.21
10:27
Каждый месяц подобная ветка, запросы в циклах это плохо, но во всех типовых они есть в каждом документе. И вообще это беда всех ORM, orm - это там где обращение к таблицам идет через точку.
75 Kassern
 
22.11.21
10:27
очередной клон Калимулина?
76 Garykom
 
гуру
22.11.21
10:28
(73) а если лифтов больше чем грузов и носильщиков?
77 Casey1984
 
22.11.21
10:29
(59) Один?
78 tesei
 
22.11.21
10:31
Было лет 10 назад. Переносил данные из чужой нетленки в УТ 10.3. Клиенты и Организации были в одном справочнике, я переносил все и в Контрагенты, и в Организации, для последующего разбора и чистки.
Какой-то документ в УТ 10.3 не проводился, зависал. Стал разбираться. Нашел получение в запросе учетной политики, обращение было в цикле ко всем существующим организациям. Бессмысленно и беспощадно. Запрос переписал.
79 timurhv
 
22.11.21
10:34
Получать данные запросом в цикле = плохо, а загружать, допустим, большой справочник с +100500 строками кода из подсистемы БСП (версионирование, новая RLS) = нормально. Тьфу.
80 Dmitrii
 
гуру
22.11.21
10:36
(69) >> А смысл? Это будут специфические случаи, которые человек со стороны без погружения в контекст не поймёт.

Какие-то уж совсем специфические случаи наверняка могут быть. Но не так уж они и часты, как может показаться.
Сами объекты (справочники, документы, регистры и пр.) у всех абсолютно одинаковые.
И, по-моему, случаев запросов в цикле, обусловленных спецификой именно самого бизнеса совсем единичные случаи.
81 1Снеговик
 
гуру
22.11.21
10:37
(0) иногда без запроса в цикле не обойтись, особенно когда запрос - часть большой обработки данных в цикле. Иногда без цикла параметры запроса никак не получить.

Ну и все как правило упирается во время разработки. Можно сделать запрос в цикле, а потом, когда все заработает, подумать как оптимизировать.
82 dubolom
 
22.11.21
11:02
(70) Да лан, всем ведь весело вроде.
83 ГеннадийУО
 
22.11.21
11:02
(80) Именно, не так уж часты и обусловлены спецификой, которую объяснять без видимого профита ну совсем никакого интереса нет.
84 ADirks
 
22.11.21
11:12
(68) ну и запросы у вас, батенька...
да если тут каждый начнет делать замеры и к ним объяснения - то кто трындеть то будет?!!
85 Повелитель
 
22.11.21
11:14
(0) Когда база маленькая и товаров с ценами мало, то без разницы.
А вот у меня была такая практика. Разрабатывали мы командой конфигурацию для энергоснабжения города 105 000 абонентов. Ну и минимум раз в месяц нужно было сделать расчет. Так вот даже относительно быстрый запрос по замеру производительности например 0.1 секунда, в цикле на 105 000 = выдавал уже 1050 секунд или 17.5 минут. Естественно приходилось писать везде писать код оптимизированный.

Так и типовые конфигурации, кто-то использует на 100 позиций, а у нас в базе сейчас номенклатуры около 700 000 штук. Поэтому и говорят, что нельзя запрос в цикле в типовых. Да и в принципе если не знаешь, до каких масштабов твоё решение вырастет.
86 Повелитель
 
22.11.21
11:16
(85) * ошибся я там 0.01 секунда, в цикле на 105 000 = выдавал уже 1050 секунд или 17.5 минут.
87 VladZ
 
22.11.21
11:18
(0) На небольших объемах данных - ничем.
88 Обработка
 
22.11.21
11:30
Как-то в начале 2000х писал конфу по ЗП на 1с77 в заводе.
Все с нуля. ЗиКа у нас не было.
Так вот какой-то у меня запрос и расчет длился 40 минут.
Я потом начали искать и оптимизировал что уже выполнялось в 2-3 минуты.
Как-то так.
Также не мало случаев было  и с запросами в цикле.
89 Мимохожий Однако
 
22.11.21
11:34
(76) "А если бы он вёз патроны?!"
90 Dmitrii
 
гуру
22.11.21
11:34
(83) (84) Да понял я уже. Что никаких примеров не будет. А жаль. Было бы любопытно.
Всё с чем приходилось сталкиваться мне, это либо случаи когда разработчик посчитал нецелесообразным тратить время на усложнение кода ради копеечной выгоды в производительности. На небольших объёмах данных, значительный рост которых не ожидается в обозримом будущем, заметной разницы по скорости действительно может не быть. Либо массовые случаи одноразовых обработок, где производительность вообще никакого смысла не имеет, но важна скорость разработки и отладки.
91 Ненавижу 1С
 
гуру
22.11.21
11:35
(70) а какое у тебя место на инфостарте?
92 Жан Пердежон
 
22.11.21
11:37
(0) никак не угомонишься?
93 Dmitrii
 
гуру
22.11.21
11:38
Понятно, что примеров оптимизации, полученной за счет переписывания множества запросов в цикле на один запрос, каждый может привести.
А хотелось бы посмотреть на обратные примеры. Когда запрос в цикле оказался более целесообразным. И по каким конкретно причинам.
94 Гобсек
 
22.11.21
11:41
На маленькой БД с оптимизацией на быстродействие можно не заморачиваться.
95 Гобсек
 
22.11.21
11:42
(94) + запрос в цикле - частая причина тормозов
96 Гобсек
 
22.11.21
11:43
(94) + а к большой БД не факт, что ТС когда-нибудь подпустят
97 Повелитель
 
22.11.21
11:44
(93) Да самый частый пример. Получить типовой функцией ПолучитьЦенуНоменклатуры() цены в цикле, а не думать надо запросом ))
98 Said_We
 
22.11.21
11:45
(0) "но вот по каждому складу надо свой запрос формировать" - подскажите зачем?
99 Kassern
 
22.11.21
11:49
(90) Вот вам пример из типовой УТ11. Здесь в цикле пытаются выполнить запрос, если не получилось то еще несколько раз пытаются)
    Пока Истина Цикл
        Попытка
            Результат = Запрос.Выполнить(); // Чтение вне транзакции, возможно появление ошибки.
                                            // Could not continue scan with NOLOCK due to data movement
                                            // в этом случае нужно повторить попытку чтения.
            Прервать;
        Исключение
            КоличествоПопыток = КоличествоПопыток + 1;
            Если КоличествоПопыток = 5 Тогда
                ВызватьИсключение;
            КонецЕсли;
        КонецПопытки;
    КонецЦикла;
100 dubolom
 
22.11.21
11:51
(93) Когда пишешь какую-нибудь разовую обработку, чаще всего важнее написать её побыстрее, а производительность - дело десятое. И часто бывает, что в цикле запрос пишется гораздо проще.
101 Said_We
 
22.11.21
11:52
(99) Это они не смогли достучаться до разработчиков платформы и хоть как-то пытаются глюк платформы обойти.
102 Said_We
 
22.11.21
11:53
(100) "в цикле запрос пишется гораздо проще" - в общем случае фиолетово. Можно писать без циклов в запросе.
103 Deal with it
 
22.11.21
11:54
(0) Ozon в своем расширении не стесняется по каждому складу в цикле номенклатуру отбирать, дабы остатки выгрузить по своему API. А им виднее))
104 Deal with it
 
22.11.21
11:56
Да, кстати, если кто-то вдруг решит внедрить расширение от Ozon, сразу блокируйте в нём запись в регистр Ozon_ПроблемыОбмена, потом спасибо скажете)
105 dubolom
 
22.11.21
11:57
(102) Пример - нужно получить СрезПоследних на каждую дату в интервале. Оно запросом в цикле в несколько раз проще пишется.
106 pechkin
 
22.11.21
11:58
(104) слишком много записей?
107 Dmitrii
 
гуру
22.11.21
12:00
(100) >>  Когда пишешь какую-нибудь разовую обработку, чаще всего важнее написать её побыстрее, а производительность - дело десятое.

Это очевидный случай. И едва ли не самый частый. Я о нём в (90) написал. Он никакого интереса не представляет.
На одноразовых разработках все *авнокодят от души, наплевав на все правила и стандарты.
108 Deal with it
 
22.11.21
12:01
(106) ну зависит от количества товаров в выгрузке,  у нас 4к товаров за 2 недели сделали 29лямов записей в этот регистр, база на постгресс выросла на 25Гб.
Пришлось дропать регистр полностью и сжимать базу обратно) Тут был мой косяк, я сразу не настроил очистку этого регистра, а следовало бы.
109 Злопчинский
 
22.11.21
12:01
(32) шедевр...
110 dmpl
 
22.11.21
12:04
(105) И где дальше эти данные использовались?
111 Злопчинский
 
22.11.21
12:05
(48) "самурай без меча - это как самурай с мечом, только без меча"
112 Casey1984
 
22.11.21
12:05
(105) Проще 1С не заниматься ;-)
113 dubolom
 
22.11.21
12:06
(107) Если параметры запроса не вычисляются в каждой итерации цикла, например, исходя из предыдущего запроса, тогда вряд ли запрос в цикле может быть выгоден по производительности.
Допустим, каждую итерацию надо выполнять запрос с несколькими параметрами. Вместо этого можно запихнуть в этом цикле все наборы параметров в таблицу значений, а потом передавать эту таблицу в запрос и строить его по всем строкам, а не каждой по отдельности. Это явно будет производительнее.
114 Dmitrii
 
гуру
22.11.21
12:06
(99) >> Здесь в цикле пытаются выполнить запрос, если не получилось то еще несколько раз пытаются.

Неудачный пример, по-моему.
Во-первых, здесь цикл сделан не ради многократного повторения выполнения запроса. А ради Попытки.
Во-вторых, в идеале запрос будет выполнен один раз и у цикла будет одна единственная итерация.
115 dubolom
 
22.11.21
12:07
(113) Хотя может быть ещё выгодно по-разному строить запрос исходя из значений параметров. Тогда цикл всё-таки может пригодиться.
116 Kassern
 
22.11.21
12:07
(101) Хорошо, вот вам пример с контактами взаимодействий из той же УТ11

        РегистрыСведений.СостоянияКонтактовВзаимодействий.УдалитьЗаписьИзРегистра(Неопределено);
        
        Пока Истина Цикл
        
        Запрос = Новый Запрос;
        Запрос.Текст = "
        |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 100
        |    КонтактыВзаимодействий.Контакт
        |ПОМЕСТИТЬ КонтактыДляРасчета
        |ИЗ
        |    РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияКонтактовВзаимодействий КАК СостоянияКонтактовВзаимодействий
        |        ПО КонтактыВзаимодействий.Контакт = СостоянияКонтактовВзаимодействий.Контакт
        |ГДЕ
        |    СостоянияКонтактовВзаимодействий.Контакт ЕСТЬ NULL
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    КонтактыВзаимодействий.Контакт,
        |    МАКСИМУМ(Взаимодействия.Дата) КАК ДатаПоследнегоВзаимодействия,
        |    СУММА(ВЫБОР
        |            КОГДА ПредметыПапкиВзаимодействий.Рассмотрено
        |                ТОГДА 0
        |            ИНАЧЕ 1
        |        КОНЕЦ) КАК КоличествоНеРассмотрено
        |ИЗ
        |    КонтактыДляРасчета КАК КонтактыДляРасчета
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий
        |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЖурналДокументов.Взаимодействия КАК Взаимодействия
        |            ПО КонтактыВзаимодействий.Взаимодействие = Взаимодействия.Ссылка
        |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий
        |            ПО КонтактыВзаимодействий.Взаимодействие = ПредметыПапкиВзаимодействий.Взаимодействие
        |        ПО КонтактыДляРасчета.Контакт = КонтактыВзаимодействий.Контакт
        |
        |СГРУППИРОВАТЬ ПО
        |    КонтактыВзаимодействий.Контакт";
        
        Результат = Запрос.Выполнить();
        Если Результат.Пустой() Тогда
            Возврат;
        КонецЕсли;
        
        Выборка = Результат.Выбрать();
        Пока Выборка.Следующий() Цикл
            
            РегистрыСведений.СостоянияКонтактовВзаимодействий.ВыполнитьЗаписьВРегистр(Выборка.Контакт,
                                                                                      Выборка.КоличествоНеРассмотрено,
                                                                                      Выборка.ДатаПоследнегоВзаимодействия);
            КонецЦикла;
            
        КонецЦикла;
117 runoff_runoff
 
22.11.21
12:07
например, разузлование всех изделий из плана производства: либо запрос по каждому изделию в цикле, либо СКД с вложенной схемой..
118 dubolom
 
22.11.21
12:08
(116) Здесь производительность приносят в жертву возможности переопределять функции (зайчатки ООП), кмк.
119 nodrama
 
22.11.21
12:09
(0) почему плохо то. если он будет работать быстро и  всех устраивать то ок. просто если в безе 100к++ позиций и фигово туча складов, то запрос в цикле думаю будет работать не приемлимое время
120 dmpl
 
22.11.21
12:10
(116) Тут порции обработки таким образом реализованы.
121 Kassern
 
22.11.21
12:10
(120) ага, как пример использования запроса в цикле
122 Said_We
 
22.11.21
12:13
(105) "Пример - нужно получить СрезПоследних на каждую дату в интервале. Оно запросом в цикле в несколько раз проще пишется." - стандартный запрос. НИЧЕГО в цикле тут делать не нужно.
123 dmpl
 
22.11.21
12:13
(121) Этот вариант выше писали.

Там, кстати, ошибка: выход из цикла если результат запроса пустой, а пустым он может быть и если все 100 контактов из временной таблицы при внутреннем соединении не соединились. В итоге цикл прерывается, а данные еще не обработаны.
124 Casey1984
 
22.11.21
12:20
(117) Вы просто не умеете его готовить: https://infostart.ru/1c/articles/158512/
125 Ботаник Гарден Меран
 
22.11.21
12:25
Напишите, пожалуйста, запрос по получению остатков по всем договорам по просроченным задолженностям (у каждого договора свое количество дней просроченной задолженности).
126 Casey1984
 
22.11.21
12:25
(116) Тут видать они ждут что новые записи появятся, пока они обрабатывают? Иначе нафига вот это вот все?
127 dubolom
 
22.11.21
12:25
(122) Ну, посложнее что-нибудь. Срез последних на каждую дату из каждого интервала, полученного из документа определённого вида, и сумма значений по каждому интервалу.
128 dubolom
 
22.11.21
12:27
(125) Таблица договоров с задолженностями. Соединение с таблицей взаиморасчётов по договору условию РазностьДат>МаксимальноеЧислоДнейЗадолженности.
В чём проблема?
129 Garykom
 
гуру
22.11.21
12:29
(125) Вместо запроса в цикле можно использовать запросы с передачей ТЗ
130 Dmitrii
 
гуру
22.11.21
12:30
(125) >>  запрос по получению остатков по всем договорам по просроченным задолженностям (у каждого договора свое количество дней просроченной задолженности).

А что такого особенного в этом запросе? Почему он в цикле должен выполняться быстрее, чем одним запросом?
131 Said_We
 
22.11.21
12:30
(127) Тоже не нужно запрос в цикле выполнять.
Единственное где в 1С придется выполнять запрос в цикле, это там где есть огромное желание выполнить рекурсивный запрос. Так как 1С в отличии от чистого SQL этого не умеет.
132 dubolom
 
22.11.21
12:32
(131) Так и я говорю, что практически всё можно реализовать без цикла (обычно спасает передача ТЗ).
Но речь-то шла про одноразовые обработки, где чаще всего надо написать и отладить тупо быстрее.
133 Said_We
 
22.11.21
12:33
WITH num(n) AS(
SELECT 0 as n
UNION ALL
SELECT t.n+1 FROM num as t

WHERE t.n <= 9)


select t.n from num as t

Вот это на 1С не напишешь....
134 mTema32
 
22.11.21
12:36
(0) При сложных загрузках/выгрузках данных запросы в цикле - это единственный возможный вариант обработки данных.
В рамках одной ИБ вероятно можно обойтись без запросов в цикле. При обменах в нескольких информационных системах бывает других вариантов просто нет.
135 Ботаник Гарден Меран
 
22.11.21
12:37
(130)
А почему он одним запросом должен выполняться быстрее, чем в цикле?
136 Said_We
 
22.11.21
12:37
(132) Не всегда. Как-то надо было какой-то новый реквизит запомнить необходимо было значением по умолчанию. Ну так разработчики придумали - завели новый реквизит в давно существующий объект и по умолчанию он должен быть не нулевым. Средствами 1С в существующей базе данных такой реквизит заполнялся более 3-х часов. Средствами SQL на прямую за 3 секунды. Иногда проще сложнее что-то выполнить, но по временным рамкам на много быстрее.
137 Dmitrii
 
гуру
22.11.21
12:39
(132) >> речь-то шла про одноразовые обработки, где чаще всего надо написать и отладить тупо быстрее.

Когда это мы вдруг решили ограничить тему одноразовыми обработками?
Я что-то пропустил?

Просто если речь идёт именно об одноразовых обработках, то в подавляющем большинстве случаев действительно написать и отладить быстрее и проще запросы в цикле.
Если производительность принципиального значения не имеет, то какой смысл париться над сложными текстами запросов? Тем более что почти всегда любое усложнение приводит к повышению рисков возникновения ошибок и усложнению возможностей дальнейшей доработки или переработке кода.
138 dubolom
 
22.11.21
12:40
(136) Это семёрка была и 1с++?
139 dmpl
 
22.11.21
12:40
(126) Если записей много - там могут получаться миллиарды записей до наложения фильтра. А не все СУБД умеют накладывать фильтры запроса на подзапрос.
140 dubolom
 
22.11.21
12:41
(137)
>Когда это мы вдруг решили ограничить тему одноразовыми обработками?
Не всю тему, а конкретно это обсуждение началось со (100).
141 Said_We
 
22.11.21
12:41
(138) НЕТ.
В 1С++ можно писать в БД. Это была как раз 1С 8.0 или 8.1.
142 dmpl
 
22.11.21
12:42
(131) Типовуха: получение всех вышестоящих подразделений.
143 Said_We
 
22.11.21
12:43
(142) В общем случае, это как раз рекурсивный запрос.
144 youalex
 
22.11.21
12:43
(125) Аналог остатки/обороты на каждую дату. Кстати, тоже видел решения запросом в цикле (собственно один день = один запрос)
145 Dmitrii
 
гуру
22.11.21
12:45
(142) Иерархия в 1С - это отдельная больная тема. Тут уж ничего не поделаешь. Даже сама 1С где-то рекомендовала получать всех родителей циклом, когда не известна заранее глубина вложенности.
146 dubolom
 
22.11.21
12:45
(142) Если число уровней ограничено, то изи.
А оно обычно ограничено, крайне редко бывает больше 10 уровней вложенности, тем более у подразделений.
147 dmpl
 
22.11.21
12:45
(143) Так я и привел конкретный пример, когда такой тип запросов необходим. Причем это не сферический конь в вакууме, а реально используемый пример.
148 dmpl
 
22.11.21
12:46
(145) Либо циклом, либо отдельный регистр для "обратной иерархии" - в зависимости от приоритетов.
149 Casey1984
 
22.11.21
12:47
(132) в (0) этого не было, что-то вы ТЗ на ходу меняете ;-) Гибкие технологии?
150 dubolom
 
22.11.21
12:48
(149) Это обсуждение со (100) началось.
151 dmpl
 
22.11.21
12:48
(146) Так-то может еще и история подчиненности подразделений быть. Плюс все это дело может быть в RLS засунуто...
152 dubolom
 
22.11.21
12:50
(148) Можно ещё хранить глубину вложенности в константе. Это имеет смысл, если надо часто получать всех родителей у большого числа элементов.
153 Casey1984
 
22.11.21
12:50
(150) Еще чуть-чуть и перейдете на светлую сторону!
154 МихаилМ
 
22.11.21
12:50
(100)
сами себе противоречите:
Вы писали
"   dubolom
18.11.21 - 14:25
Как вы для себя решаете этот вопрос?
Лично я всегда - исключительно за качество. Лучше потратить немного больше времени сейчас, чем потом тратить его на вылавливание косяков и доработки недоработанного.
Зато у меня всегда идеальный код."
155 Said_We
 
22.11.21
12:51
(151) На стандартном SQL запрос в цикле для рекурсивного запроса с вложенностью менее 100 не нужен.
Это уже ограничения 1С.
156 Casey1984
 
22.11.21
12:51
(154) Это продолжение пятницы
157 dubolom
 
22.11.21
12:52
(153) Я вообще на ней начинал. Решил тут вас развлечь немного, но походу всем надоело.
158 fisher
 
22.11.21
13:35
(0) > Чем плох запрос в цикле?
Да всем хорош. Только если есть возможность выкопать несколько ямок за один вызов экскаватора, то только дебилы будут вызывать экскаватор на каждую ямку.
159 Chai Nic
 
22.11.21
13:37
(158) Но если вам надо сделать несколько ямок - то глупо рыть траншею экскваватором, а потом лишнее заваливать.
160 fisher
 
22.11.21
13:39
(159) Затрудняюсь определить, на какой случай это аллегория. Фильтрации в постобработке, что ли?
161 Kassern
 
22.11.21
13:39
(159) или вам не известно сколько ямок рыть заранее, или в момент рытья может не получиться сделать ямку и надо будет попробовать снова)
162 dubolom
 
22.11.21
13:42
(160) Допустим, запросом надо хитрозамороченно получать строку с адресом файла, потом пробегаться по тому файлу и исходя из этого делать следующие запросы.
163 Casey1984
 
22.11.21
13:44
(162) Делайте. Но файл можно и в ТЗ прочитать ;-)
164 fisher
 
22.11.21
13:45
(162) Можешь за один запрос выполнить несколько работ - выполняй. Не можешь - не выполняй. https://youtu.be/hgJpWBSQvcQ
165 Kassern
 
22.11.21
13:45
(162) продакшене так бы никто реализовывать не стал. Получили адрес, к этой таблице прикрутили таблицу с нужными данными и одноименным ключом для связи. И все.
166 fisher
 
22.11.21
13:57
Обычно всегда можно найти возможности для оптимизации выполнения.
Стоит ли их искать в конкретных случаях - каждый решает сам. Тут уже опыт, сын ошибок трудных. И элементарный просчет ситуации хотя бы на пару шагов вперед.
Многие новички просто не просчитывают перспективу. То ли не хотят, то ли не умеют. Заработало? Устраивает? Готово, мастер!
С запросом в цикле основная ведь беда не в текущей эффективности. А в очень плохой масштабируемости. Может, она и не нужна. Но об этом надо хотя бы задумываться.
Обычно, если не семи пядей во лбу, то нужно хотя бы несколько лет поработать в активной разработке на своей же собственной кодовой базе в развивающейся компании. Желательно на немаленьких или хотя бы растущих масштабах. Тогда будет хотя бы возможность переломать ноги о собой же разложенные грабли. Если и это не научит (а многих таки не учит) - значит не в коня корм. Что уж тут попишешь.
Но если хоть капелька ума есть, то научишься просчитывать ситуацию и писать так, чтобы не затрачивая много времени избавлять себя от кучи проблем в будущем.
167 dubolom
 
22.11.21
14:00
(166) 1с-ник может в любой момент уволиться и новую работу найти (по крайней мере, в миллионниках). Это здорово расхолаживает.
168 polosov
 
22.11.21
15:00
(0) У СУБД есть постоянные временные затраты на каждую выборку и переменные.
Запрос в цикле увеличивает сумму постоянных затрат. Запрос без цикла может увеличивать сумму переменных.
Надо балансировать для оптимального взаимодействия.
169 polosov
 
22.11.21
15:01
(168) *для оптимального быстродействия.
170 Dmitrii
 
гуру
22.11.21
15:05
(168) Ну намудрил.... Слишком туманно. Нужен конкретный пример, когда следует отдать предпочтение запросу в цикле, а когда целесообразнее заморочиться с одним сложным запросом.
171 pechkin
 
22.11.21
15:07
(170) например поиск верхнего родителя для элемента
172 ProgAL
 
22.11.21
15:10
У вас есть АПИ стороннего севиса, которое за 1 раз принимает одну номенклатуру с ценой. Пусть отклик оно дает через несколько секунд. Вы при любом раскладе будете дергать его в цикле по одной номенклатуре за раз. Вы можете одним запросом сформировать выборку для нескольких тысяч позиций номенклатуры и все равно дергать по одной штуке АПИ. При этом в памяти на клиенте/сервере (ОФ/УФ или как написали код) у вас будет храниться вся выборка и занимать память. А так ничего не случится если раз в несколько секунд будет выполняться небольшой запрос в цикле.
173 Garykom
 
гуру
22.11.21
15:13
(172) нет
лично я выясню насколько апи многопоточен
затем один раз делаю выборку одним запросом, разбиваю на нужное число частей и запускаю по их числу фоновые
174 ProgAL
 
22.11.21
15:13
(173) Все верно, но я про однопоточное АПИ.
175 Garykom
 
гуру
22.11.21
15:13
(173)+ в фоновых уже не будет запросов в цикле, просто циклы в которых дергает апи
176 Garykom
 
гуру
22.11.21
15:14
(174) а где запрос то в цикле?
дергать апи в цикле и дергать запрос в цикле это две большой разница
177 Garykom
 
гуру
22.11.21
15:15
(176)+ и да
Если у апи есть методы которые принимаю разом много номенклатур а не одну
Дергать в цикле однономенклатурный метод это изврат согласны?
178 ProgAL
 
22.11.21
16:08
(177) Вне сомнения.
179 mTema32
 
22.11.21
16:21
(177) Разве что если ситуация не такова, что следующий запрос в апи зависит от ответа на предыдущий.
180 Конструктор1С
 
22.11.21
16:25
(21) это как посмотреть. Запросы тоже уродства в код вносят. Особенно любят многие понахапать данных пакетным запросом, а потом эти данные таскать по стеку процедур на десять уровней вниз. Сиди потом и чеши репу, почему эти данные прилетели "откуда-то оттуда", а не были получены перед использованием
181 Конструктор1С
 
22.11.21
16:37
Как-то довелось наблюдать картину, как один любитель бездумно выполнять рекомендации угробил производительность, избавившись от цикла. Был запрос в цикле:

ВЫБРАТЬ ... ИЗ РегистрСведений.БлаБла Где Измерение1 = &Значение1 И Измерение2 = &Значение2 И Измерение3 В (&Значение3)

внутри цикла менялся параметр Значение1. Ну наш оптимизатор, не долго думая, выносит запрос за цикл и переписывает его так:

ВЫБРАТЬ ... ИЗ РегистрСведений.БлаБла Где Измерение1 В (&Значение1) И Измерение2 = &Значение2 И Измерение3 В (&Значение3)

в результате производительность запроса в труху, одиночный запрос выполняется намного дольше, чем суммарно выполнялись запросы в цикле. Про то, что код стал уродливее после "оптимизации", я уж молчу
182 rphosts
 
22.11.21
16:42
(0) чем плох - регулярное дёргание сервера(напряг сеть, сервер открыл соединение, построил план выполнение запроса, выполнил запрос... пошла отдача данных... и ещё раз и ещё раз и ещё раз...) создаёт как правило большую нагрузку чем хапнуть одним кусоком... но по факту, если запрос в цикле не создаёт реальных проблем (нагрузка, объём лишних данных и т.п.) и работает при этом очень быстро - да не проблема ваш запрос в цикле... но не говорите это никогда когда будете сдавать любой экзамен фирме 1С
183 ILM
 
гуру
22.11.21
16:56
(0) Сейчас делаю планирование по календарным дням со сдвигом, с учетом особенностей нашей технологии. Пориходится писать код и так и этак, разузлование и первоначальный расчет по дням в одном запросе, а постобработка и распределение партий уже в цикле с подзапросами. Не вижу ничего плохого использовать любой способ который даёт результат. Когда считал цикличность техпроцессов, а они зависят от мощности, партий, сменности, то использовал запрос, а разбивку по месяцам и длительность в цикле.
184 Конструктор1С
 
22.11.21
17:05
(182) >>но не говорите это никогда когда будете сдавать любой экзамен фирме 1С

на экзамене фирмы 1с
https://disk.yandex.ru/i/CgB734tATmbBtQ
185 Dmitrii
 
гуру
22.11.21
19:25
(182) >> но не говорите это никогда когда будете сдавать любой экзамен фирме 1С.

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

А эта ветка на протяжении почти двух сотен постов так и не родила ни одного внятного примера, где запрос в цикле был бы более целесообразен, чем один запрос, собирающий все данные сразу.
Всё свелось к примерам одноразовых обработок, где производительность никого не интересует вообще и когда на*авнокодить запросов в цикле тупо быстрее и проще, чем мучаться в припадках перфекционизма. А так же случаев, когда выигрыш в производительности не будет иметь никакого принципиального значения. Примеры циклов, которые вообще к запросу не имеют отношения, типа (99) я опущу.

1С же на экзаменах заранее озвучивает условия. И условия эти гласят, что вы как исполнитель не знаете о том насколько велика будет база данных, для которой вы решаете задачу, и сколько в ней будет работать пользователей и насколько она будет высоконагруженной. А значит решать задачу следует, исходя из необходимости написания самого оптимального, с точки зрения производительности, решения.
186 acht
 
22.11.21
19:57
(185) > самого оптимального, с точки зрения производительности, решения.
Вот только оптимизация эта, она субъективна. Я, например, точно также не знаю ресурсов компьютера, для которго я решаю задачу и поэтому во исполнение https://its.1c.ru/db/v8std#content:725:hdoc я буду запрашивать данные порциями фиксированного размера. В цикле, естественно.
187 vis_tmp
 
22.11.21
20:11
(108) Он совсем не нужен?
188 Dmitrii
 
гуру
22.11.21
20:38
(186) Здесь ведь речь о выборках, которые потенциально могут иметь очень большой размер.
Случаи такие встречаются редко, но вполне возможны.
1С эти свои рекомендации из статьи по ссылке регулярно применяют в типовых конфигурациях. В обработчиках обновления, где производится массовое перезаполнение каких-либо объектов или регистров, - постоянно.
Но опять таки в экзаменационных билетах что-то я не припомню задачи типа "перезаполните по определенному алгоритму все счета-фактуры в базе или какой-нибудь регистр".
Думаю, автор ветки всё таки имел ввиду случаи, когда речь идёт о многократном повторении в цикле одного и того же запроса, а не об организации цикла ради порционной обработки огромных массивов данных.
189 ДедМорроз
 
23.11.21
00:49
Если запрос выполняется по индексу,то его выполнение в цикле оправдано,так как даже выполнение одного запроса с условием по массиву может идти дольше,чем выполнение в цикле запроса с условием на равннство,которое требует только просмотра индекса.

Но,во взрослом sql есть описание запроса prepare и исполнения execute.
Правда,если создать запрос и определить его текст за пределами цикла,то утверждается,что будет выбран именно этот вариант,исключающий повторное постррение плана запроса.

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

Ну и финально - выборка результата запроса в таблицу и поиск в ней в цикле - это аналог запроса по индексу в случае индексированной таблицы,ну и полный перебор в случае,когда ее забыли индексировать - и в этом случае мы наблюдаем ситуацию,когда запрос в цикле обгоняет единый запрос.
190 Chai Nic
 
23.11.21
08:15
(181) Да, иногда дергать простые запросы получается эффективнее. Кстати, нечто подобное с бухгалтерским запросом в 7.7 было - получать обороты несколько раз по разным счетам работало быстрее, чем один раз по списку счетов.
191 DimVad
 
23.11.21
08:20
Когда нашу фирму перевели с самописок на 1С УПП (это было в 2007) перед франчами поставили задачу - написать обработку автоматического выставления документов. Типа раз в месяц из сторонней организации приходит эксел-файлик с списком какая организация сколько запланировала потребить газа в следующем месяце. Нужно им выставить счета на оплату, РТУ и СФ.

Нужно учесть факт за прошлый месяц и кучу-кучу отдельных условий-соглашений который возможны как с группой потребителей так и с конкретной фирмой :-)
Франчи напыжились и выдали обработку. Только вот суммы почему-то никак не сходились с тем, что бухгалтерия отдельно рассчитывала. Т.е. в какой-то месяц сходилась - а в какой-то месяц нет :-)

Сию задачу перекинули на меня с требованием "чтоб всё стало сиська в сиську !!!". И это были мои первые знакомства с 1С...

Посмотрел я обработку. А там сперва офигенный запросище (это было 8.0, временных таблиц ещё не было). Т.е. практически всю логику в стиле "если так то делай так" они пытались реализовать в это запросе. А потом цикл и большая-большая куча кода прямо в этом цикле :-)

Я же как программист "в языках" привык разбивать "по функциям". Каждой функции - своё маленькое дело. Функции максимально изолированные, ну и т.д.
Собственно я взял и целиком всё переписал в этой парадигме. Если функции были нужны данные - она их получала через запрос.

Мало того что всё заработало правильно - оно ещё и сильно быстрее. Типа функция получает параметр - контрагента. Определяет был выставлен СФ или нет коротким запросом по документам СФ с отбором по Контрагент и интервалу дат.

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

Потом Я посмотрел код типовых и прифигел ещё больше. Тип - "вот мы получаем данные в ТЗ, а эти данные в другое ТЗ, упаковываем в структуру и раздаём по функциям. А в каждой функции мы вытаскиваем ТЗ обратно и ищем отборами по нужным нам параметрам уже в этих ТЗ". Мне была не понятна природа этого извращения...

Но потом я поработал с 1С побольше, привык и перестал удивляться. Видимо, произошла "смерть программиста и рождение 1С-ника" :-)
192 acanta
 
23.11.21
08:42
Простите за глупый вопрос, а в файловой базе индексы есть?
193 acanta
 
23.11.21
08:43
+или в связи с увеличением мощности компьютеров это уже неактуально?
194 ADirks
 
23.11.21
08:45
(193) никакая мощь компьютеров не позволит обрабатывать всю базу по 100 раз в секунду
195 DimVad
 
23.11.21
08:47
(192) Ну даже в базах использующие dbf они очень даже есть. Не совсем понятно как их может не быть в "файловой базе". Другое дело насколько эффективен план исполнения сложных запросов в файловой базе... Кстати, опять простые запросы в цикле должны выиграть :-)
196 acanta
 
23.11.21
08:53
Предположительно, фокс и клиппер не имели способов сформировать выборку при отсутствии индексов. 1с совершила революцию, скрыв индексацию от программистов, без нее тоже все работает и с тем же кодом, просто немного медленнее. При этом в мануалах 1с настоятельно не рекомендуется ставить галочки отбор.
197 rphosts
 
23.11.21
08:54
(185) вам нужны примеры? Чужой код... запрос в цикле... но работает правильно и не создает проблем - да и пусть!
198 xkanix
 
23.11.21
08:55
(100)
>> // Could not continue scan with NOLOCK due to data movement


Занятно.

Этот код устарел примерно с перехода на режиме совместимости 8.3.2 (и выше).

И это код от фреша на самом деле, то что он живет в УТ (как и в остальных типовых которые есть на фреше) - просто такой способ распространения.
199 DimVad
 
23.11.21
09:01
(196) Да, тут фишка в том что 1С-ник обычно работает с типовыми и не может расставлять индексы под задачи своей фирмы.
Возможно отсюда идёт эта "выгрузим большим запросом в ТЗ и будем с ней работать".
200 acanta
 
23.11.21
09:04
Кстати как правильно, индексация или индексирование?
201 rphosts
 
23.11.21
09:04
(196) В клиппере была команда Scan... запросы в фоксе про работали и на безиндексных dbf, насколько помню
202 rphosts
 
23.11.21
09:06
(200) вроде аналоги-же
203 acanta
 
23.11.21
09:07
Точно, говорили, если что-то...., то база упадет в скан.
204 DimVad
 
23.11.21
09:07
(201) Или просто типа SET FILTER KOD=100...

Но seek по индексу был чудно быстрее... :-)
205 rphosts
 
23.11.21
09:10
(204) если попал в индекс - моментально
206 acanta
 
23.11.21
09:11
Почему в 1с индекс назывался CDX, а не IDX?
207 Chai Nic
 
23.11.21
09:12
(196) В фокспро появились sql-запросы, которым на индексы было в принципе пофиг, если их нет - работали без них. С соответствующим быстродействием.
208 Chai Nic
 
23.11.21
09:13
(206) Потому что idx это индекс в отдельном файле, а cdx это файл, в котором несколько индексов, относящихся к основной таблице. В фокспро было так же.
209 DimVad
 
23.11.21
09:18
(205) Да, скорость была просто восхитительной - никто и не думал "экономить на запросах в цикле" :-)

Ещё прикол. Оказалось что Access как и VB позволял работать с данными в формате mdb в таком же стиле, без запросов - через seek (это было ещё до ADO). И скорость была тоже изумительна.

Помню, я благодаря этому просто "влёт" перевел приложение с клиппера "в виндовс" - логику менять вообще не пришлось...
210 Ботаник Гарден Меран
 
23.11.21
09:20
В фокспро и клиппер seek - команда поиска по индексу, locate - команда поиска без индекса
211 acanta
 
23.11.21
09:28
И как сейчас в 1с 8 первая помощь - чистка кэша, так и в 7ке переиндексации или пересоздание индексных файлов.
212 acanta
 
23.11.21
09:40
А теперь проблема для архитекторов, как сделать в базе что-то, что заменить индексы в платформе (справочник или регистр сведений).
213 Dmitrii
 
гуру
23.11.21
09:42
(197)  >> Чужой код... запрос в цикле... но работает правильно и не создает проблем - да и пусть!

Да и не спорю.
Но это пример никак не относящийся к технической стороне вопроса. Из той же самой оперы, когда мы говорили об одноразовых обработках, где скорость написания кода и получение готового результата гораздо важнее производительности и качества написанного кода.
214 Chai Nic
 
23.11.21
09:49
(212) В 1с следовало бы ввести возможность в конфигураторе создавать произвольные индексы. Очень не хватает этой функции. Индексирование по умолчанию не гибко.
215 Dmitrii
 
гуру
23.11.21
09:50
(189) >> если создать запрос и определить его текст за пределами цикла, то утверждается, что будет выбран именно этот вариант, исключающий повторное построение плана запроса.

Сомнительное утверждение. Нигде не встречал подобной трактовки.
Доподлинно известно, что если определить текст запроса за пределами цикла, то это избавит платформу от необходимости анализировать синтаксис текста запроса в каждой итерации цикла.
У 1С даже соответствующие рекомендации есть. Типа если избежать запроса в цикле невозможно или слишком сложно, то определение текста следует выполнить до цикла.
216 DimVad
 
23.11.21
10:39
(212) Ну, например так.
Сперва делаю запрос где получаются нужные данные которые запихиваются во временные таблицы с нужными индексами.
А потом спокойно пишу "много маленьких функций" где каждая функция получает данные из созданных вт по индексам, адаптированным к данной задаче.

Менеджер можно сделать глобальным уровня модуля (чтобы не передавать как параметр в каждую функцию) и явно грохнуть его когда станет не нужен типа МенеджерМоихТаблиц = Неопределено
217 ДедМорроз
 
23.11.21
12:01
В типовых везде ПолучитьРеквизитыОбъекта используется - это они так запросы в цикле от любопытных глаз прячут.
218 Dmitrii
 
гуру
23.11.21
12:10
(217) Получение реквизитов объектов при их обработке в цикле - неизбежное зло. Всех данных заранее не запросишь и не получишь. Особенно, когда заранее неизвестно - что именно может понадобиться.
И т.к. в общем случае получение данных запросом менее накладно, чем при использовании объектной модели (через точку от ссылки), то приходится пользоваться этой функцией из БСП.
Хотя тоже не всегда это оправдано, а иногда ничего страшного нет в том, чтобы получить весь объект целиком. и это будет менее накладно, чем 33 раза запросом получать его реквизиты и данные табличных частей.
219 DimVad
 
23.11.21
12:27
(218) Мне кажется лучше всего так. Вот есть процедура которая выполняет некоторое действие получая параметр Ссылка типа РТУ.
В голове функции делаем запросик где получаем нужные данные. А потом работаем только с ними.

Понадобилось что-то ещё - добавили в запросик. Ляпота.

А с помощью ПолучитьРеквизитыОбъекта  я получу структуру с нужными мне реквизитами, такими как Контрагент. Но вот ИНН этого контрагента - уже нет. Или "через точку" или снова ПолучитьРеквизитыОбъекта.
220 acanta
 
23.11.21
12:34
Получается, что индекс имеет смысл, когда указатель (а что это вообще? Головка граммофона?) уже установлен на некоей строке некой таблицы и спокойно себе получает через точку реквизит за реквизитом. Если же у нас многопоточность и несколько таблиц, индексированные и не очень, то начинается ООП с кэшированием и индексация самого кэша?
221 DimVad
 
23.11.21
12:42
(220) Да нет, индексирование всё равно "очень".

Пример - работает база УПП, в ней одновременно куча пользователей работает с одними и теми же таблицами.
И индексы очень даже "очень".

p.s. Я думаю тут копать до уровня железа - это вне обычной работы прикладного программиста. Как там на серваке головки дисков позиционируются...
222 ДедМорроз
 
23.11.21
13:07
(215) анализ синтаксиса выаолняется при первом выполнении запроса.
223 ДедМорроз
 
23.11.21
13:10
Не забываем,что в sql есть даже отдельная команда обновления индексов,т.к.новые данные попадают в индекс не сразу.
Но,в любом случае,поиск по индексу значительно быстрее,так как индекс-это дерево.

Ну и кроме всего прочего,опганизация хранения у скуля страничная и на одну страницу записей индекса влазит больше,чем записей данных в таблице и даже полное сканирование индекса требует меньше ресурсов.
224 Chai Nic
 
23.11.21
13:26
(223) "Не забываем,что в sql есть даже отдельная команда обновления индексов,т.к.новые данные попадают в индекс не сразу."
Это не так. Данные попадают в индекс сразу же по мере их добавления/обновления. Другое дело, что они могут лечь в индекс в неудачном порядке, что ухудшит поиск в худшем случае до линейного (теоретически).
225 Dmitrii
 
гуру
23.11.21
13:57
(222) >> анализ синтаксиса выполняется при первом выполнении запроса.

Если текст запроса определен перед циклом, то да - один раз.
Если в цикле определяется текст, то анализ синтаксиса и перевод его на язык СУБД буде производится каждый раз. Хотя не исключаю, что может быть с момента написания статьи (ссылка ниже) что-то и поменялось.

https://its.1c.ru/db/pubqlang#content:150:hdoc:_top:запрос%20в%20цикле
Но иногда требуемое условие запроса, позволяющее отказаться от выполнения в цикле, сформулировать бывает затруднительно или очень сложно. В этом случае как минимум нужно вынести создание запроса за пределы цикла, а в цикле изменять только параметры запроса. Это позволит избежать многократной синтаксической проверки текста запроса (листинг 4.8).
226 acanta
 
23.11.21
14:21
То есть синтаксис проверяют по команде запрос.текст? А не запрос.выполнить()?
227 Dmitrii
 
гуру
23.11.21
14:27
(226) Уточнять это надо у разработчиков платформы.
Вероятнее всего, синтаксис впервые проверяется в момент Запрос.Выполнить(). Но если в дальнейшем Запрос не переопределяется и изменения текста запроса не происходит, то и синтаксическая проверка повторно не производится.

Думаю как-то так.
Потому что при первой установке значения Запрос.Текст зачастую туда пихают текст к таком виде, в котором он выполниться не смог бы. А потом походу выполнения кода этот текст корректируют в зависимости от каких-либо условий.
228 mistеr
 
23.11.21
15:14
(223) > в sql есть даже отдельная команда обновления индексов,т.к.новые данные попадают в индекс не сразу.

Это что-то новенькое. Что за трава^wкоманда и с какой версии появилась?
229 mistеr
 
23.11.21
15:18
(225) (227) Хочу напомнить, что 1С все запросы выполняет через sp_executesql(). Поэтому анализ текста запроса производится каждый раз. А вот построение плана запроса выполняется не каждый раз, но и не гарантированно один раз. Тут 1С полностью полагается на механизмы кэширования запросов скуля.
230 Sasha_H
 
23.11.21
15:23
(0) Запросы в цикле не совсем хорошо и не совсем плохо. Они действительно необходимы только в том случае, когда по - другому не сделать. Все зависит от конкретного уровня задач и решения. Но в целом считается немного иначе, что запросы в цикле плохи, когда данных много. Когда конфигурацию пишут прикладные программисты (тоесть разрабатывая типовые механизмы) то упор идет на масштабируемость и  всемя способами стараются прибегнуть к правилу запросы в цикле это плохо. Но при адаптации собственных решений под конкретные задачи - это совершенно другое и все зависит от условий.

Поэтому запросы в цикле плохи, когда они получают большую массу данных.
231 Dmitrii
 
гуру
23.11.21
16:41
(229) >> 1С все запросы выполняет через sp_executesql(). Поэтому анализ текста запроса производится каждый раз.

Есть подозрение, что мы говорим о разном.
Ты под анализом текста запроса понимаешь анализ текста на стороне СУБД. Разумеется там анализ текста производится каждый раз.
А в статье на ИТС по ссылке из (225) речь идёт о синтаксической проверке теста запроса на стороне 1С. Еще до того, как выполнить sp_executesql().
Иными словами, если запрос и его текст определены перед циклом, то проверка текста запроса сервером 1С будет выполняться только один раз (перед первым sp_executesql()). И если объект "Запрос" и его свойство "Текст" в цикле не меняются, то повторно текст запроса не анализируется, а передаётся в первоначальном виде. Если же внутри цикла объект "Запрос" создаётся каждый раз заново или меняется его свойство "Текст", то сервер 1С тратит какие-то ресурсы в каждой итерации на анализ текста запроса перед тем как выполнить sp_executesql().
232 ДенисЧ
 
23.11.21
16:48
(229) "1С все запросы выполняет через sp_executesql(). Поэтому анализ текста запроса производится каждый раз"
нет. Про кеш запросов ты не слышал, вероятно...
233 pechkin
 
23.11.21
16:50
(231) это оптимизация на спичках.
234 Dmitrii
 
гуру
23.11.21
17:05
(233) >> это оптимизация на спичках.

Не спорю.
Но вряд ли 1С-ники совсем уж просто так включили упоминание этих спичек в свои рекомендации на ИТС.
Когда речь идёт о тысячах итераций, расходы могут быть заметными.
235 mistеr
 
23.11.21
18:13
(232) Не только слышал, но и пишу об это м в след. предложении, если ты не заметил. Минимальный анализ текста все равно выполняется, прежде чем обратиться к кэшу.