К статье
Практический материал

Разработка и Конфигурация · 8 мин

Что возвращает процедура в 1С

Разбираем, что возвращает процедура в 1С, чем она отличается от функции, как передать результат через параметры и когда стоит выбирать каждый вариант.

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

Это различие определяет и синтаксис вызова. Процедуру нельзя использовать в выражении — например, нельзя написать Результат = МояПроцедура();, компилятор выдаст ошибку. Функцию можно встраивать в выражения, присваивать её результат переменным и передавать в другие методы.

Несмотря на то, что процедура не возвращает значение, обмен данными с вызывающим кодом всё же возможен — через параметры, переданные по ссылке (ключевое слово Знач отсутствует), через переменные модуля и через реквизиты объектов. Ниже разберём все механизмы и типичные сценарии.

Чем процедура отличается от функции

Формально оба метода объявляются похоже, но поведение принципиально разное. Функция вычисляет и возвращает значение; процедура выполняет действие. Попытка написать Возврат МоеЗначение; внутри процедуры приведёт к ошибке компиляции — в процедуре оператор Возврат допустим только без выражения.

КритерийПроцедураФункция
Возвращаемое значениеОтсутствуетОбязательно (по умолчанию Неопределено)
Вызов в выраженииЗапрещёнРазрешён
Оператор ВозвратТолько без значенияСо значением
Типичное назначениеДействия: запись, проведение, вывод сообщенийВычисления: суммы, признаки, найденные ссылки

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

Как объявить и вызвать процедуру

Объявление процедуры начинается с ключевого слова Процедура, за которым следуют имя, список параметров в скобках и тело до ключевых слов КонецПроцедуры. Пример простейшей процедуры:

Процедура ВывестиСообщениеПользователю(ТекстСообщения) Экспорт

Сообщить(ТекстСообщения);

КонецПроцедуры

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

bsl
Процедура РассчитатьСкидку(СуммаДокумента)
	Если СуммаДокумента > 100000 Тогда
		Сообщить("Применена скидка");
	КонецЕсли;
КонецПроцедуры

Как передать результат из процедуры без возвращаемого значения

Параметры по ссылке

Если параметр объявлен без ключевого слова Знач, он передаётся по ссылке: изменения внутри процедуры будут видны в вызывающем коде. Так процедура может «вернуть» данные, не имея возвращаемого значения:

Процедура ЗаполнитьРеквизиты(ДокументОбъект, Отказ)

ДокументОбъект.Комментарий = "Заполнено автоматически";

Если Не ПроверкаПройдена() Тогда

Отказ = Истина;

КонецЕсли;

КонецПроцедуры

После вызова ЗаполнитьРеквизиты(МойДокумент, ФлагОтказа); переменная ФлагОтказа может измениться на Истина. Именно так устроены многие обработчики событий в управляемых формах и модулях объектов.

Переменные модуля и реквизиты

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

Что делает оператор Возврат внутри процедуры

Оператор Возврат в процедуре используется только для досрочного выхода. Это удобно для «защитных» проверок в начале тела, чтобы не оборачивать всю логику во вложенные условия:

Процедура ПровестиОплату(Сумма)

Если Сумма <= 0 Тогда

Возврат; // просто выходим, ничего не возвращая

КонецЕсли;

// основная логика

КонецПроцедуры

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

Типичные ошибки
01
Написать Возврат Значение; в процедуре — ошибка компиляции модуля
02
Присвоить вызов процедуры переменной: Результат = МояПроцедура(); — ошибка, процедуру нельзя использовать в выражении
03
Ожидать, что параметр с ключевым словом Знач изменится снаружи — изменения теряются
04
Оставить функцию без Возврат и получить Неопределено вместо результата

Когда выбирать процедуру, а когда функцию

Правило простое: если вызов должен дать ответ — пишите функцию, если нужно выполнить действие — процедуру. Запись документа, вывод сообщения, установка признака в объекте — естественные задачи процедуры. Расчёт суммы, поиск ссылки, проверка условия — задачи функции.

Маршрут решения

Как выбрать действие

Нужно получить значение и использовать его в выраженииОбъявляйте функцию с оператором Возврат Значение
Нужно выполнить действие без результата (записать, сообщить, провести)Используйте процедуру
Нужно вернуть несколько значенийФункция, возвращающая структуру, либо процедура с параметрами по ссылке
Метод — обработчик события формы или объектаСледуйте сигнатуре платформы: большинство обработчиков — процедуры

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

Сравнение вариантов

Функция со структурой

Подходит для возврата нескольких значений; результат явный, легко проверить. Требует создания структуры

Процедура с параметрами по ссылке

Подходит для обработчиков событий и изменения переданного объекта; минус — неочевидность побочных эффектов

Процедура + переменные модуля

Допустимо в небольших модулях; затрудняет сопровождение при росте кода

Как проверить поведение кода

Убедиться, что процедура отработала корректно, можно через отладчик конфигуратора: поставьте точку останова на вызове, шагните внутрь (F11) и проверьте значения параметров по ссылке после завершения. Для функций дополнительно контролируйте, что все ветки кода заканчиваются оператором Возврат со значением.

Контрольные точки

Как проверить результат

Компиляция модуля
Норма

Модуль сохраняется без ошибок

Тревожный признак

Ошибка «Процедуры и функции не могут возвращать значение» или обратная

Параметры после вызова
Норма

Параметры по ссылке содержат ожидаемые изменения

Тревожный признак

Изменения потеряны — параметр объявлен с Знач

Результат функции
Норма

Все ветки возвращают значение ожидаемого типа

Тревожный признак

В некоторых ветках возвращается Неопределено

Итог

Что важно запомнить

Процедура в 1С не возвращает значение: Возврат в ней лишь завершает выполнение. Нужен результат — используйте функцию, структуру или параметры по ссылке. Процедуру нельзя вызывать внутри выражений.

Частые вопросы

Можно ли написать «Возврат Истина» в процедуре?

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

Что произойдёт, если присвоить вызов процедуры переменной?

Конфигуратор выдаст ошибку компиляции: процедура не является выражением и не имеет значения, которое можно присвоить. Используйте функцию или передавайте результат через параметр по ссылке.

Что вернёт функция, если забыть оператор Возврат?

Функция вернёт значение Неопределено. Ошибки на этапе компиляции не будет, поэтому такие дефекты выявляют проверкой всех ветвей кода и тестированием граничных условий.

Как из процедуры вернуть несколько значений?

Два рабочих способа: объявить несколько параметров без ключевого слова Знач и изменять их внутри процедуры, либо передать структуру и заполнять её поля. В новых разработках чаще рекомендуют функцию, возвращающую структуру.

Может ли процедура вызывать функцию и наоборот?

Да, ограничений нет. Процедура может вызывать функцию и использовать её результат в своих выражениях; функция может вызывать процедуры для выполнения действий. Ограничение одно: процедуру нельзя встроить в выражение.

Почему обработчики событий в 1С — процедуры, а не функции?

Платформа вызывает обработчики для выполнения действий (при записи, при открытии и т.п.), а результат передаётся через параметры по ссылке — например, Отказ или СтандартнаяОбработка. Поэтому сигнатура обработчиков исторически построена на процедурах.