Версия для печати темы (https://pro1c.org.ua/index.php?s=88b4b78d0f12c1e2b64a74a5b39a1ed8&showtopic=67249)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Виконання запиту в циклі... в яких випадках можна ?

Автор: alex-l1904 12.05.23, 8:46

Доброго дня,
всім відомо, що запит в циклі це погано...

Але... якщо обробка результату кожного запиту триває по кілька хвилин,
то можна вважати, що це просто послідовне виконання запитів?

Як вважаєте ?

Автор: Vofka 12.05.23, 9:12

Цитата(alex-l1904 @ 12.05.23, 9:46) *
то можна вважати, що це просто послідовне виконання запитів?

Я так не вважаю. Але якщо
Цитата(alex-l1904 @ 12.05.23, 9:46) *
обробка результату кожного запиту триває по кілька хвилин

То пофігу. Але за можливості слід намагатися робити меншу кількість запитів в будь-якому випадку.

Автор: andr_andrey 12.05.23, 9:14

alex-l1904 @ Сегодня, 9:46 * ,
Завжди зважають на ситуацію, мислити догматами шкідливо для результату.
Результат майже завжди - компроміс.

Автор: Moloko 12.05.23, 11:48

А що заважає поставити в самому запиті необхідне додаткове групування?

Автор: zay 12.05.23, 12:53

alex-l1904 @ Сегодня, 9:46 * ,
Вважаю так: якщо ви бачите, що с самого початку запит виходить занадто складний, а у майбутньому може бути змінена бізнес логіка і це повністю поламає запит, то краще одразу розбивайте заповнення даних на окремі запити/функції
Вносити зміни в окремі функції потребує меньше часу ніж переписувати складні запити

Автор: Batchir 18.05.23, 9:34

Цитата
Виконання запиту в циклі... в яких випадках можна ?

Запрос в цикле всегда зло. Если есть возможность вынести запрос за рамки цикла (не важно это будет одни запрос или как описали выше блоки), то всегда это нужно делать.
Например (сугубо в качестве кейса),
ТекстЗапроса = 
"
|Выбрать Н.Ссылка Из Справочник.Номенклатура КАК Н";
Пока Выборка.Следующий() Цикл
Сообщить(""+Выборка.Ссылка + " "+Выборка.Ссылка.Артикул);
КонецЦикла;


является ошибкой, т.к. обращение через точку к ссылке является неявным запросом к базе.
Будет выполнены неявные запросы на получение представления ссылки и получения артикула по ссылке чтобы выдать в Сообщить
Представление ссылки и артикул в данном кейсе нужно выносить в запрос.

Из практики вспомнил несколько кейсов использования запроса в цикле:
1. Запрос в цикле у меня использовался когда результат следующего запроса зависел от предыдущего.
Например (опять сугубо в качестве кейса),
Запросом формировалась первичная ВТ
Затем шел какой-то цикл
Пока Истина Цикл
// Выбрать * ПОМЕСТИТЬ ВТ_1 из ВТ
//
// Изменяем данные ВТ_1 в запросе по какой-то логике, которая определяется циклом
//
// - Уничтожить ВТ
// Выбрать * ПОМЕСТИТЬ ВТ из ВТ_1
// - Уничтожить ВТ_1
//
// в следующей итерации цикла используем обновленные данные ВТ
КонецЦикла;


2. Построение отчета ПНЛ, цифры (формулы, источники и прочее) которого определялись настройками справочника, но там по сути такой же подход был как и в 1 кейсе. Каждая следующая строка ПНЛ имела свою логику, которая могла (или не могла) зависеть от данных предыдущих строк.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua