Имя: Пароль:
1C
1С v8
Извечный вопрос про запрос в цикле.
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
Кстати, так и не решился пропедалировать на работе сей продукт, наверное, потому что с ним моя отдача должна бы резко увеличиться, а мне и так не платят даже половины, так сказать, от соседней ветки, а к хорошему быстро привыкаешь, а мне б работу менять, но тоже никак не решусь, вдруг там работать надо будет, да без чудо-продукта, да ещё и с отдачей))