Мне нужно посчитать в документе общее количество по ссылке документа, но не уверен, что будет правильно если прямо во время обхода запроса, взять это значение и не ожидая окончания цикла выйти из функцию в вызывающую процедуру, вот пример кода.

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    | СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество,
    | РеализацияТоваровУслугТовары.Ссылка КАК Ссылка
    |ИЗ
    | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    |ГДЕ
    | РеализацияТоваровУслугТовары.Ссылка = &Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    | РеализацияТоваровУслугТовары.Ссылка";

    Запрос.УстановитьПараметр("Ссылка", Ссылка);

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

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

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

А вообще в цикле можно тоже вернуть
---
раньше в школе учили что это не правильно прерывать цикл оператором возврата но не потому что так неправильно будет работать программа а по причине того что
оператор возврата всегда должен быть в конце функции
в начале объявить временную переменную в которой сохранить значение для возврата по умолчанию
это упрощает чтение функции, всегда функция будет возвращать значение,
---
оператор возврата всегда должен быть в конце функции
А если в теле функции есть более чем один оператор возврата? Это уже не функция? Возврат может быть использован не только в конце функции.
---
А если в теле функции есть более чем один оператор возврата
ну это то понятно, у меня один возврат)
---
вот тоже что-то такое припоминаю из универа
---
разрешается
---
но лучше как в (2)
---
Нет. За это дают 10 лет строгого расстрела без права переписки.

Зы. Тупой вопрос - тупой ответ
---
я так и понял тупой ответ, хороший ответ п.2
---
Как уже отвечали, вернуть из цикла можно. Иногда даже нужно, чтобы ускорить обработку. Например, если выход не как у вас сразу же, а по определенному условию. Если я ничего не путаю, то такое поведение встречается даже в стандартных конфигурациях. В вашем случае, самый правильный вариант - в (2).
Только нужно обязательно учесть, что в цикл может и не зайти. в этом случае функция вернет НЕОПРЕДЕЛЕНО и дальше может возникнуть ошибка.
---
Спасибо, это тоже дельное замечание.
---
Спасибо всем за помощь, исправлю код.
---
Дополню замечания.

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

Если уберете из запроса поле ссылки, оставив только сумму, то результат запроса, а значит и выборка, будут иметь ровно 1 строку. Следовательно от конструкции "Если...Тогда...КонецЕсли" можно вовсе избавиться:

```1c
    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    Возврат Выборка.Количество;
```

Особенный случай: подсчет количества, когда документа по переданной ссылке не существует. Даже в этом случае выборка будет содержат одну строку, без исключений. Отличие лишь в том, что поле "Количество" будет равно "NULL". Если такой результат функции не устраивает, и вместо NULL хочется вернуть 0, то можно поправить немного запрос:

```1c
    ЕСТЬNULL(СУММА(РеализацияТоваровУслугТовары.Количество), 0) КАК Количество
```
Код при этом не меняется.
---
Спасибо, так еще интереснее
---
```1c
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
    Возврат 0;
    КонецЕсли;
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    Возврат Выборка.Значение;
```