Разработка и Конфигурация · 8 мин
Что возвращает процедура в 1С
Разбираем, что возвращает процедура в 1С, чем она отличается от функции, как передать результат через параметры и когда стоит выбирать каждый вариант.
Встроенный язык 1С разделяет методы на два типа: процедуры и функции. Ключевое различие между ними — именно возвращаемое значение. Процедура в 1С ничего не возвращает: она выполняет последовательность действий и завершает работу, не передавая результат в точку вызова. Функция, напротив, обязана вернуть значение через оператор Возврат.
Это различие определяет и синтаксис вызова. Процедуру нельзя использовать в выражении — например, нельзя написать Результат = МояПроцедура();, компилятор выдаст ошибку. Функцию можно встраивать в выражения, присваивать её результат переменным и передавать в другие методы.
Несмотря на то, что процедура не возвращает значение, обмен данными с вызывающим кодом всё же возможен — через параметры, переданные по ссылке (ключевое слово Знач отсутствует), через переменные модуля и через реквизиты объектов. Ниже разберём все механизмы и типичные сценарии.
Чем процедура отличается от функции
Формально оба метода объявляются похоже, но поведение принципиально разное. Функция вычисляет и возвращает значение; процедура выполняет действие. Попытка написать Возврат МоеЗначение; внутри процедуры приведёт к ошибке компиляции — в процедуре оператор Возврат допустим только без выражения.
| Критерий | Процедура | Функция |
|---|---|---|
| Возвращаемое значение | Отсутствует | Обязательно (по умолчанию Неопределено) |
| Вызов в выражении | Запрещён | Разрешён |
| Оператор Возврат | Только без значения | Со значением |
| Типичное назначение | Действия: запись, проведение, вывод сообщений | Вычисления: суммы, признаки, найденные ссылки |
Если функция завершится без явного оператора Возврат, она вернёт значение Неопределено. Это частая причина трудноуловимых ошибок: код не падает, но результат вычисления оказывается пустым.
Как объявить и вызвать процедуру
Объявление процедуры начинается с ключевого слова Процедура, за которым следуют имя, список параметров в скобках и тело до ключевых слов КонецПроцедуры. Пример простейшей процедуры:
Процедура ВывестиСообщениеПользователю(ТекстСообщения) Экспорт
Сообщить(ТекстСообщения);
КонецПроцедуры
Вызов выполняется отдельным оператором: ВывестиСообщениеПользователю("Операция завершена");. Ключевое слово Экспорт делает процедуру доступной из других модулей; без него метод виден только внутри своего модуля.
Процедура РассчитатьСкидку(СуммаДокумента)
Если СуммаДокумента > 100000 Тогда
Сообщить("Применена скидка");
КонецЕсли;
КонецПроцедурыКак передать результат из процедуры без возвращаемого значения
Параметры по ссылке
Если параметр объявлен без ключевого слова Знач, он передаётся по ссылке: изменения внутри процедуры будут видны в вызывающем коде. Так процедура может «вернуть» данные, не имея возвращаемого значения:
Процедура ЗаполнитьРеквизиты(ДокументОбъект, Отказ)
ДокументОбъект.Комментарий = "Заполнено автоматически";
Если Не ПроверкаПройдена() Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
После вызова ЗаполнитьРеквизиты(МойДокумент, ФлагОтказа); переменная ФлагОтказа может измениться на Истина. Именно так устроены многие обработчики событий в управляемых формах и модулях объектов.
Переменные модуля и реквизиты
Второй способ — записать результат в переменную модуля или реквизит объекта (например, реквизит формы). Процедура изменяет состояние, а вызывающий код читает его после вызова. Способ рабочий, но затрудняет чтение кода: неочевидно, где именно переменная изменилась.
Что делает оператор Возврат внутри процедуры
Оператор Возврат в процедуре используется только для досрочного выхода. Это удобно для «защитных» проверок в начале тела, чтобы не оборачивать всю логику во вложенные условия:
Процедура ПровестиОплату(Сумма)
Если Сумма <= 0 Тогда
Возврат; // просто выходим, ничего не возвращая
КонецЕсли;
// основная логика
КонецПроцедуры
Такой приём делает код плоским и читаемым. Главное — помнить, что после Возврат в процедуре нельзя указывать выражение: это синтаксическая ошибка, и конфигуратор откажется сохранять модуль.
Когда выбирать процедуру, а когда функцию
Правило простое: если вызов должен дать ответ — пишите функцию, если нужно выполнить действие — процедуру. Запись документа, вывод сообщения, установка признака в объекте — естественные задачи процедуры. Расчёт суммы, поиск ссылки, проверка условия — задачи функции.
Как выбрать действие
Если требуется вернуть несколько значений, предпочтительнее функция, возвращающая структуру, — такой код проще тестировать и читать, чем процедуру с пятью параметрами по ссылке.
Сравнение вариантов
Подходит для возврата нескольких значений; результат явный, легко проверить. Требует создания структуры
Подходит для обработчиков событий и изменения переданного объекта; минус — неочевидность побочных эффектов
Допустимо в небольших модулях; затрудняет сопровождение при росте кода
Как проверить поведение кода
Убедиться, что процедура отработала корректно, можно через отладчик конфигуратора: поставьте точку останова на вызове, шагните внутрь (F11) и проверьте значения параметров по ссылке после завершения. Для функций дополнительно контролируйте, что все ветки кода заканчиваются оператором Возврат со значением.
Как проверить результат
Модуль сохраняется без ошибок
Ошибка «Процедуры и функции не могут возвращать значение» или обратная
Параметры по ссылке содержат ожидаемые изменения
Изменения потеряны — параметр объявлен с Знач
Все ветки возвращают значение ожидаемого типа
В некоторых ветках возвращается Неопределено
Что важно запомнить
Процедура в 1С не возвращает значение: Возврат в ней лишь завершает выполнение. Нужен результат — используйте функцию, структуру или параметры по ссылке. Процедуру нельзя вызывать внутри выражений.
Частые вопросы
Можно ли написать «Возврат Истина» в процедуре?
Нет. В процедуре оператор Возврат допустим только без выражения — для досрочного выхода. Попытка указать значение вызовет ошибку при проверке модуля. Если нужно вернуть Истина, преобразуйте метод в функцию.
Что произойдёт, если присвоить вызов процедуры переменной?
Конфигуратор выдаст ошибку компиляции: процедура не является выражением и не имеет значения, которое можно присвоить. Используйте функцию или передавайте результат через параметр по ссылке.
Что вернёт функция, если забыть оператор Возврат?
Функция вернёт значение Неопределено. Ошибки на этапе компиляции не будет, поэтому такие дефекты выявляют проверкой всех ветвей кода и тестированием граничных условий.
Как из процедуры вернуть несколько значений?
Два рабочих способа: объявить несколько параметров без ключевого слова Знач и изменять их внутри процедуры, либо передать структуру и заполнять её поля. В новых разработках чаще рекомендуют функцию, возвращающую структуру.
Может ли процедура вызывать функцию и наоборот?
Да, ограничений нет. Процедура может вызывать функцию и использовать её результат в своих выражениях; функция может вызывать процедуры для выполнения действий. Ограничение одно: процедуру нельзя встроить в выражение.
Почему обработчики событий в 1С — процедуры, а не функции?
Платформа вызывает обработчики для выполнения действий (при записи, при открытии и т.п.), а результат передаётся через параметры по ссылке — например, Отказ или СтандартнаяОбработка. Поэтому сигнатура обработчиков исторически построена на процедурах.