Разработка и Конфигурация · 11 мин
Возвращаемое значение в 1С: что это и как использовать
Что такое возвращаемое значение в 1С: разница функций и процедур, оператор Возврат, примеры кода, типичные ошибки и проверка результата работы.
Возвращаемое значение в 1С — это результат, который функция передаёт обратно в то место кода, откуда её вызвали. Механизм реализуется оператором Возврат внутри функции: всё, что стоит после этого оператора, становится значением выражения вызова. Например, вызов Сумма = РассчитатьИтог(ТаблицаТоваров); присвоит переменной Сумма именно то, что функция РассчитатьИтог вернула через Возврат.
Понимание возвращаемых значений — база для чтения и написания любого кода на встроенном языке 1С. Практически каждый типовой модуль конфигурации построен на цепочках вызовов: одна функция получает данные, вторая их обрабатывает, третья формирует результат. Если не различать, что функция возвращает, а что нет, легко получить ошибку «Значение не является значением объектного типа» или молчаливо потерять данные.
Материал рассчитан на начинающих разработчиков и продвинутых пользователей, которые дорабатывают типовые конфигурации через расширения или внешние обработки. Разберём отличие функций от процедур, синтаксис оператора Возврат, работу с типами результата, типичные ошибки и способы проверки поведения кода в отладчике.
Функция и процедура: в чём принципиальная разница
Во встроенном языке 1С существует два вида методов: функции и процедуры. Функция объявляется ключевым словом Функция и обязана вернуть значение — либо явно через Возврат Значение;, либо неявно: если оператор Возврат не выполнился ни разу, функция вернёт Неопределено. Процедура объявляется словом Процедура и результата не возвращает в принципе.
Практическое следствие: вызов функции можно вставить в любое выражение — присваивание, условие, параметр другого метода. Вызов процедуры — это всегда отдельный оператор. Попытка написать Результат = МояПроцедура(); приведёт к ошибке компиляции модуля.
Функция ПолучитьСтавкуНДС(Товар) Экспорт
Если Товар.Льгота Тогда
Возврат 0;
КонецЕсли;
Возврат 20;
КонецФункции
Процедура ЗаписатьЛог(Текст) Экспорт
ЗаписьЖурналаРегистрации("Обмен", , , , Текст);
КонецПроцедуры
При доработке типовых конфигураций важно не менять вид метода без необходимости. Если типовая функция используется в десятках мест как часть выражений, превращение её в процедуру сломает все вызовы. Обратная замена безопаснее, но тоже требует проверки: вызов функции как отдельного оператора допустим, однако результат при этом теряется.
Как работает оператор Возврат
Оператор Возврат выполняет две задачи одновременно: немедленно прекращает выполнение функции и передаёт указанное значение наружу. Код, написанный после Возврат в той же ветке выполнения, никогда не выполнится — это частый источник «мёртвого кода» у новичков.
Функция может содержать несколько операторов Возврат в разных ветках условий. Это нормальный и часто предпочтительный стиль: проверили входные данные в начале, вернули результат отказа сразу, а основную логику написали без глубокой вложенности условий. Такой приём называют «ранним выходом».
Если функция завершилась, ни разу не встретив Возврат, она вернёт значение Неопределено. Это не ошибка компиляции — код запустится, но вызывающий модуль получит пустой результат, и дальнейшая логика может отработать некорректно без каких-либо сообщений.
Какие типы данных можно возвращать
Встроенный язык 1С не требует объявлять тип возвращаемого значения: функция может вернуть что угодно — число, строку, булево, дату, ссылку на объект базы, массив, структуру, таблицу значений. Более того, одна и та же функция в разных ветках может вернуть разные типы. Такая гибкость удобна, но требует дисциплины: вызывающий код должен понимать, что именно придёт.
Распространённый приём — возврат структуры, когда нужно отдать несколько значений сразу. Например, функция проверки документа может вернуть структуру с полями Успех, ТекстОшибки, ДанныеДокумента. Это читабельнее, чем возвращать массив с безымянными элементами.
Функция ПроверитьДокумент(Ссылка) Экспорт
Результат = Новый Структура("Успех, ТекстОшибки", Ложь, "");
Если Ссылка.Пустая() Тогда
Результат.ТекстОшибки = "Пустая ссылка";
Возврат Результат;
КонецЕсли;
Результат.Успех = Истина;
Возврат Результат;
КонецФункции
Отдельно стоит помнить о контексте сервера и клиента. Функция, выполняемая на сервере, не может вернуть на клиент мутабельные объекты вроде ТаблицаЗначений или ДеревоЗначений в тонком клиенте — такие типы не сериализуются для передачи. Возвращайте вместо них массивы структур или храните данные во временном хранилище, передавая клиенту только адрес.
Что вернуть с сервера на клиент
Подходит для большинства случаев: сериализуется без ограничений, легко читается в коде
Подходит для больших таблиц и результатов запросов; требует отдельного вызова ПолучитьИзВременногоХранилища на сервере
Не сработает в тонком и веб-клиенте при вызове сервера — вызовет ошибку передачи данных
Как проверить возвращаемое значение при отладке
Самый надёжный способ понять, что реально возвращает функция, — отладчик конфигуратора. Поставьте точку останова на строке с оператором Возврат, запустите отладку и посмотрите значение выражения в табло или через «Вычислить выражение» (Shift+F9). Так вы увидите фактический тип и содержимое результата до того, как он уйдёт в вызывающий код.
Второй контрольный пункт — строка вызова. Поставьте точку останова на следующей строке после вызова функции и проверьте переменную, в которую записан результат. Если там Неопределено, хотя ожидались данные, значит, внутри функции не сработал ни один Возврат со значением — ищите ветку условий, которая «проглотила» выполнение.
Для быстрой проверки без отладки удобно выводить результат через Сообщить() или в журнал регистрации. Это приемлемо для разовой диагностики, но не оставляйте такие вызовы в рабочем коде: в циклах они замедляют выполнение и засоряют журнал.
- 1Поставьте точку останова на операторе Возврат внутри функции
- 2Запустите отладку и воспроизведите сценарий вызова
- 3Через «Вычислить выражение» проверьте тип и содержимое возвращаемого значения
- 4Поставьте точку на строке после вызова и проверьте переменную-получатель
- 5Если получено Неопределено — проверьте, какая ветка условий завершила функцию без Возврат
Типичные ошибки при работе с возвращаемыми значениями
Ошибка номер один — отсутствие Возврат в одной из веток. Функция компилируется, запускается, но в определённых условиях возвращает Неопределено. Проявляется это далеко от источника: например, печатная форма выходит пустой только для документов с определённым видом операции. Проверяйте, что все пути выполнения функции заканчиваются осмысленным Возврат.
Вторая группа ошибок — несоответствие типов. Функция в штатном сценарии возвращает число, а в случае ошибки — строку с текстом. Вызывающий код пытается сложить результат с числом и падает. Правильный подход: согласованный контракт. Либо всегда один тип, либо структура с явным признаком успеха.
Третья частая проблема — игнорирование результата там, где он важен. Например, функция записи объекта возвращает булево «успешно/неуспешно», а вызывающий код просто вызывает её и идёт дальше. Ошибка записи остаётся незамеченной, а данные теряются молча.
Возвращаемые значения в расширениях и типовых модулях
При доработке типовой конфигурации через расширение аннотации &ИзменениеИКонтроль, &Вместо и &После по-разному влияют на результат. С &Вместо ваша функция полностью замещает типовую, и именно вы отвечаете за возвращаемое значение — оно должно соответствовать ожиданиям всех мест вызова типового метода.
При использовании &ИзменениеИКонтроль вы вызываете типовой метод через специальную конструкцию и обязаны вернуть его результат (или осознанно подменённое значение). Потерять Возврат в такой обёртке — значит обнулить результат для всей цепочки вызовов, причём ошибка проявится только в конкретных сценариях.
Практическая рекомендация: перед изменением типовой функции найдите все места её вызова (поиск по имени метода по всей конфигурации) и зафиксируйте, какого типа результат там ожидается. После доработки прогоните хотя бы основные сценарии, где метод участвует: проведение документов, формирование отчётов, обмены.
FAQ: частые вопросы о возвращаемых значениях в 1С
Может ли процедура вернуть значение?
Нет. Процедура по определению не возвращает результат, и использовать её вызов в выражении нельзя — будет ошибка компиляции. Если нужен результат, объявляйте метод функцией. Альтернатива — передача параметра по ссылке через Знач с последующим изменением, но это ухудшает читаемость и считается плохим стилем.
Что вернёт функция, если не написать Возврат?
Значение Неопределено. Компилятор это не считает ошибкой, поэтому проблема всплывёт только в рантайме — обычно в виде некорректной работы вызывающего кода. Полезная привычка: начинать тело функции с объявления переменной результата и заканчивать её одним явным Возврат.
Можно ли вернуть несколько значений из одной функции?
Напрямую — нет, возвращается одно значение. Но оно может быть составным: структура, массив или соответствие. Для нескольких результатов чаще всего используют структуру с именованными полями — такой код проще читать и сопровождать, чем массив с позиционными элементами.
Чем Неопределено отличается от NULL в результате функции?
Неопределено — признак отсутствия значения во встроенном языке, его обычно возвращают функции. NULL — значение из мира запросов, означающее отсутствие данных в поле результата запроса. Сравнивать их нужно по-разному: Неопределено проверяется оператором сравнения, а NULL — функцией ЕСТЬNULL в запросе или методом ЕстьNULL.
Почему функция на сервере не возвращает таблицу значений на клиент?
ТаблицаЗначений и ДеревоЗначений не сериализуются для передачи между сервером и тонким (веб) клиентом. Решения: вернуть массив структур, поместить данные во временное хранилище и вернуть адрес, либо использовать ДанныеФормыКоллекция, если речь идёт о реквизите формы.
Как понять, какой тип возвращает типовая функция конфигурации?
Откройте модуль с функцией в конфигураторе и посмотрите все операторы Возврат. Быстрее — поставить точку останова на вызове и проверить результат в отладчике. Также помогает синтакс-помощник (Ctrl+F1) для методов платформы, но для методов конфигурации надёжнее чтение кода и отладка.
Что важно запомнить
Функция 1С всегда возвращает значение через оператор Возврат, а при его отсутствии — Неопределено; процедура результата не имеет. Согласуйте тип результата между функцией и вызывающим кодом, проверяйте все ветки выполнения и используйте отладчик для контроля фактического значения.