Разрешается ли делать возврат из функции во время цикла обхода запроса?

1. user1194102 19.02.20 09:02 Сейчас в теме
Мне нужно посчитать в документе общее количество по ссылке документа, но не уверен, что будет правильно если прямо во время обхода запроса, взять это значение и не ожидая окончания цикла выйти из функцию в вызывающую процедуру, вот пример кода.
Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество,
		|	РеализацияТоваровУслугТовары.Ссылка КАК Ссылка
		|ИЗ
		|	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
		|ГДЕ
		|	РеализацияТоваровУслугТовары.Ссылка = &Ссылка
		|
		|СГРУППИРОВАТЬ ПО
		|	РеализацияТоваровУслугТовары.Ссылка";
	
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	Возврат ВыборкаДетальныеЗаписи.Количество;
	КонецЦикла;
	
Показать
По теме из базы знаний
Найденные решения
2. Pavel Rodinchenko 19.02.20 09:06 Сейчас в теме
(1)
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Возврат ВыборкаДетальныеЗаписи.Количество;
КонецЦикла;

сделай на в цикле, а в условии Если
Если Выборка.Следующий() Тогда
Возврат Выборка.Количество;
иначе
возврат 1 (или любое другое значение)
КонецЕсли;

А вообще в цикле можно тоже вернуть
user1194102; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Pavel Rodinchenko 19.02.20 09:06 Сейчас в теме
(1)
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Возврат ВыборкаДетальныеЗаписи.Количество;
КонецЦикла;

сделай на в цикле, а в условии Если
Если Выборка.Следующий() Тогда
Возврат Выборка.Количество;
иначе
возврат 1 (или любое другое значение)
КонецЕсли;

А вообще в цикле можно тоже вернуть
user1194102; +1 Ответить
5. user623969_dusa 19.02.20 09:20 Сейчас в теме
(1) раньше в школе учили что это не правильно прерывать цикл оператором возврата но не потому что так неправильно будет работать программа а по причине того что
оператор возврата всегда должен быть в конце функции
в начале объявить временную переменную в которой сохранить значение для возврата по умолчанию
это упрощает чтение функции, всегда функция будет возвращать значение,
user1194102; +1 Ответить
8. ZergKRSK 130 19.02.20 10:06 Сейчас в теме
(5)
оператор возврата всегда должен быть в конце функции

А если в теле функции есть более чем один оператор возврата? Это уже не функция? Возврат может быть использован не только в конце функции.
10. user1194102 19.02.20 12:21 Сейчас в теме
(8)
А если в теле функции есть более чем один оператор возврата

ну это то понятно, у меня один возврат)
9. user1194102 19.02.20 12:21 Сейчас в теме
(5) вот тоже что-то такое припоминаю из универа
3. mushdaj 19.02.20 09:10 Сейчас в теме
4. Gendelf 19.02.20 09:13 Сейчас в теме
(3) но лучше как в (2)
user1194102; +1 Ответить
6. DenisCh 19.02.20 09:23 Сейчас в теме
Нет. За это дают 10 лет строгого расстрела без права переписки.

Зы. Тупой вопрос - тупой ответ
11. user1194102 19.02.20 12:23 Сейчас в теме
(6) я так и понял тупой ответ, хороший ответ п.2
7. user1357043 19.02.20 10:03 Сейчас в теме
Как уже отвечали, вернуть из цикла можно. Иногда даже нужно, чтобы ускорить обработку. Например, если выход не как у вас сразу же, а по определенному условию. Если я ничего не путаю, то такое поведение встречается даже в стандартных конфигурациях. В вашем случае, самый правильный вариант - в (2).
Только нужно обязательно учесть, что в цикл может и не зайти. в этом случае функция вернет НЕОПРЕДЕЛЕНО и дальше может возникнуть ошибка.
user1194102; +1 Ответить
12. user1194102 19.02.20 12:24 Сейчас в теме
(7) Спасибо, это тоже дельное замечание.
13. user1194102 19.02.20 12:33 Сейчас в теме
Спасибо всем за помощь, исправлю код.
14. dhurricane 19.02.20 12:42 Сейчас в теме
(13) Дополню замечания.

Уберите выражение "ПЕРВЫЕ 1", оно здесь совершенно бессмыслено. В результате такого запроса не может оказаться более одной записи.

Если уберете из запроса поле ссылки, оставив только сумму, то результат запроса, а значит и выборка, будут иметь ровно 1 строку. Следовательно от конструкции "Если...Тогда...КонецЕсли" можно вовсе избавиться:
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Количество;

Особенный случай: подсчет количества, когда документа по переданной ссылке не существует. Даже в этом случае выборка будет содержат одну строку, без исключений. Отличие лишь в том, что поле "Количество" будет равно "NULL". Если такой результат функции не устраивает, и вместо NULL хочется вернуть 0, то можно поправить немного запрос:
ЕСТЬNULL(СУММА(РеализацияТоваровУслугТовары.Количество), 0) КАК Количество
Код при этом не меняется.
user1194102; +1 Ответить
15. user1194102 19.02.20 13:02 Сейчас в теме
Спасибо, так еще интереснее
16. MaxxiMiliSan 260 12.10.23 13:36 Сейчас в теме
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда 
Возврат 0;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.Значение;
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот