|
Извечный вопрос про запрос в цикле. | ☑ | ||
---|---|---|---|---|
0
Serpom
09.08.23
✎
06:09
|
Здравствуйте! Понимаю, что этот вопрос уже многим поперек горла, но все-таки. Есть запрос на СКД в котором пользователь может выбрать 1 из 10 возможных вариантов отчета и нажать кнопочку Сформировать. Сейчас появилась необходимость сделать кнопочку Сформировать все отчеты. И все настройки и параметры 10 отчетов хранятся в Структуре. Чтобы обойти структуру и передать разные параметры в запрос нужен цикл. Но по стандартам запрос в цикле использовать не желательно. Можно как-то это обойти и сделать красиво или сделать не по стандарту? :)
|
|||
1
Bigbro
09.08.23
✎
06:15
|
так если там реально разные данные и это по факту разные отчеты то в чем проблема цикла?
запрос в цикле неверно когда ты однотипную операцию в цикле тысячи раз выполняешь вместо того чтобы дернуть один раз все данные и потом с ними работать. хотя если у тебя вся разница заключается в отборе по организации "Ромашка" или "Рога и копыта" - тогда конечно. |
|||
2
SleepyHead
09.08.23
✎
06:19
|
(0) источник данных для СКД сделай объект, а не запрос.
Запрос будет исполняться один раз, потом заполняй нужные тебе наборы данных и передавай их в СКд. |
|||
3
Serpom
09.08.23
✎
06:28
|
(1) Текст запроса один и тот же. Меняются только параметры.
|
|||
4
SleepyHead
09.08.23
✎
06:31
|
(3) А вот это что-то новенькое, в (0) этого нет, цитирую:
" Есть запрос на СКД в котором пользователь может выбрать 1 из 10 возможных вариантов отчета и нажать кнопочку Сформировать. " насколько я понял, параметры задаются один раз, далее получаем данные запросом, он является источником данных для 2 и более вариантов того же отчета. Даеные заполняем (таблицы значений), передаем их СКД как внешние наборы данных. |
|||
5
DJ Anthon
09.08.23
✎
06:31
|
(2) вот адынэс так и делает. тебе нужно узнать помесячно выручку, но "заодно" тебе за каким-то хером считается еще и себестоимость, из-за чего секундный отчет вылетает через час формирования из-за нехватки памяти на сервере...
|
|||
6
SleepyHead
09.08.23
✎
06:42
|
(5) Ну вот хочет человек как в 1с, кто я такой, чтобы ему это запретить?
|
|||
7
DimVad
09.08.23
✎
06:46
|
10 запросов это ужасно ?
А сколько запросов выполняется при проведении какого-нибудь документа реализации ? |
|||
8
DJ Anthon
09.08.23
✎
07:30
|
(6) да у него-то вполне нормально )) а вот 1с не обеспечила конфигурацию ERP простым отчетом по выручке, всё наворочено до ужаса, постоянно надо писать своё
|
|||
9
Hmster
09.08.23
✎
07:56
|
(0) Тут надо всегда смотреть по обстоятельствам.
Если, допустим, ты перебираешь ТЧ и для каждой строки получаешь запросом артикул номенклатуры, то цикл это плохо. Или ты в цикле на каждой итерации получаешь и перерабатываешь большой пласт данных - то это уже другое дело. Например, понадобилось как-то бухгалтерии перепечатать производственные документы за год, а их там порядка нескольких тысяч. Так вот выбрать сразу все данные и вывести на печать не каждый сервер потянет, а если делать по одному - то проблем не возникнет. Так что тут надо еще руководствоваться принципом разумности, а не формальности |
|||
10
Valdis2007
09.08.23
✎
09:49
|
(0) ну будет у тебя 10 запросов, по количеству вариантов...это не страшно...Ну или делай пакетом, результаты выгружай во временные таблицы...из них выводи в результирующий отчет
|
|||
11
СвинТуз
09.08.23
✎
10:23
|
(0)
Кнопку на форму выведи. Получи набор данных один раз и программным путем делай с ним что хочешь. |
|||
12
bolobol
09.08.23
✎
13:10
|
Если параметры разные - разные и результаты. Кроме как выполнить каждый - иного варианта нет
|
|||
13
Волшебник
09.08.23
✎
13:11
|
(0) У профессионалов запросы в цикле не тормозят.
|
|||
14
Одинист
09.08.23
✎
13:24
|
(0) > Можно как-то это обойти и сделать красиво или сделать не по стандарту?
Формулировка не корректна. Нельзя делать запрос в НЕОПРЕДЕЛЕННОМ цикле. Если ты твердо знаешь количество итераций это не ошибка. |
|||
15
DimVad
09.08.23
✎
14:42
|
(14) // Нельзя делать запрос в НЕОПРЕДЕЛЕННОМ цикле
Простой пример. Есть неопределённый цикл по контрагентам. Для каждого контрагента создаётся набор документов (одна реализация, одна фактура, один счёт если нужен и т.д.). Можно попытаться вытащить всю нужную информацию одним запросом по всем контрагентам но вот беда - для контрагентов разного типа нужна уж очень разная информация. Запрос получается монстрообразный. А можно сделать маленькие запросики в цикле - благо по сравнению с проведением документов они сработают быстро. И они будут работать надёжно - маленькие запросики проще отладить. И менять логику обработки потом будет просто. Так что даже и в неопределённом цикле иногда можно и нужно писать запросы, только никому не говорить об этом :-) p.s. Раньше когда я писал приблуды под MS SQL на дельфине, даже не парился по поводу маленьких запросиков в цикле. А тут в 1С оказалась такая "догма" :-) |
|||
16
bolobol
09.08.23
✎
14:50
|
Вообще-то, речь идёт про:
Для каждой СтрокиТЗ из ТЗ Цикл ... СтрокаТЗ.Склад.Контрагент.ОсновнойДоговор.ДатаЗакрытия ... КонецЦикла - и всю необходимую информацию не представляет сложности получить одним запросом к базе и вертеть ею потом построчно в цикле |
|||
17
DimVad
09.08.23
✎
14:51
|
(16) А, ну это бред конечно. Точка через точку через точку... :-)
|
|||
18
DimVad
09.08.23
✎
14:55
|
+(17) Т.е. 1С неявно создаст объект типа склад, потом объект типа контрагент, потом объект типа договор в уж с него получит Дату закрытия.
Потом правда будет пытаться использовать кеш, если объекты в нём уже были. Неявные запросы в цикле. |
|||
19
bolobol
09.08.23
✎
14:55
|
Вы опять не поняли.. Тут и пример не про точку, т.к. запрос точно также пойдёт через точку, через точку.. только вот все таблицы для ТЗ разогреет для первой СтрокиТЗ, что сопоставимо выборке всех данных сразу
|
|||
20
bolobol
09.08.23
✎
14:59
|
Так что - даже монстрообразный запрос для выборки разных данных для контрагентов разного типа - это проблема организации входных данных - разделить их сразу по типам и использовать лишь несколько пакетных запросов к базе, а не построчных
|
|||
21
Одинист
09.08.23
✎
14:59
|
(15) > для контрагентов разного типа
Запросов должно быть по количеству типов. Количество типов ограниченно. > благо по сравнению с проведением документов они сработают быстро Когда контрагентов будет несколько тысяч, то обрабатываться быстро перестанут |
|||
22
DimVad
09.08.23
✎
15:05
|
(21) Несколько тысяч или несколько миллионов -всё равно на проведение документов будет уходить
> 90 % времени, как не изголяйся. Так что лучше писать просто и понятно - хоть своё рабочее время будет экономиться. p.s. А вообще глядя как работают типовые возникает подозрение что всё это не очень предназначено к быстрой работе в принципе. Архитектурно. p.p.s. Количество типов ограничено. Но есть и другие развилки. Типа при наличии задолженности у контрагента такого типа нужно делать так-то если задолженность не превышает X, а у контрагентов из такой-то группы - если не превышает Y, а если превышает то и т.д. |
|||
23
bolobol
09.08.23
✎
15:08
|
Запрос внутри 1С очень плохо выглядит.. текст без раскраски, без группировки - это единственный недостаток писать запросами
|
|||
24
DimVad
09.08.23
✎
15:10
|
(23) Можно в конфигураторе сделать "Основное меню - Текст - Текст запросов" и раскраска появится в тексте. А можно пользоваться удобными конструкторами запросов.
|
|||
25
bolobol
09.08.23
✎
15:14
|
(24) Странно переключать раскраску из-за того, какую именно часть модуля редактируешь. Равно как и странно выходить из конфигуратора пописать запросец в иное место, особенно попереносить туда-сюда и потерять то что понаписал. Это конкретная недоработка в конфигураторе, до кучи к отсутствию нормальной контекстной подсказки. Проще использовать какой-то за 5000 продукт, который прям к конфигураторе делает всё красиво
|
|||
26
bolobol
09.08.23
✎
15:44
|
Кстати, так и не решился пропедалировать на работе сей продукт, наверное, потому что с ним моя отдача должна бы резко увеличиться, а мне и так не платят даже половины, так сказать, от соседней ветки, а к хорошему быстро привыкаешь, а мне б работу менять, но тоже никак не решусь, вдруг там работать надо будет, да без чудо-продукта, да ещё и с отдачей))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |