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

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

Возвращаемое значение в 1С: что это и как использовать

Что такое возвращаемое значение в 1С: разница функций и процедур, оператор Возврат, примеры кода, типичные ошибки и проверка результата работы.

Возвращаемое значение в 1С — это результат, который функция передаёт обратно в то место кода, откуда её вызвали. Механизм реализуется оператором Возврат внутри функции: всё, что стоит после этого оператора, становится значением выражения вызова. Например, вызов Сумма = РассчитатьИтог(ТаблицаТоваров); присвоит переменной Сумма именно то, что функция РассчитатьИтог вернула через Возврат.

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

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

Функция и процедура: в чём принципиальная разница

Во встроенном языке 1С существует два вида методов: функции и процедуры. Функция объявляется ключевым словом Функция и обязана вернуть значение — либо явно через Возврат Значение;, либо неявно: если оператор Возврат не выполнился ни разу, функция вернёт Неопределено. Процедура объявляется словом Процедура и результата не возвращает в принципе.

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

Функция ПолучитьСтавкуНДС(Товар) Экспорт

Если Товар.Льгота Тогда

Возврат 0;

КонецЕсли;

Возврат 20;

КонецФункции

Процедура ЗаписатьЛог(Текст) Экспорт

ЗаписьЖурналаРегистрации("Обмен", , , , Текст);

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

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

Как работает оператор Возврат

Оператор Возврат выполняет две задачи одновременно: немедленно прекращает выполнение функции и передаёт указанное значение наружу. Код, написанный после Возврат в той же ветке выполнения, никогда не выполнится — это частый источник «мёртвого кода» у новичков.

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

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

Какие типы данных можно возвращать

Встроенный язык 1С не требует объявлять тип возвращаемого значения: функция может вернуть что угодно — число, строку, булево, дату, ссылку на объект базы, массив, структуру, таблицу значений. Более того, одна и та же функция в разных ветках может вернуть разные типы. Такая гибкость удобна, но требует дисциплины: вызывающий код должен понимать, что именно придёт.

Распространённый приём — возврат структуры, когда нужно отдать несколько значений сразу. Например, функция проверки документа может вернуть структуру с полями Успех, ТекстОшибки, ДанныеДокумента. Это читабельнее, чем возвращать массив с безымянными элементами.

Функция ПроверитьДокумент(Ссылка) Экспорт

Результат = Новый Структура("Успех, ТекстОшибки", Ложь, "");

Если Ссылка.Пустая() Тогда

Результат.ТекстОшибки = "Пустая ссылка";

Возврат Результат;

КонецЕсли;

Результат.Успех = Истина;

Возврат Результат;

КонецФункции

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

Что вернуть с сервера на клиент

Структура или массив структур

Подходит для большинства случаев: сериализуется без ограничений, легко читается в коде

Адрес во временном хранилище

Подходит для больших таблиц и результатов запросов; требует отдельного вызова ПолучитьИзВременногоХранилища на сервере

ТаблицаЗначений напрямую

Не сработает в тонком и веб-клиенте при вызове сервера — вызовет ошибку передачи данных

Как проверить возвращаемое значение при отладке

Самый надёжный способ понять, что реально возвращает функция, — отладчик конфигуратора. Поставьте точку останова на строке с оператором Возврат, запустите отладку и посмотрите значение выражения в табло или через «Вычислить выражение» (Shift+F9). Так вы увидите фактический тип и содержимое результата до того, как он уйдёт в вызывающий код.

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

Для быстрой проверки без отладки удобно выводить результат через Сообщить() или в журнал регистрации. Это приемлемо для разовой диагностики, но не оставляйте такие вызовы в рабочем коде: в циклах они замедляют выполнение и засоряют журнал.

Порядок проверки результата функции
  1. 1
    Поставьте точку останова на операторе Возврат внутри функции
  2. 2
    Запустите отладку и воспроизведите сценарий вызова
  3. 3
    Через «Вычислить выражение» проверьте тип и содержимое возвращаемого значения
  4. 4
    Поставьте точку на строке после вызова и проверьте переменную-получатель
  5. 5
    Если получено Неопределено — проверьте, какая ветка условий завершила функцию без Возврат

Типичные ошибки при работе с возвращаемыми значениями

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

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

Третья частая проблема — игнорирование результата там, где он важен. Например, функция записи объекта возвращает булево «успешно/неуспешно», а вызывающий код просто вызывает её и идёт дальше. Ошибка записи остаётся незамеченной, а данные теряются молча.

Типичные ошибки
01
Нет Возврат в одной из веток — функция молча возвращает Неопределено
02
Разные типы результата в разных ветках — вызывающий код падает на операциях с типом
03
Игнорирование возвращаемого значения — ошибки записи и проверок проходят незамеченными
04
Код после оператора Возврат — никогда не выполняется, логика теряется
05
Возврат ТаблицыЗначений с сервера на тонкий клиент — ошибка передачи данных между контекстами

Возвращаемые значения в расширениях и типовых модулях

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

При использовании &ИзменениеИКонтроль вы вызываете типовой метод через специальную конструкцию и обязаны вернуть его результат (или осознанно подменённое значение). Потерять Возврат в такой обёртке — значит обнулить результат для всей цепочки вызовов, причём ошибка проявится только в конкретных сценариях.

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

FAQ: частые вопросы о возвращаемых значениях в 1С

Может ли процедура вернуть значение?

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

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

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

Можно ли вернуть несколько значений из одной функции?

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

Чем Неопределено отличается от NULL в результате функции?

Неопределено — признак отсутствия значения во встроенном языке, его обычно возвращают функции. NULL — значение из мира запросов, означающее отсутствие данных в поле результата запроса. Сравнивать их нужно по-разному: Неопределено проверяется оператором сравнения, а NULL — функцией ЕСТЬNULL в запросе или методом ЕстьNULL.

Почему функция на сервере не возвращает таблицу значений на клиент?

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

Как понять, какой тип возвращает типовая функция конфигурации?

Откройте модуль с функцией в конфигураторе и посмотрите все операторы Возврат. Быстрее — поставить точку останова на вызове и проверить результат в отладчике. Также помогает синтакс-помощник (Ctrl+F1) для методов платформы, но для методов конфигурации надёжнее чтение кода и отладка.

Итог

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

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