Что означает ключевое слово Возврат в 1С и как его правильно использовать?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Для начинающего разработчика в среде «1С:Предприятие» понимание оператора Возврат является фундаментом написания корректного и чистого кода. Давайте вместе разберем, почему в одних методах этот оператор обязателен, в других — встречается лишь иногда, а в третьих отсутствует вовсе. Мы проанализируем техническую суть этого слова и научимся применять его в повседневных задачах.

1. Основное назначение оператора Возврат

Если говорить простыми словами, Возврат — это команда системе немедленно прекратить выполнение текущего блока кода (процедуры или функции) и вернуться в ту точку программы, откуда этот блок был вызван. Рассмотрим две его главные роли:

  1. Завершение выполнения: Как только интерпретатор 1С встречает слово Возврат, он игнорирует весь последующий код в данном методе и выходит из него.
  2. Передача результата: В случае функций этот оператор не просто «уходит», но и «уносит» с собой результат вычислений, который можно присвоить переменной или использовать в выражении.

2. Различие между процедурой и функцией

Для понимания оператора Возврат крайне важно различать два вида программных блоков. Давайте проанализируем их специфику:

Функция — это метод, который обязан вернуть результат. Представьте её как чертеж или формулу: на входе мы даем данные, на выходе получаем ответ. В функциях Возврат с указанием значения является обязательным в конце логического пути. Если функция дойдет до конца и не встретит Возврат, платформа вернет Неопределено, что считается плохим стилем разработки.

Посмотрим на пример функции:


Функция ПолучитьСуммуСНДС(СуммаБезНДС, СтавкаНДС)
    Результат = СуммаБезНДС * (1 + СтавкаНДС / 100);
    Возврат Результат; // Здесь мы возвращаем числовое значение
КонецФункции

Процедура — это метод, который выполняет действие (например, записывает документ или выводит сообщение), но не возвращает значения. Здесь Возврат необязателен. Если он стоит в самом конце перед КонецПроцедуры, он не несет никакой пользы, так как система и так выйдет из процедуры естественным образом.

3. Досрочный выход или Guard Clause

Рассмотрим ситуацию, когда Возврат необходим внутри процедуры. Чаще всего это используется для «раннего выхода» при несоблюдении условий. Это помогает избежать глубокой вложенности условий Если...Тогда (так называемой «лесенки»).

Проанализируем пример качественного кода:


Процедура РассчитатьСкидку(ДокументСсылка)
    // Если документ уже проведен, расчет не требуется
    Если ДокументСсылка.Проведен Тогда
        Возврат; // Досрочно выходим, код ниже выполняться не будет
    КонецЕсли;

    // Основная логика расчета
    Сообщить("Выполняю расчет...");
КонецПроцедуры

В данном случае оператор выступает в роли «защитника»: если условие выполнено, мы экономим ресурсы системы и не выполняем лишние действия.

4. Концептуальные отличия и побочные эффекты

Важно понимать разницу в философии использования этих методов. При хорошем стиле программирования функции должны быть «чистыми» — они не должны менять данные в базе, а только вычислять результат на основе входящих параметров. Процедуры же, наоборот, создаются ради «побочных эффектов»: изменения состояния объектов, проведения документов или записи в регистры.

Разберем по шагам, как это влияет на отладку. Если функция только возвращает значение, её легко тестировать — вы всегда знаете, что при одинаковых входных данных получите одинаковый Возврат. Если же вы меняете параметры внутри процедуры «по ссылке», это может затруднить поиск ошибок в больших проектах.

5. Возврат нескольких значений

Иногда одной переменной на выходе функции недостаточно. В 1С нельзя написать Возврат Значение1, Значение2, как в некоторых других языках. Однако мы можем обойти это ограничение, используя коллекции.

Рассмотрим пример использования структуры для возврата данных:


Функция ПолучитьДанныеКонтрагента(КонтрагентСсылка)
    Результат = Новый Структура;
    Результат.Вставить("ИНН", КонтрагентСсылка.ИНН);
    Результат.Вставить("КПП", КонтрагентСсылка.КПП);
    
    Возврат Результат; // Возвращаем один объект, содержащий много данных
КонецФункции

Этот способ гораздо нагляднее и безопаснее, чем изменение параметров процедуры, так как четко разделяет входные данные и результат.

6. Важные нюансы платформы 1С

Выясним некоторые технические особенности, которые часто путают новичков:

  1. Возврат и Отказ: В обработчиках событий (например, ПередЗаписью) часто встречается параметр Отказ. Важно помнить: просто Возврат; не отменяет действие системы (запись все равно произойдет). Чтобы прервать процесс записи, нужно сначала установить Отказ = Истина;, а затем вызвать Возврат;.
  2. Управление памятью: Когда вы делаете Возврат большой таблицы значений или структуры, платформа не копирует все данные. Она передает ссылку на объект. Это работает очень быстро и не перегружает оперативную память.
  3. Асинхронные вызовы: В современной платформе (8.3.18+) функции с пометкой Асинх при выполнении Возврат на самом деле возвращают специальный объект — «Обещание» (Promise). Значение будет доступно только после завершения асинхронной операции.
  4. Рекурсия: Если функция вызывает саму себя (например, обход дерева групп справочника), крайне важно «пробрасывать» Возврат на каждом уровне. Иначе результат, вычисленный на самом глубоком уровне вложенности, потеряется при возвращении наверх.

7. Практические советы

Подводя итог, давайте сформулируем правила хорошего тона при использовании оператора Возврат:

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

← На главную