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